So just how fast is your JavaScript conversion tool?

People have asked that question and I don't know why, but it's been a very long time since I've actually looked at the numbers behind the JavaScript conversion process that the CRM Migration Assistant performs.  I was using an internal timer as part of the development process but the data was never exposed.

So today I got to thinking about it and after moving around a small bit of code, I have some numbers.

This is from a real-life CRM project that I worked on for almost two years:

Files: 144, Lines of JavaScript: 7,408, Conversion time: 00:00.65

This is for the actual conversion process itself, not for any work related to extracting customizations or writing those customizations back to disk.

And yes, that is 0.65 seconds.

The reason I hadn't bothered with the timing is because just about any conversion I've ever run has always taken one minute or less so I never worried about it.

I'll be adding more of this type of information to the product documentation but in the mean time, if you are having to justify the cost, just look those numbers over one more time then ask yourself if you can afford not to have a tool like this in your back pocket. Or thumb drive, etc.  ( You get the idea. )

CRM 2011: Exploring the Developer Resources Page

CRM 2011 includes a Developer Resources page which provides additional information and tools for the CRM developer.

You find the page by navigating to: Settings, Customizations, Developer Resources, where the following page is display:


So, how can I use this information?


Organization Unique Name

The Unique Name for an organization is the internal name or the database name that was assigned when you created the organization. This name is sometimes required by applications that connect to your CRM organization to perform operations.

Note: This screen shot is from one of my CRM Online organizations. The Organization Unique Name for an on-premise installation will be more human-readable.

Windows Azure AppFabric Issurer Certificate

If you will be performing any work using the Windows Azure AppFabric, you’ll need to install a certificate that used during the authentication process.


Developer Center

In the CRM Development Center you can find links to tools, training materials, blogs, and the community forums. In a nutshell, it is the central location to find all things CRM-developer-related.


Discovery Service Endpoint

If you will be working with multiple CRM organizations, you’ll need to establish a connection to the CRM Discovery service which will return to you a list of organizations that your security credentials have access to.  More information may be found here.


Organizational Service Endpoint

The Organizational Service is the main API for interacting programmatically with CRM 2011. This is what you connect to in order to perform any create, read, update, delete, or other operation against the CRM data.  More information may be found here.


Organizational Data Service

The Organizatoin Data Service is similar to Organizational Service but it is restricted to Create, Read, Update, and Delete operations only.  More information may be found here.

Free Utility Released: Export CRM 4.0 Plugins

Updated: 9/30/2011. Version 1.1

Occasionally I find the need to extract a plugin from the CRM database. This could be caused by a variety of reasons:

  • The person or vendor who wrote the program is no longer working with your company and you have no idea what the plugin does ( believe me, this happens ).
  • You are having issues with a plugin and you need to review the code of the plugin that has been registered to verify that it was built the way you intended.
  • You are preparing to move to Dynamics CRM 2011 and you need to verify that your plugin assemblies will work well in CRM 2011.



CRMExtractPlugins [serverurl] [organizationName] /L

It uses the security credentials of the currently logged-in user so you must be a CRM system administrator for it to work properly.

the /L parameter will extract just the names of the plugins within the system and place them into a file called [organizationName]-plugins.txt which can be found inside the folder that is created by the export process.



CRMExtractPlugins http://crm contoso

CRMExtractPlugins http://crm contoso /L


You may download it here.

Connecting Windows Live Writer and Outlook

I use Windows Live Writer (WLW) to compose my blog posts and quite frankly, it is the main reason I write such detailed articles.  It connects directly to my WordPress-based blog and uploads posts, along with their associated images, with a single button-click.

One of the things that I like about the combined WLW/WordPress is the ability to publish articles in the future.

A bit of background

One of the interesting things about this blog is that most of my readers visit during the work week, as you can see from this graph:


Given that set of circumstances, I decided to not publish blog articles on the weekends, unless something extraordinary occurred. I also try to only post one article per day, if I can help it.

So my usual practice is to make note of article ideas then take some time out of one of my days to create several articles an set their publish date to sometime in the future.

The problem

Future publishing is all well and good, but it sometimes becomes hard to track what days I already have articles scheduled.

I have to open up the blog, go to the Posts section of the administrative interface, and review what is publishing when.

The solution

There had to be a better solution that didn’t require any manual labor.  That solution, it turns out, was to create a Windows Live Writer plugin that would create a calendar appointment whenever I published an article for future release.

Let us walk through the solution, step by step.

Step 1: Configuring Outlook

The first thing you need to do is create a custom category for your blog.

1) Open your calendar.

2) Click the Categorize button

3) Select All Categories.


This will display the Color Categories dialog:


4) Create a new category by clicking the New button.

5) Enter the name of the Category and choose a color:


The Category Name needs to be the exact name of your blog, as defined within WLW.

6) Click OK twice, to save the new category.

Note: if you look at my categories, you will notice that I have one category for each of the blogs that I own. This allows me to differentiate the blog posts by color and name. ( I’ll show you how later ).


Step 2: Install the Windows Live Writer plugin



You must have Windows Live  Writer 2011 and Microsoft Outlook installed on the same machine for this process to work correctly. 

I am using Outlook 2010, but I think it will work equally as well with Outlook 2007. But, I have no way to test it, so if it doesn’t work, then please let me know.

To help me with this process, I have created a WLW plugin, that will automatically create a calendar appointment.

1) Download and unzip the Create Calendar Item plugin.

2) Exit WLW if you have it running.

3) Assuming a default installation location, place the plugin WLWCreateCalendarItemPlugin.dll into the following folder:

C:\Program Files\Windows Live\Writer\Plugins

4)  Start WLW.

5) Click the Blog Account tab.

6) Click the Blog options button

7) Click Plug-ins to display the list of plugins:


8) Make sure the checkbox beside Add to Outlook Calendar is checked.

9) Click OK.


Verify your work

1) Create a blog post, then set the post date and time. If you’ve never noticed, it is the dropdown in the upper-right corner of the editing window:


2) Publish your post.

Note: A calendar appointment will not be created if the article is being published on the date it was written.

3) After the post has been published, open your Outlook calendar and navigate to the date you specified in step 1. You should see an appointment that looks like this:


4) Open the appointment that was created and you should see something like this:


The appointment has the following characteristics:

  • The category is listed at the top of the appointment showing both the category color and name.  The name is, of course, the name of your blog.
  • The subject is the blog article title
  • The appointment is an all-day event
  • The time of the appointment is shown as Free. This denotes a reminder more than something to do.



I think this small addition to WLW will make my blogging life much easier – especially since I now have several blogs to maintain. 

If you end up installing and using it, please let me know your experiences.

While I will probably write another blog article on how I created the WLW plugin, my wife thinks I should sell the source code for $20.  I’m still debating that one. Smile

CRM SDK Nugget: SolutionId Value for the Active Solution

I’ve been working with solutions and web resources a lot lately so this next series of articles will focus on Solutions and Web Resources.

Importing an object into the Default/Active solution

Let’s pretend for a moment that you’re writing a utility that maybe converts your JavaScript from the CRM 4.0 object model into the CRM 2011 object model. Someone, at some point, is going to want to have that newly-converted code reside inside of CRM 2011 without a lot of manual labor.

Actually, it would be really neat if the tool could just import it directly as part of the post-conversion process.

This is actually not a huge issue since JavaScript Web Resources are database records like any other record within CRM.

The issue lies in the fact that Web Resources reside inside of a Solution, so you must know which solution to either query against or write to.

Normally, this would require you to query the solutions within an Organization to locate the solution you wish to use.  But what if you want to use the Default solution?

Lucky for us, it turns out the Default solution actually has a consistent SolutionId which will be the same across any CRM installation.

I found this little nugget in the CRM 2011 SDK, here. Let’s review the data:

We actually have two pre-defined SolutionIds:

Name Default



The Default solution does not contain any solution components. It contains references to all the managed and unmanaged solution components in the system.

Name Active



The Active solution represents the current published unmanaged customizations that define the behavior of the application.


The Default SolutionId, in all honesty, is mostly for reference, or so it seems to me.

The Active SolutionId is the one that you would use as a reference to query or insert objects into the Default solution.

Once an object, say a Web Resource, has been installed in the Default solution, can you always add it to other solutions using the Add Existing functionality of the solution explorer.

This may not seem like much, but it will save you at least one query to get the Default SolutionId and any time you can reduce the amount of code you have, the better.