Password Expired – skrypt powershell sprawdzający kiedy wygaśnie hasło

21-mar-2014

Pewnego dnia, mniej więcej w miesiąc po skonfigurowaniu serwera, okazało się że SQL Agent nie startuje. W logu można było znaleźć informację „password expired”

agent

Prosta sprawa. Trzeba tylko zmienić hasło agenta i uruchomić agenta. Aby nie było problemów w przyszłości wypadałoby jeszcze  w przyszłości pamiętać o zmianie hasła, albo gdyby pozwalały na to polityki bezpieczeństwa, zaznaczyć, że hasło nie wygasa.

Ponieważ kont do sprawdzenia jest dość sporo, to można tu posłużyć się skryptem powershell, który wykona za nas całą robotę.

Po pierwsze zaimportujmy moduł ActiveDirectory (tu opis jak go zainstalować). Jeśli masz Powershell 4.0 lub nowszy to import modułu wykona się samoistnie i nie musisz tam pisać poniżej linii:

import-module activedirectory

Na początku dane wejściowe. W moim przypadku plik CSV z jedyną kolumną o nazwie „Account”. Taką listę należy wczytać:

$file=’c:\temp\Accounts.csv’
$list=Import-CSV $file | Select -ExpandProperty Account | % { $_.Substring(3) }

Z ciekawszych elementów – co robi ExpandProperty. Gdyby z danych pobranych z [pliku CSV wybrać po prostu Account w wyniku otrzymalibyśmy obiekty typu Jedna_Kolumna_Pliku_CSV. My wolelibyśmy string, dlatego „awansujemy” wynik polecenia Select do takiego typu, jakim jest zwracana właściwość, czyli w naszym przypadku wynikiem będzie string.

W moim przypadku 3 pierwsze znaki w nazwie konta to XX\ czyli nazwa domeny, dlatego linijka, którą widzisz powyżej kończy się wycięciem napisu od 3 znaku. Jeżeli w pliku CSV masz nazwy kont bez domeny, to ten krok możesz pominąć.

Za chwilę skorzystamy z funkcji, która zwraca czas w postaci daty modyfikacji pliku. Aby data była czytelna dla nas przyda się funkcja konwertująca tę date na datetime:

function FileTime2Date($time) {
return ([datetime]::FromFileTime($time))
}

Funkcja na wejściu przyjmuje datę w nieprzyjemnym dla nas formacie i zwraca datę w formie czytelnej dla człowieka. To chyba nie wymaga komentarza.

Pora na sięgnięcie do AD po informacje o kontach użytkowników:

$list |   Get-ADUser  -Properties „DisplayName”, „msDS-UserPasswordExpiryTimeComputed”

Służy do tego polecenie z zaimportowanego modułu ActiveDirecotry o nazwie Get-ADUser. Nie interesują nas wszystkie właściwości konta, a jedynie nazwa i data wygaśnięcia konta, dlatego wybieramy tylko te dwie właściwości.

Na dodatek dobrze by było zobaczyć je w formie tabelki, stąd:

$list |   Get-ADUser  -Properties „DisplayName”, „msDS-UserPasswordExpiryTimeComputed” |
Select @{n=’Name’;e={$_.DisplayName}},@{n=’ExpiryDate’;e={FileTime2Date $_.”msDS-UserPasswordExpiryTimeComputed”}}

Tabelka będzie miała 2 kolumny:

  • Name, gdzie pokażemy DisplayName oraz
  • ExpiryDate, gdzie pokażemy datę wygaśnięcia hasła wyliczoną wyrażeniem:
    FileTime2Date $_.”msDS-UserPasswordExpiryTimeComputed”
    … czyli skorzystamy z przed chwilą utworzonej funkcji FileTime2Date przekazując do niej jako argument wejściowy msDS-UserPasswordExpiryTimeComputed

Sęk w tym, że wolelibyśmy zobaczyć tylko te konta, które mają datę mniejszą niż 1 miesiąc od dziś, dlatego wpuszczam wynik do where (skrót to ?) i żądam wyświetlenia tylko tych kont, które mają datę wygaśnięcia konta mniejszą niż data dzisiejsza plus 1 miesiąc:

$list |   Get-ADUser  -Properties „DisplayName”, „msDS-UserPasswordExpiryTimeComputed” |
Select @{n=’Name’;e={$_.DisplayName}},@{n=’ExpiryDate’;e={FileTime2Date $_.”msDS-UserPasswordExpiryTimeComputed”}} |
? { ($_.ExpiryDate) -lt (Get-Date).AddMonths(1)}

Można zmodyfikować skrypt, żeby wyświetlił konta, które mają jakąkolwiek datę wygasania hasła:

$list |   Get-ADUser  -Properties „DisplayName”, „msDS-UserPasswordExpiryTimeComputed” |
Select @{n=’Name’;e={$_.DisplayName}},@{n=’ExpiryDate’;e={FileTime2Date $_.”msDS-UserPasswordExpiryTimeComputed”}} |
? { $_.ExpiryDate -ne $null}

No i gotowy skrypt:

/* Check password expiration date for accounts in CSV file in form:
Account,FullName */

//Get-module -list

import-module activedirectory

function FileTime2Date($time)

{

return  ([datetime]::FromFileTime($time))

}

$file=’c:\temp\Accounts.csv’

$list |   Get-ADUser  -Properties „DisplayName”, „msDS-UserPasswordExpiryTimeComputed” |

Select @{n=’Name’;e={$_.DisplayName}},@{n=’ExpiryDate’;e={FileTime2Date $_.”msDS-UserPasswordExpiryTimeComputed”}}

| ? { $_.ExpiryDate -ne $null}

$list |   Get-ADUser  -Properties „DisplayName”, „msDS-UserPasswordExpiryTimeComputed” |

Select @{n=’Name’;e={$_.DisplayName}},@{n=’ExpiryDate’;e={FileTime2Date $_.”msDS-UserPasswordExpiryTimeComputed”}} |

? { ($_.ExpiryDate) -lt (Get-Date).AddMonths(1)}




				

Komentarze są wyłączone

Autor: Rafał Kraik