1

カスタム属性lastLogonTime構文を追加しました: UTC Coded Time. クラスを拡張UserPrincipalして、そのカスタム属性を GET/SET しました。

ここに画像の説明を入力

...
[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.GreaterThanMatchType.Equals。それらのどれも結果を返していませんが、それらの基準に一致するユーザーがいます.

機能する唯一のフィルターは

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

しかし、これは基本的にすべてのユーザーを返しています。検索結果が結果を返さない理由はありますか?

私の目標は、最終ログオン時間が日未満のすべてのユーザーを検索することですX

それらのユーザーを獲得する限り、私は他のソリューションに対してオープンです。

PS私はこれを回避する方法を知っています。すべてのユーザーをループし、それらlastLogonTimeを取得してから比較しますが、それは私がやっていることのやり過ぎです。

4

1 に答える 1

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);
}

これが誰かに役立つことを願っています。

于 2015-08-15T04:15:38.087 に答える