如何强制. NET 应用程序以管理员身份运行?

将程序安装在客户端计算机上后,如何强制程序在 Windows 7 上以管理员身份运行?

答案

您将需要修改嵌入到程序中的清单。这适用于 Visual Studio 2008 和更高版本:Project + Add New Item,选择 “Application Manifest File”。将<requestedExecutionLevel>元素更改为:

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

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

向清单中添加一个requestedExecutionLevel元素仅是成功的一半。您必须记住可以关闭UAC 。如果是这样,如果用户不是管理员,则必须执行旧的检查方式并显示错误对话框
(在线程的CurrentPrincipal上调用IsInRole(WindowsBuiltInRole.Administrator) )。

详细步骤如下。

  1. 将应用清单文件添加到解决方案
  2. 将应用程序设置更改为 “app.manifest”
  3. 将 “requestedExecutionLevel” 标签更新为 requireAdministrator。

在解决方案中添加文件

选择应用程序清单文件

选择清单选项

更新清单文件

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

我实现了一些代码来手动执行此操作:

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

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

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

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

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

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

要么

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

要么

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

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

按照

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

如果您尚未添加或不知道如何添加应用程序清单,则需要添加该清单。由于某些项目不会自动添加单独的清单文件,因此首先转到项目属性,导航至 “ 应用程序”选项卡,然后检查以确保您的项目不排除水龙头底部的清单。

  • 接下来,右键单击项目
  • 新增项目
  • 最后,找到并单击 “应用程序清单文件”

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

做到这一点的另一种方法(仅在代码中)是检测进程是否以 admin 的身份运行,就像@NG 的答案一样。 。然后再次打开该应用程序并关闭当前的应用程序。

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

请注意,下面的代码NeedsToRunAsAdmin是一种检测在当前条件下是否需要管理员特权的方法。如果返回false则代码本身不会提升。这是该方法相对于其他方法的主要优点。

尽管此代码具有上述优点,但确实需要将其重新启动为新流程,但这并不总是您想要的。

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

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

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

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

打开该文件并更改此行:

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

至:

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

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