2016-07-21 208 views
0

我試圖在運行Windows Server 2008/2012的超過1000臺主機上更改密碼。他們分配到不同的域,所以我通過他們的IP連接到他們,他們所有的PowerShell遠程打開。 卡住我的腳本實現。現在我只想連接到單個主機並更改用戶或管理員的密碼。正確執行遠程PS命令

這裏是我的代碼使用

$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 

現在,控制檯輸出我得到:

PS C:\> ./script 

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

PS C:\>

「WINNT:// WIN-TA49U0TR9GT /管理員」 屬於遠程主機,我的地方計算機名和用戶名是不同的。 我沒有收到任何錯誤或正確的輸出。密碼不變。如果我嘗試在任何主機上手動運行這些命令 - 它的工作原理。

有什麼建議嗎?也許工作的解決方案?

回答

1

您可以在腳本塊中定義要作爲字符串在遠程主機上運行的命令。當你在遠程主機上調用腳本塊時,它會執行PowerShell對所有裸線執行的操作:回顯它們。

取下外引號和轉義和代碼應工作,你希望:

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

的腳本塊已經阻止變量從當前上下文正在擴大。

0

發佈完整的工作腳本,接受控制檯參數,連接到指定的主機並更改用戶密碼。

ARGS = IP USERNAME OLDPASS NEWPASS

希望這會幫助別人

$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