Проверьте поле «Пользователь должен сменить пароль» в .Net 3.5 - PullRequest
3 голосов
/ 17 ноября 2009

Я пытаюсь выполнить некоторые основные задачи по управлению пользователями AD в C #, используя .Net 3.5

У меня есть объект System.DirectoryServices.AccountManagement.UserPrincipal, который содержит сведения о пользователе.

Я могу позвонить user.ExpirePasswordNow(), и пользователь будет вынужден изменить свой пароль при следующем входе в систему (а в графическом интерфейсе «Пользователи и компьютеры Active Directory» установлен флажок «Пользователь должен изменить пароль при следующем входе в систему»).

Однако я хочу проверить состояние этого свойства и воздействовать на него - я не хочу просто всегда устанавливать его в true с помощью функции ExpirePasswordNow(). Как я могу это сделать?

Я нашел примеры, указывающие на то, что я обращаюсь к базовому DirectoryEntry и его pwdLastSet свойствам - но это выглядит как непроницаемая система. Тип ComObject - это, вероятно, IADsLargeInteger, но я не могу привести к этому типу из-за его "уровня защиты" .

Я в растерянности - кто-нибудь может помочь?

Ответы [ 2 ]

6 голосов
/ 17 ноября 2009

Я помню, что мне приходилось узнавать, когда пользователь последний раз устанавливал свой пароль, но я никогда не использовал его. Надеюсь, это поможет ... и я никогда не пробовал атрибут UserAccountControl, но он выглядит не слишком безумно.

Атрибут последнего набора Pwd

Если это значение установлено на 0 , а атрибут User-Account-Control не содержит флаг UF_DONT_EXPIRE_PASSWD, то пользователь должен установить пароль при следующем входе в систему.

Проверьте User-Account-Control, кто-то включил пример того, как читать только этот флаг (как часть запроса). Вероятно, лучше просто добавить атрибут к «подлежащему возврату», если это возможно.


Я думаю, что это должно работать в 3.5. Они сделали это еще проще. Я не могу заставить объект DirectorySearcher возвращать мне флаги UserAccountControl, только это. Возможно, вот и разрешения, не знаю ...

Imports System.DirectoryServices.AccountManagement

Dim pctx = New PrincipalContext(AccountManagement.ContextType.Domain)
Dim p = UserPrincipal.FindByIdentity(pctx, "andrew")
If p.LastPasswordSet.HasValue = False Then
    If p.PasswordNeverExpires = False Then
        Console.WriteLine("You should have to enter a password next time!")
    End If
End If
0 голосов
/ 17 ноября 2009

Это может помочь:

Утилита для истечения срока действия пароля

У меня возникли проблемы с поиском бесплатной утилиты что бы отправлять сотрудникам электронные письма до того, как их пароли Windows были готов истечь, поэтому я написал C # консольное приложение, которое делает это.

...