【问题标题】:LDAP Query returns incorrect resultsLDAP 查询返回不正确的结果
【发布时间】:2018-01-16 06:59:31
【问题描述】:

我正在尝试查询上次登录时间超过 30 天的所有用户:

var date = DateTime.Today.AddDays(-30).Ticks.ToString();

using (var parentEntry = new DirectoryEntry($"LDAP://{Environment.UserDomainName}/OU=Company,DC=DOMAIN,DC=COM"))
using (var directorySearch = new DirectorySearcher(parentEntry))
{
    directorySearch.Filter = $"(&(objectClass=user)(lastLogonTimestamp<={date})(!userAccountControl:1.2.840.113556.1.4.803:=2))";
    directorySearch.SearchScope = SearchScope.Subtree;

查询确实返回了一堆启用的用户,但他们的 lastLogonTimestamp 值不超过 30 天前。

例如,这里是一些返回日期的示例:

11/01/2018 8:43:17 PM

14/01/2018 5:14:26 PM

13/01/2018 10:53:58 AM

15/01/2018 9:00:27 AM

15/01/2018 10:36:02 AM

15/01/2018 12:07:02 PM

我做错了什么?

我可以确认 date 值确实包含 30 天前的日期(在本例中为 2017 年 12 月 17 日)。

【问题讨论】:

    标签: c# active-directory ldap


    【解决方案1】:

    ActiveDirectory 中的lastLogon 属性是一个 64 位整数,将日期表示为自 1601 年 1 月 1 日以来 100 纳秒间隔的计数。此定义恰好与 WinApi uses for file times 相同。请注意,这与从 0001 年 1 月 1 日开始的刻度的定义不同。因此,

    var date = DateTime.Today.AddDays(-30);
    var filetime = date.ToFileTime();
    
    /* ... */
    
    directorySearch.Filter = $"(&(objectClass=user)(lastLogonTimestamp<={filetime}))";
    

    【讨论】:

    • 感谢 dlatikay - 你知道是否有一个简单的从刻度到任何格式的转换?
    • 标记到文件时间?那将是var filetime = new DateTime(ticks).ToFileTime()。调整了我的答案,所以现在应该不那么混乱了。我们可以直接从日期到文件时间,无需滴答声往返
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多