C# LDAP查询返回不正确的结果

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

我正在尝试查询最近一次登录超过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;
我做错了什么


我可以确认
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}))";