我正在尝试创建一个ldap查询来搜索Active Directory并过滤结果,只返回具有值超过30天的lastLogonTimestamp字段的用户。
我正在寻找的ldap过滤器是这样的:
"(&(ObjectClass=User)(lastLogonTimestamp<=" + lastLogonTimeStampLimit + "))"
我的问题是我无法找到任何方法将.net DateTime值转换为Active Directory中lastLogonTimestamp字段的正确格式,我读过这个格式是'Integer8'数据类型。
如果它有帮助,我发现转换是另一种方式:
DateTime.FromFileTime((long)(user.Properties["lastLogonTimestamp"][0]))
答案 0 :(得分:0)
此代码用于将AD对象转换为有效的DateTime。您可以将它用于AD中的任何日期值(此示例适用于lastLogon)。关键似乎是ActiveDs库。 long
演员似乎不起作用,但IADsLargeInteger
确实很好!
以下是一个代码示例,其中包含从AD类型转换为DateTime所需的所有内容:
using System.DirectoryServices;
using System.DirectoryServices.AccountManagement;
using ActiveDs; // Namespace added via ref to C:\Windows\System32\activeds.tlb
private DateTime? getLastLogin(DirectoryEntry de)
{
Int64 lastLogonThisServer = new Int64();
if (de.Properties.Contains("lastLogon"))
{
if (de.Properties["lastLogon"].Value != null)
{
try
{
IADsLargeInteger lgInt =
(IADsLargeInteger) de.Properties["lastLogon"].Value;
lastLogonThisServer = ((long)lgInt.HighPart << 32) + lgInt.LowPart;
return DateTime.FromFileTime(lastLogonThisServer);
}
catch (Exception e)
{
return null;
}
}
}
return null;
}