After a lot of work I’m confident these workflow activities work pretty satisfying therefore I’ve decided to release them to the public but without any guarantees. I wish to send my thanks to Brad Turner and the others at Ensynch that made the great walkthrough in making custom ILM2 activities - http://www.codeplex.com/ILM2WFActivity and to Mark Gabarra that made a video on the subject before he left Microsoft (sad!) - display-name-generation-activity-a-custom-ilm2-action-activity.
The Expression and Destination fields are common for almost all activities except the password generator activity that only have a destination and the Unique name activity that takes more than one expression that are evaluated one at a time. The expression field can take more than one input value and even string values so for example “[//Target/LastName], [//Target/FirstName]” is ok. The destination field only takes a single output of either the “[//WorkflowData/…]” or “[//Target/…]” types.
Update Value Activity
This is the simplest activity in the library, it takes any input and writes it to either the WorkflowDictionary - [//WorkflowData/…] or to a target attribute – [//Target/…]. The main usage for this activity is to write a value created by the Function activity that in RC0 only have the workflow dictionary as working destination.

Activity information configuration
| Display Name |
Cortego Update Value Activity |
| Description |
Updates a Target value from an Expression |
| Activity Name |
Cortego.ILM.Workflow.Activities.UpdateValueActivity |
| Assembly Name |
Cortego.ILM.Workflow.Activities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b88d7150cfc8f36b |
| Authentication, Action, Authorization |
Your choice. |
| Type Name |
Cortego.ILM.Workflow.Activities.UpdateValueActivitySettingsPart |
Normalize Diacritic Characters Activity
This activity is almost the same as the Update Value Activity except it normalizes diacritic characters, for example ÄÖÅÜčȭ becomes AOAUco and this very useful for writing email addresses that can’t contain diacritics. Read more about diacritic characters at http://en.wikipedia.org/wiki/Diacritic.

Activity information configuration
| Display Name |
Cortego Normalize Diacritic Characters Activity |
| Description |
Normalizes Diacritic Characters like ÅÄÖ to AAO. |
| Activity Name |
Cortego.ILM.Workflow.Activities.NormalizeDiacriticCharactersActivity |
| Assembly Name |
Cortego.ILM.Workflow.Activities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b88d7150cfc8f36b |
| Authentication, Action, Authorization |
Your choice. |
| Type Name |
Cortego.ILM.Workflow.Activities.NormalizeDiacriticCharactersActivitySettingsPart |
Regex Replace Activity
This is almost the same as the Update Value Activity as well except it takes a Regular Expression Pattern and an optional replacement value that could be used for removing or replacing invalid characters from attribute values. A good example of this is the Active Directory sAMAccountName attribute that doesn’t support /\[]:;|=,+*?<>@ the regular expression for this would be… “[/:;\|=,\+\*\?<>@\[\]\\]”. If you’re not familiar with Regular Expressions, have a look at http://msdn.microsoft.com/en-us/library/hs600312(VS.71).aspx. The replacement value is used if you wish to replace characters with something else but just leave it empty for removing characters.

Activity information configuration
| Display Name |
Cortego Regex Replace Activity |
| Description |
Uses a Regular Expression to do string replacements. |
| Activity Name |
Cortego.ILM.Workflow.Activities.RegexReplaceActivity |
| Assembly Name |
Cortego.ILM.Workflow.Activities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b88d7150cfc8f36b |
| Authentication, Action, Authorization |
Your choice. |
| Type Name |
Cortego.ILM.Workflow.Activities.RegexReplaceActivitySettingsPart |
Generate Password Activity
This activity generates a strong password with at least one character from each category, upper case characters (A-Z), lower case characters (a-z), numeric characters (0-9) and special characters (!#%&/()=?-:;><@$,._*). It’s recommended that password values are written to a custom target attribute (hidden from UI) instead of directly with an outbound sync rule since the password in that case will end up fully readable in the Expected Rules Entry. Remember that passwords generated with this activity is hard to remember and only suitable as temporary passwords before the users can set it’s own, we don’t want to end up with passwords on paper notes under the keyboard.

Activity information configuration
| Display Name |
Cortego Password Generator Activity |
| Description |
Generates strong passwords. |
| Activity Name |
Cortego.ILM.Workflow.Activities.PasswordGeneratorActivity |
| Assembly Name |
Cortego.ILM.Workflow.Activities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b88d7150cfc8f36b |
| Authentication, Action, Authorization |
Your choice. |
| Type Name |
Cortego.ILM.Workflow.Activities.PasswordGeneratorActivitySettingsPart |
Unique Name Activity
This is the most advanced activity in the library, it works almost the same as the Update Value Activity but there are two main differences, it takes any number of input expressions and the expressions are evaluated against an LDAP catalog from top to bottom and as soon as a unique value is found it’s written to the destination. It currently doesn’t support LDAPS and it has only been tested against Active Directory.

Activity information configuration
| Display Name |
Cortego Unique Name Activity |
| Description |
Generates or takes value before it’s checked for uniqueness against LDAP catalog. |
| Activity Name |
Cortego.ILM.Workflow.Activities.UniqueNameActivity |
| Assembly Name |
Cortego.ILM.Workflow.Activities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b88d7150cfc8f36b |
| Authentication, Action, Authorization |
Your choice. |
| Type Name |
Cortego.ILM.Workflow.Activities.UniqueNameActivitySettingsPart |
As you can see from my previous blog post I’ve removed the normalize diacritics and regex remove functionality and put those functions as separate activities and it’s easy to chain activities, just write your output value (destination) from any activity including the Function activity that comes with ILM2 to the workflow dictionary and use that value as input (expression) value in the next activity.
LDAP Search Activity
This activity doesn’t have any user interface so it can’t be used directly within ILM2 but it’s included in the Unique Name activity. The reason I’ve chosen not to add a UI for it is because it returns a nested dictionary (Dictionary<string, Dictionary<string, object>>) that could be hard to use from other activities but you could of course use it in your own custom activities or workflows.
Summing up
You may freely use the activities and the code in any way but if you use the code without major changes I want you to keep the comment in top of each code file that references my blog and my company. It would also be nice if you could give me some feedback, report any problems and tell me about other cool features that could be useful within the library. Please drop a message if you wish be noticed when changes or additions are made to the library and I already have an interesting activity that will show up within the library soon.
In order to use the code you’ll have to strong name the assembly using your own key before putting it into the GAC and if you aren’t sure how to do that and how to deploy, have a look at the very good document Brad Turner and the other guys at Ensynch published, see link in the beginning of this post.
Download Cortego ILM2 Workflow Activity Library Here