Как преобразовать 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
, как описано здесь .И я не уверен, почему вы чувствуете необходимость выполнять низкоуровневую манипуляцию целым числом. Я думаю, вы могли бы просто бросить его.
Так что просто сделайте:
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; ... }