Как преобразовать Active Directory pwdLastSet в дату/время

    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 для чтения человеком datetime (например, 8/13/2013 или 13 августа 2013 года и т. д.)

Я пробовал это, но он бросил исключения

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

2 ответов


по данным документация MSDN:

это значение хранится как большое целое число, представляющее число 100 наносекундных интервалов с 1 января 1601 года (UTC).

это идеально согласуется с DateTime.FromFileTimeUtc, как описано здесь.

и я не уверен, почему вы чувствуете необходимость, чтобы сделать низкоуровневые операции целочисленного. Я думаю, ты можешь просто бросить его.

Так Просто do:

long value = (long)objResult.Properties["pwdLastSet"][0];
DateTime pwdLastSet = DateTime.FromFileTimeUtc(value);

вы можете получить последнюю дату набора пароля пользователя каталога в удобочитаемой форме так же легко, как пирог. Для этого вы можете использовать nullable LastPasswordSet собственность UserPrincipal класс System.DirectoryServices.AccountManagement пространство имен.

если включен LastPasswordSet возвращает собственность null значение. В противном случае он возвращает последнюю дату и время, когда пароль был установлен в типе 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: UserPrincipal
в MSDN: LastPasswordSet