2010-03-12 3 views
3

Искал SO и везде, в том числе .net разработчиков, руководство по каталогу службы каталогов - не повезло.Истечение срока действия .NET Active Directory в Windows 2008

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

Используя пример кода из книги, упомянутой выше, я смог получить все настройки кода, однако возвращаемый атрибут всегда равен 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); 
     } 
    } 

политики домена Constructor:

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.

Screenshot http://www.brentpabst.com/capture.png

+0

Истечение срока действия пароля является групповой политикой, не так ли? – zneak

+0

@gabe Обновлен для включения кода. Все, что у вас есть, полезно. @zneak управляется с помощью групповой политики, но отображается через LDAP и другие механизмы. –

+0

Как вы знаете, что это не удается из-за получения 'long.MinValue'? – Gabe

ответ

2

раз истечения срока действия пароля, хранятся таким образом, что если lastPwdSet - maxPwdAge < DateTime.UtcNow верно, то ваш пароль просрочен. Поэтому, если вы установили свой пароль неделю назад, но срок действия пароля истечет через 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 наносекунд, поэтому следует ожидать значений в миллиарды.

Смежные вопросы