2016-07-21 27 views
0

Ich versuche, Passwörter auf mehr als 1000 Hosts Windows Server 2008/2012 zu ändern. Sie haben verschiedene Domains zugewiesen, also verbinde ich sie über ihre IP, alle haben PowerShell-Remoting geöffnet. Stuck bei meiner Skript-Implementierung. Im Moment möchte ich nur eine Verbindung zu einem einzelnen Host herstellen und das Passwort des Benutzers oder Administrators ändern.Führen Sie Remote-PS-Befehl ordnungsgemäß

Hier ist der Code, den ich

verwenden
$username = "UserWhose Password I want to change" 
$password = ConvertTo-SecureString "users old password" -AsPlainText -Force 
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $username, $password 

$serverNameOrIp = "host ip address here" 

$s = New-PSSession -ComputerName $serverNameOrIp -Authentication default -Credential $cred 
#invoke the scriptblock remotely 
$sb = { 
    "[ADSI]`$Admin=`"WinNT://$env:COMPUTERNAME/$env:USERNAME`"" 
    "`$Admin.SetPassword(`"Users new password`")" 
} 
Invoke-Command -Session $s -ScriptBlock $sb 

Remove-PSSession $s 

Jetzt erhalten die Konsolenausgabe I:

PS C:\> ./script 

[ADSI]$Admin="WinNT://WIN-TA49U0TR9GT/Administrator" 
$Admin.SetPassword("Users new password") 

PS C:\>

"WinNT: // WIN-TA49U0TR9GT/Administrator" gehört zur Remote-Host, meine lokalen Computername und ein Benutzername sind unterschiedlich. Ich bekomme hier keinen Fehler oder eine korrekte Ausgabe. Das Passwort ändert sich nicht. Wenn ich versuche, diese Befehle manuell auf jedem Host auszuführen, funktioniert es.

Irgendwelche Vorschläge? Vielleicht eine funktionierende Lösung?

Antwort

1

Sie definieren die Befehle, die auf dem Remote-Host ausgeführt werden sollen, als Zeichenfolgen in einem Skriptblock. Wenn Sie den Skriptblock auf dem Remote-Host aufrufen, macht er das, was PowerShell mit allen nackten Zeichenfolgen tut: echo sie.

Entfernen Sie die äußere zitiert und Flucht und der Code sollte, wie Sie arbeiten erwarten:

$sb = { 
    [ADSI]$Admin = "WinNT://$env:COMPUTERNAME/$env:USERNAME" 
    $Admin.SetPassword("Users new password") 
} 

Die Skript verhindert bereits Variablen wird im aktuellen Kontext erweitert.

0

Vervollständigendes Arbeitsskript schreiben, die Konsolenargumente akzeptieren, Verbindung zum angegebenen Host herstellen und das Benutzerpasswort ändern.

ARGS = IP NUTZERNAME OLDPASS newpass

Hope this jemand helfen

$serverNameOrIp = $args[0] 
$username = $args[1] 
$password = ConvertTo-SecureString -String $args[2] -AsPlainText -Force 
$newPassword = $args[3] 
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $username, $password 

$s = New-PSSession -ComputerName $serverNameOrIp -Authentication default -Credential $cred 
$sb = { 
    param($newPassword) 
    [ADSI]$Admin = "WinNT://$env:COMPUTERNAME/$env:USERNAME" 
    $Admin.SetPassword($newPassword) 
} 
Invoke-Command -Session $s -ScriptBlock $sb -args $newPassword 
Remove-PSSession $s