Ich dachte, ich wäre ziemlich gut in Powershell, aber ich musste nie mit Benutzeranmeldeinformationen arbeiten. Jetzt bin ich jedoch auf Jobsuche und bei einem der Interviews erhielt ich eine Testaufgabe, um ein Skript zu schreiben, das:
- Überprüfen Sie die Verfügbarkeit und den Status (aktiviert / deaktiviert) des Benutzerkontos.
- Überprüfen Sie, ob das Konto in der Gruppe Administratoren enthalten ist
- Wenn kein Konto vorhanden ist, erstellen Sie ein Konto und fügen Sie es der Administratorgruppe hinzu. Aktivieren Sie die Kontrollkästchen "Kennwortänderung durch Benutzer verweigern" und "Kennwort ist nicht abgelaufen".
- Wenn das Konto vorhanden ist, aber deaktiviert ist oder nicht in der Gruppe Administratoren enthalten ist, aktivieren Sie das Konto und fügen Sie es der Gruppe Administratoren hinzu. Aktivieren Sie die Kontrollkästchen neben "Kennwortänderung durch Benutzer verweigern" und "Kennwort ist nicht abgelaufen".
- Das Skript sollte nicht von der Sprache des Betriebssystems abhängen.
Ich dachte, dass es nichts Kompliziertes gibt, und das erste, was ich überprüfen wollte, war der Admin-Benutzer auf meinem Computer. Ohne nachzudenken, fuhr ich einen Befehl:
Get-User admin
Und dann habe ich einen Fehler bekommen
Get-User : "Get-User" , , .
Ein wenig überrascht, weil ich einen so nützlichen Befehl nicht erkannt habe und festgestellt habe, dass der Befehl
Get-User nur in der Powershell-Konsole für Exchange funktioniert. Um mit lokalen Benutzern arbeiten zu können, müssen Sie
Get-Localuser und für Domänenbenutzer
Get-Aduser verwenden . Als ich meinen Fehler erkannte, fuhr ich hinein:
Get-Localuser admin
Und bekam eine Antwort
Name Enabled Description
Nun, jetzt ist es keine große Sache zu überprüfen, ob der Benutzer da ist oder nicht, aber auch hier habe ich auf einen weiteren Fang gewartet. Die Verwendung der bedingten if else-Anweisung erwies sich als nicht so einfach.
Tatsache ist, dass, wenn sich der Benutzer im System befindet, die Ausgabe nicht der Wert true ist, sondern eine ganze Reihe von Daten mit dem Namen und der Beschreibung des Benutzers dieses Konto aktiviert ist oder nicht. Und wenn es keinen Benutzer gibt, gibt Powershell einen Fehler aus. Nachdem ich mich im Internet umgesehen hatte, stellte ich fest, dass es für diese Zwecke besser ist, den Operator
try catch zu verwenden .
$user = 'admin' try { Get-LocalUser $user -ErrorAction Stop | Out-Null write-host $user -foregroundcolor Green } Catch { write-host $user -foregroundcolor Red }
Ich habe die Variable $ user hinzugefügt, um das Ändern von Benutzernamen im gesamten Skript zu vereinfachen. ErrorAction Stop ist erforderlich, damit das Skript bei diesem Schritt nicht aufgrund eines Fehlers unterbrochen wird. Zeichen | trennt die Pipeline-Schritte und Out-Null blendet die Fehlertextausgabe aus. Ich habe auch eine Textausgabe mit Hervorhebung hinzugefügt, um das Skript bequem überprüfen zu können.
Als nächstes wollte ich überprüfen, ob das Konto aktiviert oder deaktiviert ist. Wie bereits erwähnt, erzeugt der Befehl Get-LocalUser eine ganze Reihe von Daten. Zur Überprüfung musste ich nur einen Enabled-Parameter mit dem Wert true oder false auswählen. Dazu habe ich den folgenden Befehl verwendet:
(Get-LocalUser $user).enabled
Nachdem ich sichergestellt hatte, dass es funktioniert, habe ich die folgende Überprüfung durchgeführt und einen Befehl zum Aktivieren des Benutzers hinzugefügt.
$user = 'admin' if ((Get-LocalUser $user).enabled -eq "True") { write-host -foregroundcolor Green } else { write-host -foregroundcolor Red Enable-LocalUser $user write-host -foregroundcolor Green }
Um den Benutzer zu aktivieren, muss die Konsole natürlich unter Administratorrechten ausgeführt werden.
Im zweiten Absatz der Aufgabe musste festgestellt werden, ob der Benutzer Mitglied der Administratorgruppe ist. Um zu überprüfen, ob sich ein Benutzer in einer bestimmten Gruppe befindet, gibt es einen Befehl Get-LocalGroupMember. Der Name der Gruppe von Administratoren hängt jedoch von der Sprache des Betriebssystems ab. Daher musste ich die Standard-SID S-1-5-32-544 verwenden. Ich habe auch einen Versuchsfang durchgesehen.
$user = 'admin' try { Get-LocalGroupMember -SID S-1-5-32-544 -Member $user -ErrorAction Stop | Out-Null write-host $user -foregroundcolor Green } Catch { write-host $user -foregroundcolor Red Add-LocalGroupMember -SID S-1-5-32-544 -Member $user write-host $user -foregroundcolor Green }
Wenn der Benutzer kein Mitglied der Gruppe ist, werden Administratoren hinzugefügt.
In der nächsten Phase musste ich feststellen, ob für den Benutzer die Einstellung zur Kennwortänderung deaktiviert ist oder nicht. Dann bin ich auf weitere Fallstricke gestoßen. Tatsache ist, dass der Parameter PasswordExpires keine Werte zurückgibt, wenn der Benutzer ein unbegrenztes Kennwort hat. Wenn dieses Kontrollkästchen deaktiviert ist, haben verschiedene Benutzer ein anderes Kennwortänderungsdatum. Ich habe mir immer noch einen Ausweg aus dieser Situation ausgedacht:
if ((Get-LocalUser $user).PasswordExpires -eq $null) { write-host -foregroundcolor Green } else { write-host -foregroundcolor Red set-LocalUser $user -PasswordNeverExpires:$true write-host -foregroundcolor Green }
Als nächstes musste ich einen Benutzer erstellen. Ich hatte auch hier nicht erwartet, dass ein Fang auf mich warten würde. Beim Erstellen eines Benutzers mit dem Befehl
new-LocalUser -User $user -password P@ssW0rD!
Fehler zurückgegeben:
"Password". "P@ssW0rD!" "System.String" "System.Security.SecureString".
Tatsache ist, dass der Parameter -password SecureString anstelle der üblichen Textzeichenfolge verwenden sollte. Zu diesem Zweck habe ich die Variable $ password erstellt und in securestring konvertiert.
$password = convertto-securestring "P@ssW0rD!" -asplaintext -force
Und das Skript selbst, um einen Benutzer zu erstellen und ihn der Gruppe der Administratoren hinzuzufügen
new-LocalUser -User $user -password $password -PasswordNeverExpires:$true -AccountNeverExpires:$true Add-LocalGroupMember -SID S-1-5-32-544 -Member $user
Das fertige Skript, das alle Bedingungen berücksichtigt, die ich auf diese Weise erhalten habe:
$user = 'admin' $password = convertto-securestring "P@ssW0rD!" -asplaintext -force try { Get-LocalUser $user -ErrorAction Stop | Out-Null cls write-host $user -foregroundcolor Green if ((Get-LocalUser $user).enabled -eq "True") { write-host -foregroundcolor Green } else { write-host -foregroundcolor Red Enable-LocalUser $user write-host -foregroundcolor Green } if ((Get-LocalUser $user).PasswordExpires -eq $null) { write-host -foregroundcolor Green } else { write-host -foregroundcolor Red set-LocalUser $user -PasswordNeverExpires:$true write-host -foregroundcolor Green } try { Get-LocalGroupMember -SID S-1-5-32-544 -Member $user -ErrorAction Stop | Out-Null write-host $user -foregroundcolor Green } Catch { write-host $user -foregroundcolor Red Add-LocalGroupMember -SID S-1-5-32-544 -Member $user write-host $user -foregroundcolor Green } } Catch { cls write-host $user -foregroundcolor Red new-LocalUser -User $user -password $password -PasswordNeverExpires:$true -AccountNeverExpires:$true Add-LocalGroupMember -SID S-1-5-32-544 -Member $user write-host $user -foregroundcolor Green }
Post scriptum
Das Speichern des Administratorkennworts in einem Skript ist jedoch nicht die beste Sicherheitspraxis. Dazu können Sie den Passwort-Hash verwenden, nicht das Passwort selbst.
$user = 'admin1' $hash = "01000000d08c9ddf0115d1118c7a00c04fc297eb0100000048baf1b47a72d845b4eeda8659da9fd70000000002000000000010660000000100002000000004d2a3bf03aac92c2e172dc002d1fe8759da4655850462aface5c25f52921e05000000000e8000000002000020000000bfa652b6f7cc6845e3cee1831b54ab93dc272d0b2203024c3de8bc4789a2698a10000000923fb50dcf01125913534d0c1ba6d827400000002757df7d8a8b39c8e84b81323acff1d72419580a0022cf610926e5f081a2e895320088d482eb407f8157aad82f091abee7427b357e871d12238a8f74131238e7" $hash $password = ConvertTo-SecureString -String $hash $password new-LocalUser -User $user -password $password -PasswordNeverExpires:$true -AccountNeverExpires:$true Add-LocalGroupMember -SID S-1-5-32-544 -Member $user
Um einen Passwort-Hash zu erhalten, können Sie das folgende Skript verwenden
$Secure = Read-Host -AsSecureString $Secure $hash = ConvertFrom-SecureString -SecureString $Secure $hash
Welches fragt nach einem Passwort von der Tastatur.
Und ein kleiner Bonus, um alle deaktivierten Datensätze anzuzeigen
Get-LocalUser | Where-Object {$_.enabled -eq $false}
Ich hoffe, die Zeit, die ich verbracht habe, hilft jemandem bei seiner Arbeit. Und für Sie selbst wird es nützlich sein, diese unschätzbare Erfahrung nicht zu vergessen.