0

從我的腳本我想在遠程Windows機器上運行一些命令。所以我google了一下,似乎是最流行的,不知何故,標準的方法是使用PowerShell的Invoke-Command cmdlet,它似乎使用與winrmwinrs相同的協議。因此,波紋管是我試圖從我的腳本調用命令(其實我試過很多其他的修改好,但IMO這些都足以說明問題):通過PowerShell運行遠程守護進程(不僅僅是)進程的問題

  1. PowerShell -Command "$encpass=ConvertTo-SecureString -AsPlainText mypass -Force;$cred = New-Object System.Management.Automation.PSCredential -ArgumentList myuser,$encpass; Invoke-Command -ComputerName REMOTE_COMPUTER_NAME -Credential $cred -ScriptBlock {<fullcommand>};"

  2. PowerShell -Command "$encpass=ConvertTo-SecureString -AsPlainText mypass -Force;$cred = New-Object System.Management.Automation.PSCredential -ArgumentList myuser,$encpass; Invoke-Command -ComputerName REMOTE_COMPUTER_NAME -Credential $cred -ScriptBlock {Start-Process -FilePath <fullexepath> -ArgumentList <arguments> -Wait -NoNewWindow};"

  3. PowerShell -Command "$encpass=ConvertTo-SecureString -AsPlainText mypass -Force;$cred = New-Object System.Management.Automation.PSCredential -ArgumentList myuser,$encpass;$session=new-PSSession -ComputerName "REMOTE_COMPUTER_NAME" -Credential $cred; Invoke-Command -Session $session -ScriptBlock {<fullcommand>};"

注意:該腳本寫在perl,但IMO在這裏腳本的語言並不重要,所以你可以假設我從batch腳本調用命令,只需注意,因爲命令應該從腳本運行它們不應該需要任何交互式操作。

所以,我對這些命令有幾個問題,需要幫助才能弄明白。它們是:

  1. 無法運行configure and run daemon類型的進程。也就是說,如果我想在遠程盒子(<fullcommand> = "configure_server.pl <arguments>")上運行configure_server.pl,這應該做一些事情,然後運行server.exe,它不起作用,因爲一旦完成configure_server.pl,完整的遠程作業將被殺死,包括server.exe,這應該是作爲守護進程運行。 (適用於點1,2,3)
  2. 獲取包裝(每行的長度小於或等於80個字符)標準輸出和標準錯誤。 (適用於第1,3點)
  3. 不得標準輸出和標準錯誤。 (適用於第2點)

回答

0

Whe這是一個艱難的,你的種類很多,所以如果我想念你想做的事完全讓我知道。

1。停止嘗試去遠程路線。我知道這似乎是一個好主意,但事實並非如此。你可以讓進程持續下去的唯一方法是如果你保持主機上的PowerShell窗口。正如您可能已經注意到的那樣,您可以創建流程正常,但它們是PowerShell.exe的子項,並且由客戶端計算機上的wsmprovhost.exe進程託管。一旦父母走了,所有的孩子被殺害

爲了解決這個問題,我建議使用命令行功能:SCHTASKS.EXE
schtasks.exe /create /sc ONCE /tn $taskName /tr $command /s $serverName /u $userName /p $pass /ru $userName /rp $pass /st $startTime

該命令將創建一個計劃任務運行一次,然後刪除後自己。它甚至需要計算機名稱,因此不需要遠程訪問。您也可以執行schtasks.exe/query並在執行schtasks.exe /刪除之前檢查「狀態」是否正在運行。

2。使用`(反向)指定進位執行到PowerShell的下一行
3。我用這個函數得到標準輸出和錯誤,有時在大腳本中執行時不輸出,但總是可以使用$?捕捉錯誤。

注意:您無法將PSCredentials傳遞給此命令。我建議製作一個僅僅提示輸入用戶名和密碼的GUI,而不必轉換爲安全字符串。我儘量遠離腳本中的遠程處理,因爲它總是讓一切變得如此緩慢。有時你沒有選擇,但在這種情況下,我相信你會這樣做。