Over the last couple of days on my current project I have been working with the new account management API found in .NET 3.5 for communicating with active directory. This API is a massive improvement over the features provided by the older directory services and really does make creating, deleting, updating and finding users a lot simpler (for more information checkout http://msdn.microsoft.com/en-us/library/bb299745%28v=VS.100%29.aspx).
As part of the work I needed to provide the ability to find users based on the date they were created so following the approach on MSDN (see http://msdn.microsoft.com/en-us/library/bb384372.aspx) I extended the “AdvancedFilters” class and added my own method for setting a filter for a query using the active directory property “whenCreated”. I should say this property stores the date and time a user is created with AD. Now the code shown below is what I first came up with and it looks like it will do the job right?
1: public class SearchFilter : AdvancedFilters
3: /// <summary>
4: /// Initializes a new instance of the <see cref="SearchFilter"/> class.
5: /// </summary>
6: /// <param name="p"></param>
7: public SearchFilter(Principal p) : base(p)
11: public void Created(DateTime? created, MatchType matchType)
13: if (!created.HasValue) return;
14: AdvancedFilterSet("whenCreated", created.Value, typeof(DateTime), matchType);
Well sadly no. As it turns out the “whenCreated” property in AD is stored as a string in the generalised time format (see http://msdn.microsoft.com/en-us/library/ms680924%28VS.85%29.aspx). Because of this telling the advanced filter set that it’s a date just doesn’t work and you will find as I did no results are returned. So how do you get this to work then? Well all we need to do is update our “Created” method a bit so the advanced filter set thinks it is dealing with a string and then just pass in the date in the correct generalised date format which is “yyyyMMddHHmmss.0Z”.
[Updated code which now correctly sets the type and formats it]
1: public void Created(DateTime? created, MatchType matchType)
3: const string WhenCreatedDateFormat = "yyyyMMddHHmmss.0Z";
5: if (!created.HasValue) return;
7: created.Value.ToUniversalTime().ToString(WhenCreatedDateFormat), typeof (string), matchType);
Once you do this your query filter will spring into life and happily return you results. Well that’s it for now.