2017-01-26 9 views
0

リモートVM上のサービスのログインユーザーを変更するためのPowerShellスクリプトを作成しました。私はそれを実行するときに動作します。私は私の同僚にそれを送信したときただし、スクリプトはエラーなしで実行し、彼らはそれはまだ「ローカルアカウント」として記載されているチェックしていることが表示されます。PowerShellスクリプトを使用してWindowsサービスを変更する

$account = Read-Host "Please admin account Name" 
$password = Read-Host -AsSecureString "Please enter your password" 
$password = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($password)) 
$service = Read-Host "Enter service name" 

$computers = Get-Content -Path ".\servers.txt" 

foreach ($computer in $computers) { 
    $svc = gwmi Win32_Service -ComputerName $computer -Filter "name='$service'" 
    $svc.StopService() 
    $svc.Change($null,$null,$null,$null,$null,$null,$account,$password,$null,$null,$null) 
    $svc.StartService() 
} 

Write-Host $service "is now running as" $account 
Read-Host 
+0

エラーの内容を知ることは非常に役に立ちます。良い出発点は、あなたのコードと同じディレクトリにservers.txtというテキストファイルがあるのでしょうか? PowerShellの実行ポリシーでリモートコードを実行できますか?また、パスワードを入力する必要があります。代わりに 'Get-Credential'を使うべきです。もっと安全です。 – FoxDeploy

+0

私は '$ \ computer.txt'を見つけられず、何もしないと決めたので、' $ computer'を出力しました。 server.txtの – Filburt

+0

は、VMが更新するservers.txtファイルからVMの名前を読み取ります。提供されているエラーメッセージはありませんが、問題はなく実行されたように見えますが、指定されたVMでは変更が加えられていません。 –

答えて

0

私はへ

foreach ($computer in $computers) { 
$svc = gwmi Win32_Service -ComputerName $computer -Filter "name='$service'" 
$svc.StopService()  
$svc.Change($null,$null,$null,$null,$null,$null,$account,$password,$null,$null,$null) 
$svc.StartService() 
} 

このブロックを移動します。invoke-commandWSMAN使用しながら-Computerパラメータを使用してinvoke-commandブロックCMD-することができますが、独自の方法で、リモート・アクションを実装する( - >より多くの標準化された方法を)

これを試してみてください:

foreach ($computer in $computers) { 
    # $computer can be either an IP-address or a FQDN e.g. computer.mydomain 
    invoke-command -computer $computer -credential (get-credential) -scripblock { 
     $svc = gwmi Win32_Service -ComputerName $computer -Filter "name='$service'" 
     $svc.StopService()  
     $svc.Change($null,$null,$null,$null,$null,$null,$account,$password,$null,$null,$null) 
     $svc.StartService() 
    } 
} 

この提案では、すべてのアクションがリモートマシン上で実行されます。最初の試みとは反対に。変換されたオブジェクトに対してローカルでいくつかのアクションを実行する( - >変更されたプロパティがリモートに返されます)よりも、ローカルマシンにリモートオブジェクトを "フェッチ"する(オブジェクトが変換されます)。

お使いのコンピュータがリモートのものと同じドメイン内にない場合は、お近くの信頼できるホストのリストにあなたのリモートターゲットを追加しました。このlinkは、信頼できるホストリストを更新する方法について説明しています。

PowerShellリモート処理もこのlinkで説明し、あなたのターゲットにアクティブになっている場合にも確認する必要があります。ターゲットOSがWIN Server 2012 R2の場合Powershellリモート処理はデフォルトで有効です。

+0

おかげで、次のエラーを得た:「起動コマンドを:1台の以上のコンピュータ名が有効でないあなたは、URIを渡す-ConnectionUri パラメータを使用するか、またはURIを渡すためにしようとしている場合。オブジェクトの文字列の代わりに。 –

+0

信頼できるホストリストにリモートターゲットを追加する必要があるかどうかを確認します。私は私の答えを更新しました。 – Moerwald

関連する問題