雖然PowerShell遠程管理被構建在 WS-Management的之上,但它是協議中的協議。如果嘗試使用 PSRP (PowerShell遠程處理協議)直接進行交互,本質上需要在客戶端機器上運行一個PowerShell副本。另一種方法是使用一個鮮為人知的遠程命令行工具,稱為WinRS。WinRS是一個簡單的工具,允許遠程CMD.EXE,它也是構建在WS-Management之上的。所不同的是WinRS重用了 WS-Transfer中的Create和Delete,并引入了一些新的自定義的SOAP web-methods。本文中,我將重點放在WinRS“協議”,不會討論 WS-Transfer,SOAP,HTTP等細節。關于WinRS,WS-Management的一些詳細文檔可以參考:[MS-WSMV]: Web Services Management Protocol Extensions for Windows Vista。
WinRS具有相對簡單的協議,工作流程為:
WS-Transfer創建一個Shell,一個EPR(端點引用)。創建的Shell會被返回,用于接下來的一系列操作。
調用命令的自定義SOAP動作,開始一個新的命令
調用自定義的SOAP接受動作,來接收命令輸出(發送輸入時有相應的Send命令,但不是該場景必須的)
重復步驟3,直到CommandState完成
WS-Transfer來刪除shell上的端點引用。
讓我們較為詳細地瀏覽每個步驟吧:
對于WS-Transfer Create SOAP消息,body中應當包含你要發送或者接受的流,資源的URI應當為:http://schemas.microsoft.com/wbem/wsman/1/windows/shell/cmd.
所以本質上我們創建了一個cmd.exe shell用來運行PowerShell。
代碼如下:
<Shell xmlns='http://schemas.microsoft.com/wbem/wsman/1/windows/shell'>
<InputStreams>stdin</InputStreams>
<OutputStreams>stdout stderr</OutputStreams>
</Shell>
如果請求成功,你會接受到一個標準的WS-Transfer Create SOAP響應,它包含了一個剛才創建的類似的Shell EPR:
代碼如下:
<w:SelectorSet>
<w:Selector Name="ShellId">AFCFB065-F551-4604-BFDFD9B706798B5D</w:Selector>
</w:SelectorSet>
這個EPR應該緩存的所有后續操作。第一個自定義SOAP動作命令使用動作URI:http://schemas.microsoft.com/wbem/wsman/1/windows/shell/Command。 WinRS支持兩種控制臺模式:交互式和批處理。對于一個交互式會話,WinRS將等待輸入(即使命令已經完成),直到客戶端指示沒有更多。對于一個批處理會話,WinRS期望只在運行命令的生命周期有輸入被發送。對于此場景,指定的WS-Management選項WINRS_CONSOLEMODE_STDIN為true來意味正在使用批處理模式非常重要。命令行被分成單獨的命令和參數。SOAP片段像這樣:
代碼如下:
…
<w:OptionSet>
<w:Option Name='WINRS_CONSOLEMODE_STDIN'>TRUE</w:Option>
</w:OptionSet>
</s:Header>
<s:Body>
<CommandLine xmlns='http://schemas.microsoft.com/wbem/wsman/1/windows/shell'>
新聞熱點
疑難解答