解析PowerShell遠程運行命令出錯
真高興看到人們使用PowerShell Remoting在遠程機器上運行命令。這是未來技術的趨勢,但是也有點復雜。
只訪問本地資源
在開始使用之前,確保命令不訪問遠程機器上的非本地資源。假如你運行一臺Windows 7或Windows 8電腦,使用Remoting將一條命令傳輸給搭載Windows Server 2008或者更新版本的計算機B,這條命令就能操作計算機B上的所有資源。這是不允許的,特別是訪問網絡。
為什么?這是因為Remoting將你的證書委派給計算機B,但是安全起見,計算機B不允許更進一步委派證書。
如果你需要這么做,你可以通過使用CredSSP協議實現多級授權。因為有許多安全因素,所以在開始之前,你需要明確。你可以從免費的電子書PowerShell Remoting的秘密瀏覽更多信息,電子書中有一整章節是關于CredSSP的。
時間問題
命令的另一個可能性問題在于時間。當你在本地手工運行一條命令時,輸入、點擊“回車”、閱讀結果需要一定的時間。在你開始輸入下一條命令時,上一條的命令已經運行完成。
當你發送一批命令到遠程機器時,并不一定如此。機器在***條命令執行完成之間就可以轉到下條命令。尤其是在運行啟動單獨的進程或線程的外部命令時。
為了解決問題,使用Enter-PSSession連接到遠程機器,并手動運行試圖發送的任何命令。如果有用,在發送批量命令時,換成使用Invoke-Command。否則,你會遇到時間問題。
你有幾種解決問題的方法:你可以使用Start-Sleep命令暫停shell;也可以進行必要的檢查,如文件是否存在;在執行其他命令之前,將shell睡眠并重現檢查,然后繼續開始。
外部命令問題
還有一種可能性只適用于外部命令,而不是本地PowerShell cmdlets,那就是遠程機器錯誤解釋了你的命令。在PowerShell v3中,前面的外部命令使用兩個破折號(“--”)告訴shell照原來的樣子傳遞給Cmd.exe,甚至不用解析。這通常用來解決外部命令語法問題。
遠程規則
如果你通過遠程桌面連接或者從服務器直接登錄到遠程機器的控制臺這種方式來成功運行命令的話,那么這條命令不會通過PowerShell Remoting運行,這時你遭遇了“環境問題”。
使用Invoke-Command、Enter-PSSession或其他方法遠程進入機器以后,不會像登錄到控制臺或者遠程桌面會話那樣得到完整的交互式桌面會話。PowerShell不執行概要文件的腳本,并且沒有完整的用戶環境。我看到大量的命令都是出于這個原因,但也有可能有一些沒有這種問題。
如果你也有這種問題,你可以嘗試在遠程機器上調度自己的命令。Windows的任務調度程序擁有一個完整的用戶帳戶,不能保證能夠修復問題,但值得一試。
如果這樣也不能解決問題,那就是卡住了。如果你的命令需要一個完整的、交互式桌面環境來運行,那么你就必須按照上述方法運行。