将DateTime值转换为Integer8以进行Active Directory查询

时间:2013-03-13 13:56:41

标签: c# active-directory

我正在尝试创建一个ldap查询来搜索Active Directory并过滤结果,只返回具有值超过30天的lastLogonTimestamp字段的用户。

我正在寻找的ldap过滤器是这样的:

"(&(ObjectClass=User)(lastLogonTimestamp<=" + lastLogonTimeStampLimit + "))"

我的问题是我无法找到任何方法将.net DateTime值转换为Active Directory中lastLogonTimestamp字段的正确格式,我读过这个格式是'Integer8'数据类型。

如果它有帮助,我发现转换是另一种方式:

DateTime.FromFileTime((long)(user.Properties["lastLogonTimestamp"][0]))

1 个答案:

答案 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;
}