西西軟件園多重安全檢測下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁編程開發(fā)C#.NET → 編寫C#程序讓其在Win7 下以管理員權(quán)限運行

編寫C#程序讓其在Win7 下以管理員權(quán)限運行

相關(guān)軟件相關(guān)文章發(fā)表評論 來源:西西整理時間:2011/4/22 11:10:34字體大。A-A+

作者:西西點擊:2587次評論:0次標(biāo)簽: 管理員權(quán)限

  • 類型:系統(tǒng)優(yōu)化大小:214KB語言:中文 評分:4.4
  • 標(biāo)簽:
立即下載

Vista 和 Windows 7 操作系統(tǒng)為了加強(qiáng)安全,增加了 UAC(用戶賬戶控制) 的機(jī)制,如果 UAC 被打開,用戶即使是以管理員權(quán)限登錄,其應(yīng)用程序默認(rèn)情況下也無法對系統(tǒng)目錄,系統(tǒng)注冊表等可能影響系統(tǒng)運行的設(shè)置進(jìn)行寫操作。這個機(jī)制大大增強(qiáng)了系統(tǒng)的安全性,但對應(yīng)用程序開發(fā)者來說,我們不能強(qiáng)迫用戶去關(guān)閉UAC,但有時我們開發(fā)的應(yīng)用程序又需要以 Administrator 的方式運行,即 Win7 中 以 as administrator 方式運行,那么我們怎么來實現(xiàn)這樣的功能呢?

我們在 win7 下運行一些安裝程序時,會發(fā)現(xiàn)首先彈出一個對話框,讓用戶確認(rèn)是否同意允許這個程序改變你的計算機(jī)配置,但我們編寫的應(yīng)用程序默認(rèn)是不會彈出這個提示的,也無法以管理員權(quán)限運行。本文介紹了 C# 程序如何設(shè)置來提示用戶以管理員權(quán)限運行。

首先在項目中增加一個 Application Manifest File

默認(rèn)的配置如下:

<?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">
        <!-- 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>
</asmv1:assembly>

我們可以看到這個配置中有一個 requestedExecutionLevel 項,這個項用于配置當(dāng)前應(yīng)用請求的執(zhí)行權(quán)限級別。這個項有3個值可供選擇,如下表所示:

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 mixed-mode 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 : 如果選這個,應(yīng)用程序就是以當(dāng)前的權(quán)限運行。

highestAvailable: 這個是以當(dāng)前用戶可以獲得的最高權(quán)限運行。

requireAdministrator: 這個是僅以系統(tǒng)管理員權(quán)限運行。

默認(rèn)情況下是 asInvoker。

highestAvailable 和 requireAdministrator 這兩個選項都可以提示用戶獲取系統(tǒng)管理員權(quán)限。那么這兩個選項的區(qū)別在哪里呢?

他們的區(qū)別在于,如果我們不是以管理員帳號登錄,那么如果應(yīng)用程序設(shè)置為 requireAdministrator ,那么應(yīng)用程序就直接運行失敗,無法啟動。而如果設(shè)置為 highestAvailable,則應(yīng)用程序可以運行成功,但是是以當(dāng)前帳號的權(quán)限運行而不是系統(tǒng)管理員權(quán)限運行。如果我們希望程序在非管理員帳號登錄時也可以運行(這種情況下應(yīng)該某些功能受限制) ,那么建議采用 highestAvailable 來配置。

關(guān)于requestedExecutionLevel 設(shè)置的權(quán)威文檔請參考下面鏈接:

Create and Embed an Application Manifest (UAC)

下面是修改后的配置文件:

<?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">
        <!-- 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>
</asmv1:assembly>
配置文件修改后,我們運行應(yīng)用程序,就會首先彈出這樣一個提示框,點 Yes 后,程序才可以繼續(xù)運行,并且獲得系統(tǒng)管理員的權(quán)限。
.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

下面再來看看程序如何知道當(dāng)前運行在系統(tǒng)管理員權(quán)限還是非系統(tǒng)管理員權(quán)限:

        public static bool IsAdministrator()
        {
            WindowsIdentity identity = WindowsIdentity.GetCurrent();
            WindowsPrincipal principal = new WindowsPrincipal(identity);
            return principal.IsInRole(WindowsBuiltInRole.Administrator);
        }
.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

這段代碼可以用于判斷當(dāng)前程序是否運行在系統(tǒng)管理員權(quán)限下。如果配置為 asInvoker,在win7 下,這個函數(shù)會返回 false ,如果是 requireAdministrator  則返回 true。

    相關(guān)評論

    閱讀本文后您有什么感想? 已有人給出評價!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過難過
    • 5 囧
    • 3 圍觀圍觀
    • 2 無聊無聊

    熱門評論

    最新評論

    發(fā)表評論 查看所有評論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)