在Win7環境下,當使用普通用戶帳號運行某些應用程序(程序圖標顯示有盾牌)的時候,系統會彈出對話框要求輸入管理員帳號和密碼,不然沒法運行,也就是說這類應用程序只容許管理員運行,普通用戶則徹底沒法運行。但同一應用程序在Win XP環境下卻能基本運行,只是部分功能因沒有管理員權限而沒法使用。爲安全起見,公司電腦通常都不會賦予用戶帳號管理員權限,這樣一來不少程序都會沒法在Win7下運行,會形成至關的不便。安全
這是因爲Windows的UAC(用戶帳戶控制)安全機制致使的。Windows從Vsita開始引入該機制,當應用程序須要進行一些操做系統層面或者影響其餘用戶操做的設置,好比更改控制面板設置、刪除系統文件、修改註冊表等,操做系統便會彈出對話框,提示用戶輸入管理員帳號密碼,得到許可後方能繼續。網絡
UAC的這種臨時提高用戶權限的設計大大提升了Windows的安全性,應用程序的一些操做必需要獲取到管理員用戶的許可方能運行,這樣能夠防止惡意軟件和間諜軟件在未經許可的狀況下在計算機上運行安裝或者對計算機進行更改。ide
凡是圖標顯示有盾牌的可執行文件都須要管理員權限才能徹底正常的運行,但也有可能該應用程序只是部分功能須要管理員權限而已,不少狀況下咱們只需使用應用程序的通常功能,因此咱們須要強制可執行文件以普通用戶權限運行。默認狀況下可執行文件EXE是以當前用戶權限運行的,那麼操做系統是如何知道應用程序須要使用管理員權限運行而彈出對話框提示用戶呢?工具
操做系統是經過讀取manifest清單文件來獲取EXE文件運行所需的權限,Manifest清單文件是一個後綴爲.manifest的XML文件,保存了有關應用程序的配置元數據。該Manifest能夠做爲一個文件存儲在應用程序相同的目錄下,也能夠做爲一種資源嵌入在可執行文件內部。ui
因此咱們能夠經過修改manifest文件來控制應用程序的運行權限,如下爲外置和內置兩種清單文件的修改方法:spa
外置同名manifest文件操作系統
以軟件「一號店在線客服」爲例,軟件安裝後,修改程序目錄(C:\Program Files (x86)\yhd)的文件夾權限,編輯Users用戶組,添加「修改和寫入」權限,在「高級」菜單中,勾選「更改權限」→「使用可今後對象繼承的權限替代全部子對象項目」。而後以普通用戶帳號登錄系統,運行主程序(im-desktop.exe),系統彈出UAC對話框。這時候不管按是或否均沒法運行程序。設計
用記事本編輯跟程序位於同一目錄的im-desktop.exe.manifest文件:xml
<?xml version='1.0' encoding='UTF-8' standalone='yes'?> <assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> <security> <requestedPrivileges> <requestedExecutionLevel level='requireAdministrator' uiAccess='false' /> </requestedPrivileges> </security> </trustInfo> <dependency> <dependentAssembly> <assemblyIdentity type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*' /> </dependentAssembly> </dependency> </assembly>
配置中有一個 requestedExecutionLevel 項,這個項用於配置當前應用請求的執行權限級別。這個項有3個值可供選擇,以下表所示:對象
值 | 做用 |
asInvoker | 應用程序就是以當前的權限運行。 |
highestAvailable |
應用程序以當前用戶能夠得到的最高權限運行 |
requireAdministrator | 應用程序僅以系統管理員權限運行。 |
因此咱們只須要將requestedExecutionLevel項目設置爲asInvoker或者highestAvailable,程序就能以當前用戶帳號正常運行了。
其中,highestAvailable和 requireAdministrator 這兩個選項均可以提示用戶獲取系統管理員權限。兩個選項的區別在哪裏呢?他們的區別在於,若是咱們不是以管理員賬號登陸,而應用程序設置爲requireAdministrator,那麼應用程序就直接運行失敗,沒法啓動,也就是強制程序以管理員帳號運行。而若是設置爲 highestAvailable,則應用程序能夠運行成功,只是以當前賬號的最高權限運行而不是系統管理員權限運行。另外,直接將該manifest文件刪除也能夠強制操做系統以當前用戶運行。
可執行文件內置manifest文件
以軟件「美圖秀秀」爲例,安裝軟件後,使用普通帳號運行程序一樣會彈出UAC對話框,從而致使運行失敗。其manifest清單文件內置在EXE文件裏,沒法直接編輯。
首先下載並安裝可執行文件編輯軟件Resource Hacker(http://www.angusj.com/resourcehacker/)。
接着用管理員帳號運行ResourceHacker軟件(鼠標右鍵主程序以管理員身份運行),而後點擊File→Open,選擇美圖秀秀的主程序Xiuxiu.exe,點擊左側的資源列表中的Manifest→1:1033。
這時候就看到了內置在EXE文件中的清單文件內容了,該文件內容和須要修改的內容都跟以前外置的清單文件同樣,只要將requestedExecutionLevel項目修改成asInvoker或者highestAvailable便可。
修改後點擊工具欄中的Compile Script,接着點擊Save,程序會自動備份原文件爲 XiuXiu_original.exe。
註銷並從新登錄一下當前的普通用戶,運行xiuxiu.exe,程序就能夠順利運行了。
如今愈來愈多應用程序運行時須要提高權限到管理員級別,這樣能夠提升軟件的使用體驗。可是企業辦公電腦因爲安全性和管理的須要,通常不容許賦予普通用戶本機管理員的權限,這樣一來會不少軟件都沒法使用。經過關閉UAC功能或者修改manifest清單文件均可以令普通用戶能基本運行這類應用程序,不過,關閉UAC後,即與XP環境軟件的運行機制相似,只能經過鼠標右鍵選擇「運行爲」來提高運行權限,並且基於安全性的考慮,不建議關閉UAC功能。須要注意的是,修改清單文件後不能保證軟件能夠百分百正常運行,修改後有時須要註銷再登錄當前用戶或者重啓系統纔會生效,還有,清單文件修改前要注意對EXE文件和manifest文件原文件作好備份。
原文爲博主所著,並刊登於《網絡安全和信息化》雜誌2016.05期。