Противоречивые значения из Active Directory относительно даты истечения срока действия пароля

Я использую 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? Спасибо.


person user8148945    schedule 04.07.2018    source источник
comment
В качестве отступления: использование блока сценария ({ ... }) в качестве аргумента -Filter лучше избегать.   -  person mklement0    schedule 04.07.2018


Ответы (2)


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

Если какой-либо из битов 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!userAccountControl, то TO!msDS-UserPasswordExpiryTimeComputed = 0x7FFFFFFFFFFFFFFF.
[...]
Иначе, если Effective-MaximumPasswordAge = 0x8000000000000000, то TO!msDS-UserPasswordExpiryTimeComputed = 0x7FFFFFFFFFFFFFFF (где Effective-MaximumPasswordAge определено в [MS-SAMR], раздел 3.1.1.5).


Не зная всех подробностей, кажется, что свойство msDS-UserPasswordExpiryTimeComputed, возвращающее 0x7FFFFFFFFFFFFFFF, указывает на то, что срок действия пароля фактически не истек по целому ряду причин, только одна из которых 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, потому что использование блоков сценария лучше избегать.

person mklement0    schedule 04.07.2018

На данный момент у меня нет DC для тестирования, но теоретически это может сработать.

  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
person Sid    schedule 04.07.2018