2015-08-12 3 views
1

Я добавил пользовательский атрибут lastLogonTime синтаксис: UTC Coded Time. Я добавил UserPrincipal класс GET/SET для этого настраиваемого атрибута.Поиск Active Directory (AD LDS) по пользовательскому атрибуту DateTime

enter image description here

... 
[DirectoryProperty("lastLogonTime")] 
public DateTime? LastLogonTime 
{ 
    get 
    { 
     object[] result = this.ExtensionGet("lastLogonTime"); 
     if (result != null && result.Count() > 0) return (DateTime?)result[0]; 
      return null; 
    } 
    set 
    { 
     this.ExtensionSet("lastLogonTime", value); 
    } 
} 
... 

Я также расширил AdvancedFilters, чтобы иметь возможность осуществлять поиск по этому настраиваемого атрибута.

MyUserPrincipalSearch searchFilter; 

new public MyUserPrincipalSearch AdvancedSearchFilter 
{ 
    get 
    { 
     if (null == searchFilter) 
      searchFilter = new MyUserPrincipalSearch(this); 
     return searchFilter; 
    } 
} 

public class MyUserPrincipalSearch: AdvancedFilters 
{ 
    public MyUserPrincipalSearch(Principal p) : base(p) { } 
    public void LastLogonTime (DateTime? lastLogonTime, MatchType mt) 
    { 
    this.AdvancedFilterSet("lastLogonTime", lastLogonTime.Value, typeof(DateTime?), mt); 
    } 
} 

Теперь я хотел бы поиск по всем пользователям, кто имеет lastLogonTime менее day.

using (PrincipalContext ctx = ADLDSUtility.Users) 
{ 
    MyUserPrincipal filter = new MyUserPrincipal(ctx); 
    filter.AdvancedSearchFilter.LastLogonTime((DateTime.Now - new TimeSpan(1,0,0,0,0)), MatchType.LessThan); 
    PrincipalSearcher ps = new PrincipalSearcher(filter); 
    foreach (MyUserPrincipal p in ps.FindAll()) 
    { 
     //my custom code 
    } 
} 

Этот поиск не дал мне никаких результатов. У меня есть тестовые пользователи, которые не вошли в систему за последние пару дней.

Я пробовал MatchType.GreaterThan, MatchType.Equals. Ни один из них не возвращает никаких результатов, но есть пользователи, которые соответствуют этим критериям.

Единственный фильтр, который делает работу является

filter.AdvancedSearchFilter.LastLogonTime(DateTime.Now , MatchType.NotEquals); 

Но это в основном возвращение всех пользователей. Любые идеи, почему мой результат поиска не возвращает никаких результатов?

Моя цель состоит в том, чтобы найти всех пользователей, у которых последнее время входа в систему меньше X дней.

Я открыт для других решений, пока я получаю этих пользователей.

P.S. Я знаю способ обойти это. Пройдите через всех пользователей, получите их lastLogonTime, а затем выполните сравнение, но это просто лишний раз за то, что я делаю.

ответ

0

Проведя иногда по этому вопросу, я нашел проблему.

Как я уже упоминал в своем сообщении, пользовательский атрибут lastLogonTime имеет синтаксис: UTC Coded Time. Однако дата и время не сохраняются как DateTime. Это на самом деле получить хранятся как string в этом формате:

yyyyMMddHHmmss.0Z

Как я в конечном итоге решение этой проблемы является модификацией моих AdvancedSearchFilter.LastLogonTime поиска по отформатированной строке.

public void LastLogonTime (DateTime? lastLogonTime, MatchType mt) 
{ 
    const string lastLogonTimeFormat = "yyyyMMddHHmmss.0Z"; 
    this.AdvancedFilterSet("lastLogonTime", lastLogonTime.Value.ToUniversalTime().ToString(lastLogonTimeFormat), typeof(string), mt); 
} 

Надеюсь, это поможет кому-то.