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 : AdvancedFilters2: {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)8: {9: }10:11: public void Created(DateTime? created, MatchType matchType)12: {13: if (!created.HasValue) return;14: AdvancedFilterSet("whenCreated", created.Value, typeof(DateTime), matchType);15: }16: }17:
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)2: {3: const string WhenCreatedDateFormat = "yyyyMMddHHmmss.0Z";4:5: if (!created.HasValue) return;6: AdvancedFilterSet(ClientUser.WhenCreatedPropertyName,7: created.Value.ToUniversalTime().ToString(WhenCreatedDateFormat), typeof (string), matchType);8: }
Once you do this your query filter will spring into life and happily return you results. Well that’s it for now.
Comments
Post a Comment