遠程執行命令避免UAC提示
Workaround: Run commands remotely bypassing UAC prompt
前言
使用WindowsVista/7的使用者都有這樣的經曆,每當你安裝程式,或者變更被系統保護的資源——很多時候你也不知道到底哪些東西是被系統保護的,甚至一個沒有有效簽名的程式啟動並執行時候,即便你是管理使用者登陸, Windows預設地都會暫時阻止該程式運行,並彈出一個提示框提示使用者是否繼續,直到使用者人為確定後,才會繼續運行該程式,這就是User Access Control(也就是UAC)的作用。
UAC的初衷是給系統安全帶來了一層人為保障,通過引入電腦操作人員的人為參與,來提供“有效”的系統安全保護。UAC這個設計的原意是“好”的,而且的確提供了系統內建的保護措施,所以除非需要不要關閉它。但是過多的使用者提示,確實也影響了使用者的使用體驗。在不關閉UAC的前提下,對於系統管理員,尤其是遠端管理多台電腦時,帶來了一定的不便。在不增加管理費用、購置昂貴管理軟體的前提下,如何繞過UAC的提示,順利完成批量管理工作,是一個挑戰。
Runas為什麼不適合?有人不禁會想到ruanas命令,雖然runas命令可以讓管理員提升一個程式的運行許可權並繞過UAC的提示視窗,但是不適合遠程批量的執行,因為它依然要求在Command Prompt中輸入管理員密碼,而不能像類Unix系統的類似命令那樣靈活,這意味著什嗎?當使用命令完成同一任務部署到多台電腦的時候,管理員需要登陸到每台機器手動操作,這樣既低效又易出錯。
雖說在大型網路管理環境中,可以使用諸如SCCM等的昂貴的管理軟體進行軟體管理或者通過Group Policy等方式對電腦和使用者管理,不過一個免費便捷的並適合小任務部署的操作,提供給管理員以靈活和快捷的途徑。我們這裡實現一種免費而且完全使用Windows內建功能無需多餘軟體安裝的方案,這樣可以方便管理員遠程部署任務。
目的和條件
我們的目的就是,在遠程電腦上順暢運行一個通常被UAC攔截的程式或命令檔案。比如:執行命令md %WinDir%\tmp,這在普通的Command Prompt中會顯示Access
is denied。只有運行runas或者使用Run as administrator開啟Command Prompt才能順利完成,因為%WinDir%是被UAC保護的。如果使用諸如psexec來控制遠程電腦執行上面的命令,也會執行失敗。
這個方法的基本要求是:
- 管理員賬戶:至少具有遠程電腦管理員權限的使用者和密碼,可以是AD上的Workstation的Administrator 群組成員,或者是Workstation本地的管理員帳號。
- DOS命令:還有就是熟悉基本的DOS命令,因為後面會看到,我們的確需要命令列的操作,這樣才能最大化的實現自動完成管理工作。
操作過程:
在一台測試機上,實現下面的各個步驟操作,
命令檔案:
為了方便示範,我們使用下面的命令檔案作為例子。使用任何文字編輯器,輸入下面的命令,並保為C:\ProgramData\WinVer.cmd--C:\ProgramData檔案夾相當於XP中的All Users:
systeminfo| find "OS Name" | find "Windows 7"if %ERRORLEVEL% NEQ 0 goto Otherecho Windows 7 > C:\Windows\WinVer.txtgoto END:Other Echo Other Windows > C:\Windows\WinVer.txt:END
該批命令在C:\Windows中產生一個WinVer.txt檔案。
嘗試運行它,由於UAC保護下,該檔案無法產生。
在實際操作中,可以是一個程式等,也可以有命令列參數。
建立一個Task模板
:
在Start菜單中輸入Task,並選擇運行Task Scheduler,或者在Control Panel的Administritive Tools中運行Task Scheduler程式。
在Actions中選擇CreateTask…,在General標籤中,在Name處填上一個名字,確定選擇”Runwith highest privileges”和"Run whether user is logged on or not",見:
在Actions標籤中,建立一個新的Action,選擇Action為Start a Program,在Program/Script中選擇上面我們建立的命令檔案C:\ProgramData\WinVer.cmd。見:
點擊OK按鈕後確認儲存。
因為新建立的Task不會被立刻顯示,所以需要重新運行Task Scheduler程式,找到剛才建立的新Task,在Actions裡面選擇Export…,把這個Task儲存為一個.xml檔案,這個就是Task模板。下面使用test.xml檔案名稱為例。
注意,一個在根下面的Task可能不能被有效運行,所以需要把它移動到一個目錄中,比如可以移動到Microsoft下面。
測試Task模板
為了保證這個Task可以正常運行,我們需要先來測試有一下。運行下面的命令:
schtasks.exe /run /tn "\Microsoft\Test"
如果運行成功後,在C:\Windows\檔案夾中應該有一個WinVer.txt檔案。測試成功後就可以進行下一步了。
遠程建立Task
前面的準備工作最羅嗦,從這裡開始使用命令列最多。
上面,我們在本地機建立了一個Task,為了可以遠端控制,我們需要把這個模板在遠程機上建立一個相同的Task。很簡單使用下面的命令:
schtasks.exe /create /S COMPUTER /U ADMINISTRATOR /P ADMIN_PASSWORD /RU R_ADMINISTRATOR /RP R_ ADMIN_PASSWORD /TN ”\Microsoft\Test“ /XML %USERPROFILE%\Desktop\Test.xml /F
把其中的:
COMPUTER換成遠程電腦的名稱
ADMINISTRATOR和ADMIN_PASSWORD換成本地電腦管理員的使用者名稱和密碼
R_ADMINISTRATOR和R_ADMIN_PASSWORD換成遠程電腦管理員的使用者名稱和密碼
遠程運行該Task
遠程運行該Task使用下面的命令:
schtasks.exe/run /S COMPUTER /RU R_ADMINISTRATOR /RP R_ ADMIN_PASSWORD /tn "\Microsoft\Test"
各參數說明見上建立Task。
遠程刪除該Task:
schtasks.exe/delete /S COMPUTER /RU R_ADMINISTRATOR /RP R_ ADMIN_PASSWORD /tn "\Microsoft\Test" /F
各參數說明見上建立Task。
結束語:
有關schtasks的命令列參數詳細解釋參見有關說明。
我們這裡只不過使用了Windows的Task服務的一個內建功能,其實,一個具有相當許可權的客戶化的系統服務,同樣是繞過UAC的一個思路。
在危害Windows系統的病毒蠕蟲木馬等等多不勝堵的今天,殺毒防毒軟體成了日常可以安全運行Windows系統不可或缺的一個部分,微軟也出了自己的一個軟體對付病毒,安全問題已經成為Windows繼續發展的第一障礙。微軟應該對此相當重視,不過有趣的是,Microsoft的技術人員發現,這不是他們技術人員可以控制的,他們的系統是無懈可擊的,而是終端使用者的責任和義務,終端使用者應該具有慧眼識珠地辨別什麼是對系統有危害的,什麼是安全的操作,並可以清醒地理智地作出相應的反應,否則作為終端使用者就負有對自己不負責任的行為負擔相應後果的責任。於是,UAC閃亮登場了,使用者被強行改變自己的操作行為參與到這個安全防護遊戲中。
Windows系統的這種越來越依賴於使用者GUI幹預的安全設計思路,已經背離了電腦網路系統高效快捷安全的初衷。它在處理使用者/程式/服務/裝置等等系統相關許可權的時候混亂的思路,不僅給使用者帶來了操作不便,也讓自己走上了背離使用者體驗的道路。這與Apple注重使用者體驗的設計思路,完全不同。在如今Apple方式獲得更多使用者和市場認同的形勢中,Microsoft是否也應該反思一下,提高使用者體驗度。
Tony Liu
June 20, 2012
技術參考:http://social.technet.microsoft.com/Forums/en/w7itprosecurity/thread/6822b712-8fc3-4253-8856-25e99f144262