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






















