按日期时间自定义属性搜索 Active Directory (AD LDS)

Posted

技术标签:

【中文标题】按日期时间自定义属性搜索 Active Directory (AD LDS)【英文标题】:Search Active Directory (AD LDS) by DateTime custom attribute 【发布时间】:2015-08-12 18:02:37 【问题描述】:

我添加了自定义属性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 天的用户。

只要我能吸引到这些用户,我愿意接受其他解决方案。

附注我确实知道解决这个问题的方法。遍历所有用户,获取他们的lastLogonTime,然后进行比较,但这对我正在做的事情来说太过分了。

【问题讨论】:

【参考方案1】:

在这个问题上花费了一些时间后,我发现了问题。

正如我在帖子中提到的,自定义属性 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);

希望这对某人有所帮助。

【讨论】:

以上是关于按日期时间自定义属性搜索 Active Directory (AD LDS)的主要内容,如果未能解决你的问题,请参考以下文章

LdapContext.search() 不返回自定义 Active Directory 属性

Rails 5.2 Active Storage 添加自定义属性

如何在登录时在 JWT 令牌中从 Azure Active Directory 传递自定义扩展属性?

如何填充 Azure Active Directory B2C 用户自定义用户属性?

按日期和字符对核心数据属性进行排序

Woocommerce 集团订单总额按自定义字段日期