LDAP查询返回不正确的结果

时间:2018-01-15 22:29:22

标签: c# active-directory ldap

我正在尝试查询上次登录超过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日)。

1 个答案:

答案 0 :(得分:2)

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

var date = DateTime.Today.AddDays(-30);
var filetime = date.ToFileTime();

/* ... */

directorySearch.Filter = $"(&(objectClass=user)(lastLogonTimestamp<={filetime}))";