Как преобразовать 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 8

2 ответа:

Согласно документации MSDN:

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

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

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

Так что просто сделайте:

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

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

Если опция User must change password at next logon включена, то свойство 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