Ich versuche, ein Skript zum Zurücksetzen des lokalen Administratorkennworts für einen Remotecomputer in meiner Organisation zu erstellen. Ich bin ziemlich neu bei Powershell und lerne das meiste davon durch Ausprobieren und Scheitern. Das Skript, das ich bisher habe:
Import-Module ActiveDirectory
$computer = Read-Host -Prompt "Enter computer Name Here"
$password = Read-Host -Prompt "Enter Password Here"
Set-ADAccountPassword - Identity $computer -NewPassword $password
Höchstwahrscheinlich ist es nur ein dummer Fehler, also seien Sie bitte nachsichtig mit mir :)
Antwort1
Kurz zusammengefasst
Ich stimme der anderen Antwort zu, dass diePowerShell ADSI-Adapterfunktioniert dafür. Ich stimme auch den Kommentaren zu, dass Sie Get-Credential
und nicht verwenden sollten, wenn Sie Anmeldeinformationen interaktiv bereitstellen möchten Read-Host
.
So habe ich es gemacht: Ich glaube, ich habe dieses Skript von irgendeiner Website genommen und es ist mir peinlich, dass ich es nicht angeben kann, weil ich keinen Kommentar abgegeben oder nachverfolgt habe, woher ich es habe.
Vorbereitung
Zuerst testet mein Skript die Verbindung:
if((Test-Connection -ComputerName $Computer -count 1 -ErrorAction 0)) {
$Isonline = "ONLINE"
Write-Verbose "`t$Computer is Online"
} else { Write-Verbose "`t$Computer is OFFLINE" }
Die Passwortänderung
Anschließend versucht mein Skript, try/catch
das Kennwort festzulegen und den Erfolg bzw. Misserfolg aufzuzeichnen und zu melden:
try {
$account = [ADSI]("WinNT://$Computer/-PUT THE USERNAME YOU WANT TO CHANGE HERE-,user")
$account.psbase.invoke("setpassword",$password)
Write-Verbose "`tPassword Change completed successfully"
}
catch {
$status = "FAILED"
Write-Verbose "`tFailed to Change the administrator password. Error: $_"
}
Hier gibt es einige Unterschiede. Erstens kannte ich den Benutzernamen des Kontos, das ich ändern wollte, im Voraus (mein Skript bestand darin, alle lokalen Administratorkennwörter auf einmal zu ändern). Sie können verwenden
$user = [adsi]"WinNT://$computer/$($credential.GetNetworkCredential().Username),user"
stattdessen, wie in der anderen Antwort erwähnt. Außerdem verwendet mein Skript (das bei mir auf 2012 R2-Servern funktioniert hat) $user.psbase.invoke("setpassword",$password)
anstelle von $user.SetPassword($password)
. Ich muss gestehen, dass ich nicht weiß, was der Unterschied ist oder ob eines besser als das andere funktioniert.
Berichterstattung
Schließlich meldet mein Skript Erfolg/Misserfolg. Das liegt daran, dass ich mit meinem Skript alle Server in der Umgebung durchgegangen bin, um alle lokalen Administratorkennwörter zu aktualisieren. Ich musste also wissen, welche Server ggf. ausgefallen sind, damit ich manuell zurückgehen und sie ansprechen konnte. Für Sie ist das möglicherweise überhaupt nicht notwendig.
$obj = New-Object -TypeName PSObject -Property @{
ComputerName = $Computer
IsOnline = $Isonline
PasswordChangeStatus = $Status
}
$obj | Select ComputerName, IsOnline, PasswordChangeStatus
if($Status -eq "FAILED" -or $Isonline -eq "OFFLINE") {
$stream.writeline("$Computer `t $isonline `t $status")
}
Antwort2
Wenn Sie Powershell 5.0 oder älter haben, müssen Sie den Powershell ADSI-Adapter verwenden, um ein lokales Benutzerkonto auf einem Remotecomputer zu bearbeiten:
$computer = Read-Host -Prompt "Enter Computer Name Here";
$credential = Get-Credential -UserName "Administrator" -Message "Enter new password";
$user = [adsi]"WinNT://$computer/$($credential.GetNetworkCredential().Username),user";
$user.SetPassword($credential.GetNetworkCredential().Password);
$user.SetInfo();
Möglicherweise möchten Sie überprüfen, ob Sie den Remotecomputer anpingen können, bevor Sie tatsächlich versuchen, eine Verbindung mit ihm herzustellen, und diesen Fall behandeln, wenn der Benutzer im Dialogfeld zur Eingabe der Anmeldeinformationen auf „Abbrechen“ klickt.
$computer = Read-Host -Prompt "Enter Computer Name Here";
If (Test-Connection -ComputerName $computer -Count 2 -Quiet) {
Write-Host "The computer responded to our ping request. Connecting...";
$credential = Get-Credential -UserName "Administrator" -Message "Enter new password";
If ($credential -eq $null) {
Write-Warning "The username and/or the password is empty! I quit.";
Exit;
}
$user = [adsi]"WinNT://$computer/$($credential.GetNetworkCredential().Username),user";
$user.SetPassword($credential.GetNetworkCredential().Password);
$user.SetInfo();
} Else {
Write-Warning "The computer does not respond to our ping request. I quit.";
}
Bearbeiten:In Windows 10 Build 1607 wurde der Befehl mit der neuen Powershell 5.1 eingeführt Set-LocalUser
. Sie können ihn für diese Aufgabe anstelle des ADSI-Adapters verwenden, aber dafür muss der Powershell-Remotedienst auf den Remotecomputern aktiviert sein (standardmäßig deaktiviert). Um die Annahme von Remotebefehlen zu ermöglichen, müssen Sie „run“ Enable-PSRemoting
in einem Powershell-Terminal mit erhöhten Rechten auf dem Remotecomputer ausführen.
Wenn PS-Remoting aktiviert ist, sieht ein geändertes Skript folgendermaßen aus:
$computer = Read-Host -Prompt "Enter Computer Name Here";
If (Test-Connection -ComputerName $computer -Count 2 -Quiet) {
Write-Host "The computer responded to our ping request. Connecting...";
Invoke-Command -ComputerName $computer -ScriptBlock {
$credential = Get-Credential -UserName "Administrator" -Message "Enter new password";
If ($credential -eq $null) {
Write-Warning "The username and/or the password is empty! I quit.";
Exit;
}
Set-LocalUser -Name $credential.UserName -Password $credential.Password;
}
} Else {
Write-Warning "The computer does not respond to our ping request. I quit.";
}