关于C#:如何强制.NET应用程序以管理员身份运行?

How do I force my .NET application to run as administrator?

一旦我的程序安装在客户机上,如何强制我的程序在Windows7上以管理员身份运行?


您将要修改嵌入到程序中的清单。这适用于Visual Studio 2008及更高版本:Project+添加新项,选择"应用程序清单文件"。将元素更改为:

1
 <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

用户启动程序时会得到UAC提示。明智地使用;他们的耐心会很快耗尽。


在您的清单中添加一个requestedExecutionLevel元素只是战斗的一半;您必须记住,UAC可以关闭。如果是的话,如果用户不是管理员,则必须执行检查旧的方法并弹出错误对话框
(在线程的CurrentPrincipal上调用IsInRole(WindowsBuiltInRole.Administrator))。


我实现了一些手动操作的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System.Security.Principal;
public bool IsUserAdministrator()
{
    bool isAdmin;
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch (UnauthorizedAccessException ex)
    {
        isAdmin = false;
    }
    catch (Exception ex)
    {
        isAdmin = false;
    }
    return isAdmin;
}


具体步骤如下。

  • 将应用程序清单文件添加到解决方案
  • 将应用程序设置更改为"app.manifest"
  • 将"requestedExecutionLevel"的标记更新为requireAdministrator。
  • Adding file in Solution

    Select Application Manifest File

    Select Manifest option

    Update Manifest file

    请注意,使用此代码需要关闭ClickOnce的安全设置,为此,请进入"属性"->"安全性"->"ClickOnce安全性"。


    可以在exe文件中嵌入清单文件,这将导致Windows(7或更高版本)始终以管理员身份运行程序。

    您可以在步骤6中找到更多详细信息:创建和嵌入应用程序清单(UAC)(msdn)。


    在使用Visual Studio 2008时,右键单击Project -> Add New Item,然后选择Application Manifest File

    在清单文件中,您将找到标签requestedExecutionLevel,您可以将级别设置为三个值:

    要将应用程序设置为以管理员身份运行,必须选择中间的一个。


    按照

    1
    <requestedExecutionLevel level="highestAvailable" uiAccess="false" />

    如果您还没有或不知道如何添加应用程序清单,您将希望添加一个应用程序清单。由于某些项目不会自动添加单独的清单文件,请首先转到"项目属性",导航到"应用程序"选项卡并检查以确保您的项目不排除龙头底部的清单。

    • 下一步,右键单击"项目"
    • 添加新项目
    • 最后,查找并单击应用程序清单文件

    在Visual Studio 2010中,右键单击项目名称。点击"查看Windows设置",这将生成并打开一个名为"app.manifest"的文件。在此文件中,将"asinvoker"替换为"RequireAdministrator",如文件中注释部分所述。


    另一种实现这一点的方法(仅限代码)是检测进程是否以管理员的身份运行,就像@ng.在答案中那样。然后再次打开应用程序并关闭当前应用程序。

    当应用程序仅在某些条件下运行时需要管理员权限时(如将其自身安装为服务时),我使用此代码。所以它不需要像其他答案一样一直以管理员身份运行。

    注:在下面的代码中,NeedsToRunAsAdmin是一种检测当前条件下是否需要管理员权限的方法。如果返回false,代码将不会提升自身。这是这种方法相对于其他方法的一个主要优势。

    尽管此代码具有上述优点,但它确实需要作为一个新的过程重新启动自己,而这并不总是您想要的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    private static void Main(string[] args)
    {
        if (NeedsToRunAsAdmin() && !IsRunAsAdmin())
        {
            ProcessStartInfo proc = new ProcessStartInfo();
            proc.UseShellExecute = true;
            proc.WorkingDirectory = Environment.CurrentDirectory;
            proc.FileName = Assembly.GetEntryAssembly().CodeBase;

            foreach (string arg in args)
            {
                proc.Arguments += String.Format(""{0}"", arg);
            }

            proc.Verb ="runas";

            try
            {
                Process.Start(proc);
            }
            catch
            {
                Console.WriteLine("This application requires elevated credentials in order to operate correctly!");
            }
        }
        else
        {
            //Normal program logic...
        }
    }

    private static bool IsRunAsAdmin()
    {
        WindowsIdentity id = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(id);

        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }

    这是这个答案的简化版本,上面是@ng

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public bool IsUserAdministrator()
    {
        try
        {
            WindowsIdentity user = WindowsIdentity.GetCurrent();
            WindowsPrincipal principal = new WindowsPrincipal(user);
            return principal.IsInRole(WindowsBuiltInRole.Administrator);
        }
        catch
        {
            return false;
        }
    }

    您可以使用ClickOnce安全设置创建清单,然后禁用它:

    1
    Right click on the Project -> Properties -> Security -> Enable ClickOnce Security Settings

    单击后,将在项目的属性文件夹app.manifest下创建一个文件。创建后,可以取消选中Enable ClickOnce Security Settings选项。

    打开该文件并更改此行:

    1
    <requestedExecutionLevel level="asInvoker" uiAccess="false" />

    到:

    1
     <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />

    这将使程序需要管理员权限。


    右键单击可执行文件,转到属性>兼容性并选中"以管理员身份运行此程序"框。

    如果要将其作为所有用户的管理员运行,请在"更改所有用户的设置"中执行相同的操作。