Apparently what’s even more difficult than importing data from AD is figuring out how to import multi-value objects from Active Directory. “Description” is an example of a standard AD multi-value field. My client had many custom multi-value fields added to AD and needed to import the data from these fields into tables in a database. You can accomplish this easily this by adding a bit of code to the C# code importing the single value attributes as outlined in my previous post Getting Around AD Paging on SSIS Import.
This C# code is much simpler than trying to import each multi-value field using a Data Flow task. Using Data Flow tasks can be done but it has some tricky problems like importing only those records with values in the multi-value field, working around paging, and how to deal with apparently empty objects that your query returns even though you specified that it only return those objects with values. It’s also quite a bit slower as you need to populate variables and pass those variables to loops to iterate thru the multi-values for one account at a time.
Here is the code for importing one multi-value attribute into a table. This code should be placed at an appropriate spot within the “foreach (SearchResults” loop outlined in the Getting Around AD Paging on SSIS Import post.
string propertyName = “Description”; //or whichever multi-value field you are importing
ResultPropertyValueCollection valueCollection = results.Properties[propertyName];
//Iterate thru the collection for the user and insert each value from the multi-value field into a table
foreach (String sMultiValueField in valueCollection)
string sValue = sMultiValueField.Replace(“‘”, “””); //Replace any single quotes with double quotes
“INSERT INTO User_Descriptions (sAMAccountName,Description) VALUES (‘” + sAMAccountName + “‘,'” + sValue + “‘)”;
reader = cmd.ExecuteReader();
The nice thing about this code is that you can iterate through any records, even if the multi-value field is empty. It won’t fail, it just won’t return a record. This means you can add this same chunk of code multiple times edited for several different multi-value fields within the same script task, and have all your tables updated using the same script. The package is very easy to maintain, with no package variables, no complex package logic, just a simple script. Very elegant!