Поиск 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.
Скриншот http://www.brentpabst.com/capture.png