Противоречивые значения из Active Directory относительно срока действия пароля - PullRequest
0 голосов
/ 04 июля 2018

Я использую Powershell для определения срока действия пароля для учетных записей домена. Я использовал следующую команду для получения этой информации:

Get-ADUser -Filter {SamAccountName -eq "<username>"} -Properties "DisplayName" , "msDS-UserPasswordExpiryTimeComputed"

Затем я преобразовываю это значение в значимую дату, используя:

[datetime]::FromFileTime(<computed filetime from above command>)

Это прекрасно работает для всех доменов, которые я использую, кроме одного. В этом домене я получаю значение 9223372036854775807 как msDS-UserPasswordExpiryTimeComputed. Я не могу использовать функцию FromFileTime для преобразования этого числа в дату. Выкидывает как ошибку. После исследования я обнаружил, что это число означает, что пароль установлен не истекает. Однако я знаю, что срок действия паролей в этом домене истекает. Кроме того, свойство PasswordNeverExpires из командлета Get-ADUser отображается как False.

Как получить атрибут 9223372036854775807 из msDS-UserPasswordExpiryTimeComputed и получить False из свойства PasswordNeverExpires? Это кажется противоречием. Что мне не хватает? Существуют ли другие ситуации, когда msDS-UserPasswordExpiryTimeComputed тоже может быть 9223372036854775807? Спасибо.

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

У меня нет постоянного тока для тестирования, но теоретически это может сработать.

  1. Получить политику паролей домена с Get-ADDefaultDomainPasswordPolicy -Identity Domain.com

  2. Получите свойство passwordLastSet такого пользователя, как это: (Get-ADUser -Identity <UserName> -Properties *).PasswordlastSet и преобразуйте в соответствующий [datetime] объект на основе культуры домена: Ref Get-Culture. DateTime формат может изменяться в зависимости от региональных настроек, таких как США и Великобритания.

  3. Теперь, когда у вас есть passwordpolicy, скажем, 60 дней, и passwordlastset дата, можно просто вычислить, истекает ли срок действия пароля.

Кроме того, на серверах 2016 года вы также можете использовать что-то вроде:

Search-ADAccount -AccountExpiring -TimeSpan 10.00:00:00
0 голосов
/ 04 июля 2018

В документации перечислены несколько условий, при которых msDS-UserPasswordExpiryTimeComputed возвращает 9223372036854775807 aka 0x7fffffffffffffff aka [int64]::MaxValue (TO относится к данному t arget o bject):

Если в TO!userAccountControl установлен какой-либо из битов ADS_UF_SMARTCARD_REQUIRED, ADS_UF_DONT_EXPIRE_PASSWD, ADS_UF_WORKSTATION_TRUST_ACCOUNT, ADS_UF_SERVER_TRUST_ACCOUNT, ADS_UF_INTERDOMAIN_TRUST_ACCOUNT, то TO!msDS-UserPasswordExpiryTimeComputed = 0x7FFFFFFFFFFFFFFF.
[...]
Иначе, если Effective-MaximumPasswordAge = 0x8000000000000000, то TO!msDS-UserPasswordExpiryTimeComputed = 0x7FFFFFFFFFFFFFFF (где Effective-MaximumPasswordAge определено в разделе 3.1.1.5 [MS-SAMR]).


Не зная всех деталей, кажется, что свойство msDS-UserPasswordExpiryTimeComputed, возвращающее 0x7FFFFFFFFFFFFFFF, указывает на то, что эффективно не имеет срока действия пароля, по разным причинам, только one из которых PasswordNeverExpires устанавливается на $True.

Следовательно, вы можете отфильтровать такие значения:

Get-ADUser -Filter "SamAccountName -eq '<username>'" `
           -Properties DisplayName, msDS-UserPasswordExpiryTimeComputed |                    #`
  Where { $_.msDS-UserPasswordExpiryTimeComputed -ne 0x7FFFFFFFFFFFFFFF } | ForEach {
      # ...
      $dt = [datetime]::FromFileTime($_.msDS-UserPasswordExpiryTimeComputed)
    }

Может даже оказаться возможным включить тест для 0x7FFFFFFFFFFFFFFF в аргумент -Filter.

В качестве отступления: обратите внимание, что я использовал строку вместо блока скрипта ({ ... }) в качестве аргумента -Filter, потому что использование блоков скрипта лучше всего избегать .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...