Срок действия пароля .NET Active Directory в Windows 2008 - PullRequest
3 голосов
/ 12 марта 2010

Поиск 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

1 Ответ

2 голосов
/ 12 марта 2010

Время истечения срока действия пароля сохраняется таким образом, что если значение lastPwdSet - maxPwdAge < DateTime.UtcNow равно true, то срок действия вашего пароля истек. Таким образом, если вы установили свой пароль неделю назад, но срок действия пароля истечет через 10 дней, левая сторона будет (DateTime.UtcNow - 7) - (-10), или DateTime.UtcNow - 7 + 10, или DateTime.UtcNow + 3, что не меньше DateTime.UtcNow, поэтому ваш пароль не истечет.

Это означает, что установка maxPwdAge в long.MinValue эффективно даст вам тысячи лет до истечения срока действия вашего пароля. Поэтому, если вы получаете long.MinValue, ваша политика гласит, что срок действия паролей не истечет. Вы должны просто найти это значение и обработать его должным образом, возможно, так:

private long GetAbsValue(object longInt)  // poorly named
{
    long val = (long)longInt;
    if (val == long.MinValue)
        return long.MaxValue;
    return Math.Abs((long)longInt);  
}

Кроме того, я должен отметить, что значения хранятся с шагом 100 наносекунд, поэтому вы должны ожидать значения в миллиардах.

...