web-dev-qa-db-ja.com

PowerShellのPSEXEC

私はPowerShellでPsexecを実行するのに苦労しています。 1行のコマンドで正常に機能します。しかし、Psexecを介してサーバーをメンテナンスモードにするには、SCOMを呼び出す必要があります...

    $output = .\pstools\PsExec.exe \\scomserver-u $user -p $password -w c:\scom -h "c:\scom\agentmm.exe servertoputinmaintenancemode 4 Automated Maintenance Mode Now +45m"

すべての文の後に引用符を付けようとしましたが、役に立ちません。このエラーが発生します

PsExec v1.98-プロセスをリモートで実行するCopyright(C)2001-2010 Mark Russinovich Sysinternals-www.sysinternals.com

ハンドルが無効です。

Scomservernameに接続しています... scomservernameでPsExecサービスを開始しています... scomservernameでPsExecサービスと接続しています... scomservernameでPsExecサービスとの通信中にエラーが発生しました:

2
user98805

リモートサーバーでプロセスを開始するために、次の関数を作成しました。

Function StartRemote {
   param([string] $computer = $(Read-Host "Computername"),
         [string] $cmd = $(Read-Host "Commandline"))

   $remoteProcess = "" | Select-Object ProcessID, ComputerName, `
                         ReturnValue, ReturnMsg, Cmd
   $remoteProcess.ComputerName = $computer
   $remoteProcess.Cmd = $cmd
   $mc = New-Object System.Management.ManagementClass `
         "\\$computer\root\cimv2:Win32_Process"
   $result = $mc.create($cmd)
   $remoteProcess.ReturnValue = [int]$result.ReturnValue
   $remoteProcess.ProcessID = $result.ProcessId
   switch($remoteProcess.ReturnValue) {
     0 { $remoteProcess.ReturnMsg = "OK" }
     2 { $remoteProcess.ReturnMsg = "Access denied" }
     3 { $remoteProcess.ReturnMsg = "Insufficient privilege" }
     8 { $remoteProcess.ReturnMsg = "Unknown failure" }
     9 { $remoteProcess.ReturnMsg = "Path not found" }
     21 { $remoteProcess.ReturnMsg = "Invalid parameter" }
   }
   return $remoteProcess
 }

コンピューター名とコマンドラインを文字列として必要とし、追加の引用符は必ずエスケープして、プロセスに関する情報を含むカスタムオブジェクトを返します。

PoSH> StartRemote -computer TEST-VM -cmd "gpupdate /force"

ProcessID    : 6992
ComputerName : TEST-VM
ReturnValue  : 0
ReturnMsg    : OK
Cmd          : gpupdate /force

おそらく、代替の資格情報を許可するように変更できます。これがお役に立てば幸いです。

2
Sven

Cmd.exeで同じコマンドラインが正常に機能することを確認することをお勧めします。 Powershellには、コマンドラインのルールを解析する引数が少し異なります。

1
woodings