2016-07-21 7 views
0

Windowsサーバー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

リモートホスト上で実行するコマンドは、スクリプトブロック内の文字列として定義します。リモートホスト上でscriptblockを呼び出すと、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 
関連する問題