Вычитание между двумя датами в Powershell оценивается как null - PullRequest
0 голосов
/ 05 августа 2020

Я использую следующий код для отображения некоторых значений, вычитание между двумя датами, как в выражении [datetime] :: Now.AddDays (-365) - $ _. PasswordLastSet) .Days

равно оценивая значение NULL в моих данных, в чем может быть причина, как исправить этот код?

Get-ADUser -Filter * -Properties PasswordLastSet, Mail -SearchBase $searchBase |                                          
    Where-Object{ 
        ([datetime]::Now.AddDays(-365) - $_.PasswordLastSet).Days -in @(" ",364, 350, 354, 340, 335,' ','',"")
    }|
      Select-Object name, PasswordLastSet,@{n='DaysUntilExpired';e={(([datetime]::Now.AddDays(365) - [datetime]::$_.PasswordLastSet).Day).days}} |
    Add-Content -Path C:\Temp\PasswordExpList.txt 

1 Ответ

0 голосов
/ 05 августа 2020

В вашем коде есть две очевидные ошибки, обе здесь:

@{n='DaysUntilExpired';e={(([datetime]::Now.AddDays(365) - [datetime]::$_.PasswordLastSet).Day).days}}

Однако я не могу сказать, следует ли вам указывать это:

@{n='DaysUntilExpired';e={([datetime]::Now.AddDays(365) - $_.PasswordLastSet).Days}}

Или, если вы ищем последний день месяца до истечения срока, тогда это:

@{n='DaysUntilExpired';e={(([datetime]::Now.AddDays(365) - $_.PasswordLastSet.Day).Days}}

Как сказано в комментариях, [datetime]::$_.PasswordLastSet - это ерунда. Это первая ошибка. Во-вторых, свойство timespan равно Days, а не Day. Day является свойством datetime.

Однако, предполагая, что вы пытаетесь вычислить дату истечения срока действия пароля, определенную политикой паролей AD, вам следует посмотреть на свойство msDS-UserPasswordExpiryTimeComputed в AD, потому что это свойство содержит именно его. Вы должны преобразовать его из даты в большое целое число, но это то, что делает [datetime]::fromfiletime().

Get-ADUser -Filter * -Properties PasswordLastSet, Mail, 'msDS-UserPasswordExpiryTimeComputed' -SearchBase $searchBase |
Select-Object -Properties Name, PasswordLastSet, @{n='PasswordExpirationDate';e={[DateTime]::FromFileTime($_.'msDS-UserPasswordExpiryTimeComputed')}}

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

...