Искал SO и везде, включая руководство разработчиков .net по программированию служб каталогов - безуспешно.
Я пытаюсь создать простую веб-страницу сброса пароля, которая позволяет пользователю изменить свой пароль. Часть кода смены пароля работает нормально. Для пользователей я также хотел бы показать, когда истечет срок действия их текущего пароля.
Используя пример кода из книги, упомянутой выше, я смог получить всю настройку кода, однако возвращаемый атрибут всегда равен Long.MinValue и, следовательно, не может быть инвертирован в положительное число, плюс это означает, что он не нашел правильная настройка домена.
Есть ли у кого-нибудь пример кода или ссылки для получения срока действия пароля в среде домена Windows 2008 или R2, где политики паролей могут быть разными для каждого пользователя?
Обновлено для включения кода
Конструктор, который получает объект политики:
public PasswordExpires()
{
//Get Password Expiration
Domain domain = Domain.GetCurrentDomain();
DirectoryEntry root = domain.GetDirectoryEntry();
using (domain)
using (root)
{
this.policy = new DomainPolicy(root);
}
}
Конструктор политики домена:
public DomainPolicy(DirectoryEntry domainRoot)
{
string[] policyAttributes = new string[] {
"maxPwdAge", "minPwdAge", "minPwdLength",
"lockoutDuration", "lockOutObservationWindow",
"lockoutThreshold", "pwdProperties",
"pwdHistoryLength", "objectClass",
"distinguishedName"
};
//we take advantage of the marshaling with
//DirectorySearcher for LargeInteger values...
DirectorySearcher ds = new DirectorySearcher(
domainRoot,
"(objectClass=domainDNS)",
policyAttributes,
SearchScope.Base
);
SearchResult result = ds.FindOne();
//do some quick validation...
if (result == null)
{
throw new ArgumentException(
"domainRoot is not a domainDNS object."
);
}
this.attribs = result.Properties;
}
Вызовите этот метод, чтобы получить срок действия пароля:
public TimeSpan MaxPasswordAge
{
get
{
string val = "maxPwdAge";
if (this.attribs.Contains(val))
{
long ticks = GetAbsValue(
this.attribs[val][0]
);
if (ticks > 0)
return TimeSpan.FromTicks(ticks);
}
return TimeSpan.MaxValue;
}
}
Код здесь дает сбой, потому что он не может преобразовать Long.MinValue, чего не должно быть в первую очередь.
private long GetAbsValue(object longInt)
{
return Math.Abs((long)longInt);
}
Вот вывод и значения отладчика. Согласно сайту MSDN, исключение переполнения вызвано минимальным значением. Мои числа соответствуют примерам для minvalue.
long.MinValue
? - person Gabe   schedule 12.03.2010Abs
? Это не имеет смысла. - person Gabe   schedule 12.03.2010adfind
,ldife
илиldp
, сообщает вам об этом свойстве? - person Gabe   schedule 12.03.2010