0

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

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

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

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

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

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

1 回答 1

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;
}
于 2016-02-23T22:08:43.307 回答