2013/04/04

C#.Net 取得最高權限 UAC(User Account Control)

Vista剛出來時候有推出一個安全機制,叫做『UAC』;
UAC全名又為User Account Control,其功能會限制程式的權限,並降低病毒或惡意程式的風險

UAC又有分三個等級,requireAdministrator、highestAvailable以及asInvoker

requireAdministrator:要求取得最高管理者權限
highestAvailable:會取得目前的使用者權限,如果有要用到管理者權限則會提示
asInvoker:一般程式權限

有找到一篇比較requireAdministrator與highestAvailable之間差異的文章『Difference between “highestAvailable” and “requireAdministrator” in manifest in terms of Elevation?』,有興趣的人可以看一下




在目前專案按下右鍵/加入/新增項目


選擇『應用程式資訊清單檔案』


再依程式權限去調整就好了

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <assemblyIdentity version="1.0.0.0" name="MyApplication.app" />
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
        <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
        <!-- UAC 資訊清單選項
            如果您要變更 Windows 使用者帳戶控制層級,請將
            requestedExecutionLevel 節點取代為下列其中一項。

        <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
        <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
        <requestedExecutionLevel  level="highestAvailable" uiAccess="false" />

            指定 requestedExecutionLevel 節點會停用檔案和登錄虛擬化。
            如果您要針對回溯相容性使用檔案及登錄虛擬化,
            請刪除 requestedExecutionLevel 節點。
        -->
      </requestedPrivileges>
    </security>
  </trustInfo>

  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
    <application>
      <!-- 可配合此應用程式使用的所有 Windows 版本的清單。Windows 會自動選取最相容的環境。-->

      <!-- 如果您的應用程式是設計成配合 Windows 7 運作,請取消註解下列 supportedOS 節點-->
      <!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />-->
    </application>
  </compatibility>

  <!-- 啟用 Windows 通用控制項和對話方塊的佈景主題 (Windows XP 以後版本) -->
  <!-- <dependency>
    <dependentAssembly>
      <assemblyIdentity
          type="win32"
          name="Microsoft.Windows.Common-Controls"
          version="6.0.0.0"
          processorArchitecture="*"
          publicKeyToken="6595b64144ccf1df"
          language="*"
 />
    </dependentAssembly>
  </dependency>-->
</asmv1:assembly>

參考資料:
http://code.msdn.microsoft.com/windowsdesktop/CSUACSelfElevation-644673d3
http://en.wikipedia.org/wiki/User_Account_Control
http://gelis-dotnet.blogspot.tw/2009/06/manifestvista.html
http://msdn.microsoft.com/zh-tw/library/bb384608.aspx
http://technet.microsoft.com/en-us/library/0d75f774-8514-4c9e-ac08-4c21f5c6c2d9
http://technet.microsoft.com/en-us/library/00d04415-2b2f-422c-b70e-b18ff918c281