1. 程式人生 > >win7下的UAC機制與提升管理員許可權

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對級別設定說明

注意必須重新啟動才能生效。