動態取得「PSExec -i」的 Windows 會話 ID

動態取得「PSExec -i」的 Windows 會話 ID

我正在嘗試編寫一行 PowerShell,透過 SSH 推送 PSExec 命令來從 Linux 電腦遠端執行程式到 Windows 電腦。如果我手動查詢會話 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 獲得報酬,更不用說透過 SSH 連接到看似 Linux 的目標了。請注意,這仍然是 Windows 與 Windows 機器之間的對話,而不是與 Linux 機器之間的 SSH 會話。

啟動 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 '小寫' 參數是什麼...因為它不接受該參數中的值...您的意思是 -S '大寫' 嗎? ssh 命令列

在這種情況下

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

如果您的意思是 PsExec 的 -s 開關也不支援將任何值傳遞給參數...

相關內容