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