「PSExec -i」の Windows セッション ID を動的に取得する

「PSExec -i」の Windows セッション ID を動的に取得する

SSH 経由で PSExec コマンドをプッシュすることにより、Linux マシンから Windows マシンにプログラムをリモートで実行するための PowerShell の行を記述しようとしています。セッション ID を手動で照会してハードコードすると機能しますが、ID が変更されるため、動的にプルする必要があります。

現在のコマンドは次のとおりです。

ssh [email protected] "psexec '\\\\192.168.1.3' -i Invoke-Command -ScriptBlock {query session | grep user | grep -o [0-9]} -s $prgm"

残念ながら、スクリプトを実行すると、次のエラーが表示されます。

The system cannot find the file specified.
Starting Invoke-Command on 192.168.1.3....1.3...
PsExec could not start Invoke-Command on 192.168.1.3:
Binary file C:\Users\user\Desktop\Games\StepMania\Program\StepMania.exe matches

ファイルパスは、スクリプトの前のほうのコードによるものです。スクリプト引数を、テキスト ファイルから取得した Windows マシン上のパスと一致させようとします。必要と思われる場合は、スクリプト全体を貼り付けることができます。

答え1

PSExec を使用してこれを試したことはありません。ただし、開始されたプロセスの現在の PID を取得するのは、次のようにするだけで簡単です...

$process = Start-Process -FilePath "notepad" -PassThru
"Process Id is $($process.Id)"

また、PowerShell には現在のプロセス ID を保持するデフォルトの変数があることに注意してください。

$pid

ただし、この方法では psexec 経由で支払いを受けることができ、Linux ターゲットと思われるものに SSH 経由で支払いを受けることはできないという回答があります。これは、Linux ボックスと思われるものに SSH セッションで接続するのではなく、Windows マシン間で通信していることに注意してください。

psexec を起動した後にプロセス ID を取得する

& psexec -s -d -i $SessionID \\$PCname $Program $FilePath\$FileName |
   Select-String 'process ID (\d+)' | 
   ForEach-Object {$_.Matches.Groups[1].Value}

答え2

ssh [email protected] "psexec '\\\\192.168.1.3' powershell.exe -Command \"&{query session | grep user | grep -o [0-9]}\" -s $prgm"

SSH で -s 'lowercase' パラメータを何に使用しているのかよくわかりません... そのパラメータでは値が受け入れられないためです... -S 'uppercase' を意味していましたか? ssh コマンドライン

その場合

ssh -S $prgm [email protected] "psexec '\\\\192.168.1.3' powershell.exe -Command \"&{query session | grep user | grep -o [0-9]}\""

PsExec の -s スイッチを意味していた場合、これもパラメーターに渡される値をサポートしていません...

関連情報