C# LDAP查询返回不正确的结果
我正在尝试查询最近一次登录超过30天前的所有用户:C# LDAP查询返回不正确的结果,c#,active-directory,ldap,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(pa
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;
我做错了什么
我可以确认
date
值确实包含30天前(本例中为2017年12月17日)的日期。ActiveDirectory中的lastLogon
属性是一个64位整数,表示从1601年1月1日起的100纳秒间隔计数的日期。此定义恰好与WinApi相同。请注意,这与从0001年1月1日开始的滴答声的定义不同。因此,
var date = DateTime.Today.AddDays(-30);
var filetime = date.ToFileTime();
/* ... */
directorySearch.Filter = $"(&(objectClass=user)(lastLogonTimestamp<={filetime}))";
var date=DateTime.Today.AddDays(-30);
var filetime=date.ToFileTime();
/* ... */
directorySearch.Filter=$”(&(objectClass=user)(lastLogonTimesTamp)感谢您提供的dlatikay-您知道是否有一个从ticks到该格式的简单转换吗?ticks到filetime?这将是var filetime=new DateTime(ticks).ToFileTime()
。调整了我的答案,所以现在应该不会那么混乱了。我们可以直接从日期到文件时间,而不必往返
var date = DateTime.Today.AddDays(-30);
var filetime = date.ToFileTime();
/* ... */
directorySearch.Filter = $"(&(objectClass=user)(lastLogonTimestamp<={filetime}))";