12
    public static string GetProperty(SearchResult searchResult, string PropertyName)
    {
        if (searchResult.Properties.Contains(PropertyName))
        {
            return searchResult.Properties[PropertyName][0].ToString();
        }
        else
        {
            return string.Empty;
        }
    }

上述方法适用于大多数 Active Directory 属性,但与日期/时间相关的属性除外,例如 pwdLastSet、maxPwdAge 等。

我的问题是如何将 pwdLastSet 设置为人类可读的日期时间(如 2013 年 8 月 13 日或 2013 年 8 月 13 日等)

我已经尝试过了,但它引发了异常

public static Int64 ConvertADSLargeIntegerToInt64(object adsLargeInteger)
{
    var highPart = (Int32)adsLargeInteger.GetType().InvokeMember("HighPart", System.Reflection.BindingFlags.GetProperty, null, adsLargeInteger, null);
    var lowPart = (Int32)adsLargeInteger.GetType().InvokeMember("LowPart", System.Reflection.BindingFlags.GetProperty, null, adsLargeInteger, null);
    return highPart * ((Int64)UInt32.MaxValue + 1) + lowPart;
}

我正在使用以下代码将时间作为 Int64

Int64 passwordLastSet = ConvertADSLargeIntegerToInt64(objResult.Properties["pwdLastSet"][0]);

然后我打算使用 DateTime(Int64) 构造函数来创建一个 DateTime

4

2 回答 2

15

根据MSDN 文档

此值存储为一个大整数,表示自 1601 年 1 月 1 日 (UTC) 以来的 100 纳秒间隔数。

如此处所述DateTime.FromFileTimeUtc,这与 完全一致。

而且我不确定您为什么觉得需要对整数进行低级操作。我想你可以直接施放它。

所以就这样做:

long value = (long)objResult.Properties["pwdLastSet"][0];
DateTime pwdLastSet = DateTime.FromFileTimeUtc(value);
于 2013-09-04T16:21:38.243 回答
2

您可以像馅饼一样简单地以人类可读的形式获取目录用户的最后密码设置日期。为此,您可以使用命名空间中类的可为空LastPasswordSet属性。 UserPrincipalSystem.DirectoryServices.AccountManagement

如果User must change password at next logon选中选项,则LastPasswordSet属性返回null值。否则,它会返回最后一次在 type 中设置密码的日期和时间DateTime

using(PrincipalContext context = new PrincipalContext(ContextType.Domain))
{
    UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, Username);
    //? - to mark DateTime type as nullable
    DateTime? pwdLastSet = (DateTime?)user.LastPasswordSet;
    ...
}

MSDN:用户主体
MSDN:LastPasswordSet

于 2016-07-16T15:49:45.423 回答