PowerShell: Wie frage ich pwdLastSet ab und ob es Sinn macht?

16

Ich muss die letzte Kennwortänderung für eine Gruppe von Konten in einer Active Directory-Sicherheitsgruppe abrufen, und ich bin der Meinung, dass PowerShell darin gut sein sollte.

Im Moment weiß ich noch nicht, wie ich das Attribut pwdLastSet aus dem angezeigten AD-Konto lesen soll. Sogar mit etwas Einfachem wie diesem:

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

gibt Ergebnisse für pwdLastSet aus, die wie folgt aussehen:

pwdLastSet            : {System.__ComObject}

Ich habe das Gefühl, dass ich das falsch gemacht habe. Wie kann ich also die Ausgabe des Attributs pwdLastSet am besten abfragen und dann formatieren (der Wert basiert auf der Windows-Epoche und ist nicht sehr gut lesbar)?

Bob
quelle

Antworten:

13

Sie können dies auch ohne Snap-In tun. Ich habe es versucht und es hat funktioniert:

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

Mittwoch, 10. Juni 2009, 16:32:08 Uhr

Ich erhalte auch ein System .__ ComObject für pwdLastSet, wenn das Benutzerobjekt wie folgt festgelegt ist:
$ user = [adsi] "LDAP: // cn = Benutzer1, ou = Mitarbeiter, ou = Benutzerkonten, dc = Ramalamadingdong, dc = Netz "

Es sollte eine Möglichkeit geben, [System .__ ComObject] .InvokeMember () und Reflection zu verwenden, um diesen pwdLastSet-Wert aus dem $ user-Objekt abzurufen, aber ich habe es nicht richtig verstanden. Ich habe es nie herausgefunden, also habe ich das obige Beispiel verwendet und bin weitergegangen.

Wenn Sie viel mit AD (oder Exchange oder SQL Server) arbeiten, möchten Sie möglicherweise das Snap-In dafür herunterladen und verwenden.

Bratch
quelle
1
Ich hatte Lust, verschiedene einfache Aufgaben in PowerShell zu erledigen, um die Syntax zu erlernen. Ich war ein bisschen deprimiert, dass ich überall dort, wo ich hinsah, ein Add-In verwendete. Vielen Dank!
Bob
19

Die in Windows 7 / Windows Server 2008 R2 enthaltenen integrierten AD-Befehle können dies jetzt einfach genug ausführen. Unter Windows 7 über eine PowerShell-Eingabeaufforderung:

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

Das Attribut "PasswordLastSet" scheint eine übersetzte Version des tatsächlichen Attributs "pwdLastSet" zu sein.

Neobyte
quelle
Nur neugierig, was bedeutet, dass kein Wert für PasswordLastSet vorhanden ist ... Bedeutet 100%, dass es keine Änderung gab, seit das Passwort ursprünglich festgelegt wurde?
Mikhail
Ich habe keine Box zum Testen, aber ich denke, es ist wahrscheinlicher, dass noch kein Passwort für das Objekt festgelegt wurde.
Neobyte
@Mikhail, meistens bedeutet das Fehlen eines Wertes für PasswordLastSet, dass Sie den Befehl nicht an einer Eingabeaufforderung mit erhöhten Rechten ausführen.
JPBlanc
3

Es gibt einen einfacheren Weg.

Das ADSI-Objekt verfügt über eine Methode namens ConvertLargeIntegerToInt64. Beachten Sie, dass es sich um eine Methode des ADSI-Objekts und nicht um das System .__ Comobject handelt, das durch Abfragen des Werts eines Zeitstempel-Attributs zurückgegeben wird, sodass $ user.pwdLastSet.value.ConvertLargeIntegerToInt64 () nicht funktioniert. Sie müssen es folgendermaßen aufrufen:

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

Dadurch erhalten Sie den LDAP-Zeitstempel, der in ein lesbares Datum konvertiert werden muss, wie oben von Bratch erläutert. Dies funktioniert für jeden Zeitstempelattributwert, der vom ADSI-Anbieter zurückgegeben wird, und die ConvertLargeIntegerToInt64-Methode wird (glaube ich) von jedem Objekt angezeigt, das einen Verzeichniseintrag darstellt.

Wenn Sie alles zusammenfassen, erhalten Sie das Datum, an dem das Passwort zuletzt festgelegt wurde:

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

So können Sie die AD-Computer auf einfache Weise anzeigen:

Get-ADComputer -Filter *  -Properties name,LastLogonDate,PasswordLastSet,modified,modifyTimeStamp |
  FT Name,DNSHostName,LastLogonDate,PasswordLastSet,modified,modifyTimeStamp | 
    Out-File Computers.csv
Wilhelm
quelle
1

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

offene Powershell

Führen Sie die folgenden Befehle aus:

add-PSSnapin quest.activeroles.admanagement

Get-QADUser | ft Anzeigename, PasswordLastSet

Der erste Befehl lädt das gerade heruntergeladene Quest-Snapin. Sie brauchen dies nicht zu tun, wenn Sie die Verknüpfung zum Suchen in Ihrem Startmenü verwenden. Der zweite Befehl ruft eine Liste aller und der Benutzer sowie die Uhrzeit ab, zu der das Kennwort zuletzt geändert wurde.


quelle
1

Fügen Sie die ConvertADSLargeInteger-Funktion zu Ihrem Skript hinzu. Sie erhalten sie hier:

PowerShell: Konvertieren Sie Active Directory IADSLargeInteger in System.Int64

So würden Sie es verwenden:

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