Powershell: Jak zapytać pwdLastSet i czy ma to sens?

17

Muszę uzyskać ostatnią zmianę hasła dla grupy kont w grupie zabezpieczeń Active Directory i uważam, że PowerShell powinien być w tym dobry.

W tej chwili już utknąłem, jak odczytać atrybut pwdLastSet z konta AD, na które patrzę. Nawet uruchamiając coś tak prostego:

[adsi] "LDAP://cn=user1,ou=Staff,ou=User Accounts,dc=ramalamadingdong,dc=net" | Format-List *

daje wyniki dla pwdLastSet, które wyglądają tak:

pwdLastSet            : {System.__ComObject}

Wydaje mi się, że podchodzę do tego w niewłaściwy sposób, więc jaki jest najlepszy sposób na zapytanie, a następnie sformatowanie danych wyjściowych (wartość oparta na Epoce Windows i niezbyt czytelna dla człowieka) atrybutu pwdLastSet?

Kok
źródło

Odpowiedzi:

13

Możesz to również zrobić bez przystawki. Próbowałem tego i zadziałało:

PS #> $ seekcher = New-Object DirectoryServices.DirectorySearcher
PS #> $ searcher.Filter = "(& (samaccountname = user1))"
PS #> $ results = $ seekcher.findone ()
PS #> [datetime] :: fromfiletime ($ results.properties.pwdlastset [0])

Środa, 10 czerwca 2009 16:32:08

Dostaję także System .__ ComObject dla pwdLastSet, jeśli mam ustawiony obiekt użytkownika w następujący sposób:
$ user = [adsi] "LDAP: // cn = użytkownik1, ou = Personel, ou = Konta użytkowników, dc = ramalamadingdong, dc = net „

Powinien istnieć sposób na użycie [System .__ ComObject] .InvokeMember () i refleksji, aby uzyskać tę wartość pwdLastSet z obiektu $ user, ale nie byłem w stanie poprawnie ją ustawić. Nigdy tego nie rozgryzłem, więc skorzystałem z powyższego przykładu i ruszyłem dalej.

Jeśli zamierzasz dużo pracować z AD (lub Exchange lub SQL Server), możesz chcieć uzyskać dla niego przystawkę i użyć jej.

Bratch
źródło
1
Byłem gotów wykonać różne proste zadania w PowerShell, aby spróbować nauczyć się składni. Byłem trochę przygnębiony, że wszędzie, gdzie spojrzałem, odpowiedzią było użycie dodatku. Dzięki!
Bob
19

Wbudowane komendy AD, które są dostarczane z Windows 7 / Windows Server 2008 R2, mogą teraz to zrobić po prostu. W systemie Windows 7 z wiersza polecenia programu PowerShell:

Import-Module ActiveDirectory
Get-ADUser 'user1' -properties PasswordLastSet | Format-List

Atrybut „PasswordLastSet” wydaje się być przetłumaczoną wersją rzeczywistego atrybutu „pwdLastSet”.

Neobajt
źródło
Ciekawe, co oznacza brak jakiejkolwiek wartości dla PasswordLastSet ... Czy to w 100% oznacza, że ​​nie było żadnej zmiany od czasu początkowego ustawienia hasła?
Michaił
Nie mam pola do przetestowania, ale myślę, że bardziej prawdopodobne jest, że nie ustawiono jeszcze hasła do obiektu.
Neobyte
@ Michaił, przez większość czasu brak jakiejkolwiek wartości dla PasswordLastSet oznacza, że ​​nie uruchamiasz polecenia w podwyższonym monicie.
JPBlanc
3

Jest łatwiejszy sposób.

Obiekt ADSI ma metodę o nazwie ConvertLargeIntegerToInt64. Zauważ, że jest to metoda obiektu ADSI, a nie Systemu .__ Comobject, który jest zwracany przez zapytanie o wartość atrybutu znacznika czasu, więc $ user.pwdLastSet.value.ConvertLargeIntegerToInt64 () nie będzie działać. Musisz go wywołać w następujący sposób:

$user.ConvertLargeIntegerToInt64($user.pwdLastSet.value)

Otrzymasz znacznik czasu LDAP, który należy przekonwertować na czytelną datę, jak wyjaśniono powyżej w Bratch. Będzie to działać dla każdej wartości atrybutu znacznika czasu zwróconej przez dostawcę ADSI, a metoda ConvertLargeIntegerToInt64 jest (jak sądzę) ujawniona przez dowolny obiekt reprezentujący pozycję katalogu.

Podsumowując, oto jak uzyskać datę ostatniego ustawienia hasła:

$user = [ADSI]'LDAP://cn=someusername,ou=someou,dc=somedomain,dc=com'
[datetime]::FromFileTime($user.ConvertLargeIntegerToInt64($user.pwdLastSet.value))
Adi Inbar
źródło
3

Oto prosty sposób wyświetlania komputerów AD:

Get-ADComputer -Filter *  -Properties name,LastLogonDate,PasswordLastSet,modified,modifyTimeStamp |
  FT Name,DNSHostName,LastLogonDate,PasswordLastSet,modified,modifyTimeStamp | 
    Out-File Computers.csv
William
źródło
1

Zainstaluj: http://www.quest.com/powershell/activeroles-server.aspx

otwórz PowerShell

Uruchom następujące polecenia:

add-PSSnapin quest.activeroles.admanagement

Wyświetlana nazwa Get-QADUser | ft, PasswordLastSet

Pierwsze polecenie ładuje pobraną wcześniej przystawkę. Nie musisz tego robić, jeśli używasz skrótu do zadania w menu startowym. Drugie polecenie wyświetla listę wszystkich użytkowników oraz godzinę ostatniej zmiany hasła.


źródło
1

Dodaj funkcję ConvertADSLargeInteger do skryptu, możesz ją pobrać tutaj:

PowerShell: Konwertuj IADSLargeInteger z Active Directory na System.Int64

Oto, jak byś tego użył:

$user = [adsi] "LDAP://cn=user1,ou=Staff,ou=User Accounts,dc=ramalamadingdong,dc=net"
[datetime]::FromFileTimeUtc((ConvertADSLargeInteger $user.pwdlastset.value))
Mike Pfeiffer
źródło