win7下的UAC機制與提升管理員許可權
自己本來想寫這麼個東西。在自己寫的程式中能開啟另一個程式,而這個開啟的程式是直接以管理員身份執行的而不需要彈出什麼“是否要以管理員身份執行的對話方塊”。
那麼我們首先來看一下UAC機制。
下面這些是摘引過來的:
保護Win7安全不得不說的UAC,眾所周知,UAC是User Account Control的縮寫,其中文翻譯為使用者帳戶控制,是微軟在Windows Vista和Win7中引用的新技術,主要功能是進行一些會影響系統安全的操作時,會自動觸發UAC,使用者確認後才能執行
大部分的惡意軟體、木馬病毒、廣告外掛在進入計算機時都會有如:將檔案複製到Windows或Program Files等目錄、安裝驅動、安裝ActiveX等操作,而這些操作都會觸發UAC。面對這些不安全的因素,使用者該如何解決UAC帶來的問題?本文詳細介紹了UAC觸動的詳細功能,並可以在UAC提示時來禁止這些程式的執行。
能夠觸發UAC的操作包括:修改Windows Update配置; 增加或刪除使用者帳戶; 改變使用者的帳戶型別; 改變UAC設定;安裝ActiveX; 安裝或解除安裝程式; 安裝裝置驅動程式; 修改和設定家長控制; 增加或修改登錄檔; 將檔案移動或複製到Program Files或是Windows目錄; 訪問其他使用者目錄UAC很煩是的,微軟自從Windows Vista開始加入了UAC,這也成了人們對VISTA不滿的詬病之一,因為Vista不像Win7一樣可以對 UAC進行級別設定(其實Windows7的UAC也很煩),當時的電腦的普遍配置也很低,所以人們對這個動不動就彈出來,同時還會鎖定螢幕的傢伙很厭惡。
UAC在Win 7中的完善就是因為UAC太煩了,所以微軟在Win 7中,加入了UAC的等級設定功能,分別對應4個級別:
預設級別(2級):
在預設級別下,只有在應用程式試圖改變計算機設定時才會提示使用者,而使用者主動對Windows進行更改設定則不會提示。同時,在該模式下將啟用安全桌面,以防繞過UAC更改系統設定。可以看出,預設級別可以既不干擾使用者的正常操作,又可以有效防範惡意程式在使用者不知情的情況下修改系統設定。一般的使用者都可以採用該級別設定。
比預設級別稍低的級別(1級):
與預設級別稍有不同的是該級別將不啟用安全桌面,也就是說有可能產生繞過UAC更改系統設定的情況。不過一般情況下,如果使使用者啟動某些程式而需要對系統進行修改,可以直接執行,不會產生安全問題。但如果使用者沒有執行任何程式卻彈出提示視窗,則有可能是惡意程式在試圖修改系統設定,此時應果斷選擇阻止。該級別適用於有一定系統經驗的使用者。
最低的級別(0級):
最低的級別則是關閉UAC功能(必須重新啟動後才能生效)。在該級別下,如果是以管理員登入,則所有操作都將直接執行而不會有任何通知,包括病毒或木馬對系統進行的修改。在此級別下,病毒或木馬可以任意連線訪問網路中的其他電腦、甚至與網際網路上的電腦進行通訊或資料傳輸。可見如果完全關閉UAC並以管理員身份登入,將嚴重降低系統安全性。此外,如果是以標準使用者登入,那麼安裝、升級軟體或對系統進行修改和設定,將直接被拒絕而不彈出任何提示,使用者只有獲得管理員許可權才能進行。可見完全關閉UAC並以標準使用者登入,各種操作和設定也非常不方便,因此建議不要選擇該級別。
最高級別(3級):
在高階級別下,“始終通知”(即完全開啟),在該級別下,使用者安裝應用程式、對軟體進行升級、應用程式在任何情況下對作業系統進行更改、更改 Windows設定等情況,都會彈出提示視窗(並啟用安全桌面),請求使用者確認。由此可見該級別是最安全的級別,但同時也是最“麻煩”的級別,適用於多人共用一臺電腦的情況下,限制其他標準使用者,禁止其隨意更改系統設定。
但是UAC很有用UAC雖然經常安裝軟體的人很煩,但UAC的作用卻不容小覷。不得不承認微軟對於作業系統的理念是很超前的,所以經常會搞出一些雖然很棒卻很尷尬的東西,就好像當年的VISTA,在人們開始接受Windows 7的今天,再回頭去看Vista,才越來越意識到VISTA其實是一個很不錯的作業系統,只 不過是生不逢時。
我們在這裡可以更改UAC設定:
如果是以管理員許可權執行的,那麼把它改成最低級別之後,所有的UAC都不會彈出來了。這樣就達到了我們要的效果。
其實是可以在登錄檔裡面修改這個設定的。這裡等下再說。
首先來說說如何讓自己的圖示多出個盾牌。也就是說我們雙擊程式執行的時候啟動UAC機制。
其實是很簡單的。。。。
第一步:
我們隨手寫個helloworld,生成了一個a.exe檔案。
然後在對應目錄下面建立一個可執行檔名.exe.manifest 如果我這裡既是a.exe.manifest
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="VistaLogoDemo" type="win32"/>
<description>Description of your application</description>
<!-- Identify the application security requirements. -->
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
第二步:
現在我們匯入我們寫好的資原始檔:
新增資源匯入manifest檔案命名為RT_MANIFEST,將其ID改為1
第三步:
編譯執行一下,可能會出錯,錯誤如下:
error c1010001: Values of attribute "level" not equal in different manifest snippets. E:\VC2010SP1Samples\C++\MFC\D2D\MFCGdiInteropSample\Debug\MFCGdiInteropSample.exe.intermediate.manifest
雙擊錯誤,這裡出來一個vs自動生成的.manifest檔案
把對應的requestExecutionLevel 更改。在這個例子裡我們改成
requireAdministrator
,再次編譯執行。
如果你不是以管理員許可權開啟的,可能vs會要求你重新啟動來編譯執行:如下圖:
假設我生成的是Release版本,現在檢視下對應資料夾下面的圖示,就多了一個盾牌了。雙擊執行,就會彈出UAC機制了。
接下來說說用登錄檔更改UAC的等級:
鍵值項:
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Policies/System
相關鍵值設定:
UAC高
ConsentPromptBehaviorAdmin = 2
EnableLUA = 1
PromptOnSecureDesktop = 1
UAC中
ConsentPromptBehaviorAdmin = 5
EnableLUA = 1
PromptOnSecureDesktop = 1
UAC低
ConsentPromptBehaviorAdmin = 5
EnableLUA = 1
PromptOnSecureDesktop = 0
UAC關
ConsentPromptBehaviorAdmin = 0
EnableLUA = 0
PromptOnSecureDesktop = 0
注1:相關鍵說明
ConsentPromptBehaviorAdmin 通知強度級別
EnableLUA 是否開啟UAC
PromptOnSecureDesktop 桌面是否變黑
注2:對UAC對級別設定說明
注意必須重新啟動才能生效。