熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

C# WinForm判斷程序是否以管理員身份運行

2013-11-13 10:40:19  來源: .NET編程 

  Vista 和 Windows 操作系統為了加強安全增加了 UAC(用戶賬戶控制) 的機制如果 UAC 被打開用戶即使是以管理員權限登錄其應用程序默認情況下也無法對系統目錄系統注冊表等可能影響系統運行的設置進行寫操作這個機制大大增強了系統的安全性但對應用程序開發者來說我們不能強迫用戶去關閉UAC但有時我們開發的應用程序又需要以 Administrator 的方式運行即 Win 中 以 as administrator 方式運行那麼我們怎麼來實現這樣的功能呢?

  我們在 win 下運行一些安裝程序時會發現首先彈出一個對話框讓用戶確認是否同意允許這個程序改變你的計算機配置但我們編寫的應用程序默認是不會彈出這個提示的也無法以管理員權限運行本文介紹了 C# 程序如何設置來提示用戶以管理員權限運行 首先在項目中增加一個 Application Manifest File   C# WinForm判斷程序是否以管理員身份運行
    默認的配置如下   <?xml version="" encoding="utf"?>
<asmv:assembly manifestVersion="" xmlns="urn:schemasmicrosoftcom:asmv
xmlns:asmv="urn:schemasmicrosoftcom:asmv" xmlns:asmv="urn:schemasmicrosoftcom:asmv
xmlns:xsi="
<assemblyIdentity version="" name="MyApplicationapp"/>
<trustInfo xmlns="urn:schemasmicrosoftcom:asmv">
<security>
<requestedPrivileges xmlns="urn:schemasmicrosoftcom:asmv">
<! UAC Manifest Options
If you want to change the Windows User Account Control level replace the
requestedExecutionLevel node with one of the following

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

If you want to utilize File and Registry Virtualization for backward
compatibility then delete the requestedExecutionLevel node
>
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
</asmv:assembly>

  我們可以看到這個配置中有一個 requestedExecutionLevel 項這個項用於配置當前應用請求的執行權限級別這個項有個值可供選擇如下表所示

   Value Description Comment asInvoker The application runs with the same access token as the parent process Recommended for standard user applications Do refractoring with internal elevation points as per the guidance provided earlier in this document highestAvailable The application runs with the highest privileges the current user can obtain Recommended for mixedmode applications Plan to refractor the application in a future release requireAdministrator The application runs only for administrators and requires that the application be launched with the full access token of an administrator Recommended for administrator only applications Internal elevation points are not needed The application is already running elevated

  asInvoker : 如果選這個應用程序就是以當前的權限運行

  highestAvailable: 這個是以當前用戶可以獲得的最高權限運行

  requireAdministrator: 這個是僅以系統管理員權限運行

  默認情況下是 asInvoker

  highestAvailable 和 requireAdministrator 這兩個選項都可以提示用戶獲取系統管理員權限那麼這兩個選項的區別在哪裡呢?

  他們的區別在於如果我們不是以管理員帳號登錄那麼如果應用程序設置為 requireAdministrator 那麼應用程序就直接運行失敗無法啟動而如果設置為 highestAvailable則應用程序可以運行成功但是是以當前帳號的權限運行而不是系統管理員權限運行如果我們希望程序在非管理員帳號登錄時也可以運行(這種情況下應該某些功能受限制) 那麼建議采用 highestAvailable 來配置

  關於requestedExecutionLevel 設置的權威文檔請參考下面鏈接

  Create and Embed an Application Manifest (UAC)

下面是修改後的配置文件
  <?xml version="" encoding="utf"?>
<asmv:assembly manifestVersion="" xmlns="urn:schemasmicrosoftcom:asmv
xmlns:asmv="urn:schemasmicrosoftcom:asmv" xmlns:asmv="urn:schemasmicrosoftcom:asmv"
xmlns:xsi="
<assemblyIdentity version="" name="MyApplicationapp"/>
<trustInfo xmlns="urn:schemasmicrosoftcom:asmv">
<security>
<requestedPrivileges xmlns="urn:schemasmicrosoftcom:asmv">
<! UAC Manifest Options
If you want to change the Windows User Account Control level replace the 
requestedExecutionLevel node with one of the following

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

If you want to utilize File and Registry Virtualization for backward 
compatibility then delete the requestedExecutionLevel node
>
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
</asmv:assembly>  

  配置文件修改後我們運行應用程序就會首先彈出這樣一個提示框點 Yes 後程序才可以繼續運行並且獲得系統管理員的權限

 
    下面再來看看程序如何知道當前運行在系統管理員權限還是非系統管理員權限
using SystemSecurityPrincipal   public static bool IsAdministrator()
{
WindowsIdentity identity = WindowsIdentityGetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(identity);
return principalIsInRole(WindowsBuiltInRoleAdministrator);
}  

  這段代碼可以用於判斷當前程序是否運行在系統管理員權限下如果配置為 asInvoker在win這個函數會返回 false 如果是 requireAdministrator 則返回 true


From:http://tw.wingwit.com/Article/program/net/201311/14263.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.