首頁 >後端開發 >C#.Net教程 >詳細介紹C#預設以管理員身分執行程式範例程式碼

詳細介紹C#預設以管理員身分執行程式範例程式碼

黄舟
黄舟原創
2017-03-14 13:47:023299瀏覽

font-family:'Microsoft YaHei'; font-size:24px">一、透過設定檔實作以管理員身分執行程式

Vista 和Windows 7 作業系統為了加強安全性,增加了UAC(使用者帳戶控制)的機制,如果UAC 被打開,用戶即使是以管理員權限登錄,其應用程式默認情況下也無法對系統目錄,系統註冊表等可能影響系統運行的設定進行寫入操作。安全性,但對應用程式開發者來說,我們不能強迫使用者去關閉UAC,但有時我們開發的應用程式又需要以Administrator 的方式運行,即Win7 中以as administrator 方式運行,那麼我們怎麼來實現這樣的功能呢?編寫的應用程式預設是不會彈出這個提示的,也無法以管理員權限運行。在專案中增加一個Application Man

if

est File

#預設的設定如下:

2aaf03e419584feed0654e5769a6311a
af69af555fb71efffa5a2b73610189d3
  1fd5985ee16d136d0e6ef78db7b2308b
  f560251b6a20897d09156a597d9f040e
    9508b1f164efb2015f73af08732650fc
      3426a22aa48b4bc00f556a5b6b4a9447
        dfb34861a4333e61cbd6ff39e54db7e3
        f0d4bacee36971d13868a143966bbefd
        5963a0b5cd76781a42eeaa7bee625065
            If you want to utilize File and Registry Virtualization for backward
            compatibility then delete the requestedExecutionLevel node.
        -->
        92e66feba285a57f20e9f0f143b0d32a
      c3aca22a047a003888d4809860c6817a
    31ede3b82b5d181b27e77cc95deae041
  c3b68afd42c2202b387345eb8309d7c2
68414a759ee37711ded5ae4a6075cf5c
我們可以看到這個配置中有一個requestedExecutionLevel 項,這個項用來配置目前應用請求的執行權限等級。 #Value

Description

Comment

asInvokerThe application runs with the same access token as the parent process .enddocumentcurrentrequireAdministrator
Recommed for standard user applications. Do refractoring with internal elevation points, as per the guidance provided earlier in this .
highestAvailable The application runs with the highest privileges the user can obtain.#Recommended for mixed-mode applications. Plan to refractor the application in a future release.
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)

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

2aaf03e419584feed0654e5769a6311a
60bbe233cf06337e0e65dbaa5f44e02c
  1fd5985ee16d136d0e6ef78db7b2308b
  f560251b6a20897d09156a597d9f040e
    9508b1f164efb2015f73af08732650fc
      3426a22aa48b4bc00f556a5b6b4a9447
        4d6ce38d92d8b695781d014536bedd8b
        f0d4bacee36971d13868a143966bbefd
        5963a0b5cd76781a42eeaa7bee625065
            If you want to utilize File and Registry Virtualization for backward 
            compatibility then delete the requestedExecutionLevel node.
        -->
        0fa17fcd26d23735e0158d444f4642d9
      c3aca22a047a003888d4809860c6817a
    31ede3b82b5d181b27e77cc95deae041
  c3b68afd42c2202b387345eb8309d7c2
68414a759ee37711ded5ae4a6075cf5c
配置文件修改后,我们运行应用程序,就会首先弹出这样一个提示框,点 Yes 后,程序才可以继续运行,并且获得系统管理员的权限。
.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; }


下面再来看看程序如何知道当前运行在系统管理员权限还是非系统管理员权限:

        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; }


这段代码可以用于判断当前程序是否运行在系统管理员权限下。如果配置为 asInvoker,在win7 下,这个函数会返回 false ,如果是 requireAdministrator  则返回 true。

二、通过编程以管理员身份运行程序

在读写注册表“HKEY_LOCAL_MACHINE\SOFTWARE\”下的项时,明明注册表中有,但程序OpenSubKey始终返回Null,考虑到可能是因为权限的原因,于是我以管理员身份运行了一次,结果测试成功!原来真的是权限的问题,于是就在程序里面加入了默认以管理员身份运行的代码。下面让我们看看是怎么实现的吧!


程序默认以管理员身份运行

static void Main(string[] Args)
        {
            /**
             * 当前用户是管理员的时候,直接启动应用程序
             * 如果不是管理员,则使用启动对象启动程序,以确保使用管理员身份运行
             */
            //获得当前登录的Windows用户标示
            System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
            //创建Windows用户主题
            Application.EnableVisualStyles();

            System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity);
            //判断当前登录用户是否为管理员
            if (principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator))
            {
                //如果是管理员,则直接运行

                Application.EnableVisualStyles();
                Application.Run(new Form1());
            }
            else
            {
                //创建启动对象
                System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
                //设置运行文件
                startInfo.FileName = System.Windows.Forms.Application.ExecutablePath;
                //设置启动参数
                startInfo.Arguments = String.Join(" ", Args);
                //设置启动动作,确保以管理员身份运行
                startInfo.Verb = "runas";
                //如果不是管理员,则启动UAC
                System.Diagnostics.Process.Start(startInfo);
                //退出
                System.Windows.Forms.Application.Exit();
            }
        }

打开程序集里的Program.cs文件,并将其中Main方法中的代码替换为以上代码即可实现程序默认以管理员身份运行。


以上是詳細介紹C#預設以管理員身分執行程式範例程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn