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

Gol*_*old 838 .net c# administrator windows-7 elevated-privileges

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

Han*_*ant 1100

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

 <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
Run Code Online (Sandbox Code Playgroud)

用户在启动程序时会收到UAC提示.明智地使用; 他们的耐心很快就会消失.

  • 如果在尝试编译时遇到ClickOnce错误,请参阅以下答案:http://stackoverflow.com/questions/11023998/clickonce-does-not-support-the-request-execution-level-requireadministrator/11036922#11036922 (31认同)
  • 您的项目也必须设置为使用应用程序清单 - 在项目属性中,选中"应用程序"选项卡,并确保"资源"下的"清单:"设置为您的app.manifest(或任何您命名为.清单文件). (17认同)
  • 我不得不重新加载项目VS之前会提示我在管理模式下重启. (7认同)
  • @ErikFunkenbusch它不会"以管理员身份自动运行",它将在用户的正常权限下运行(如果用户是管理员,则为admin;如果用户是标准,则为标准).依靠这个特殊情况,即使它是默认情况,也是好的程序会像瘟疫一样避免的.按照你的比喻,花式锁很好,但是设计合理的软件必须预见到整个门被移除的情况,即使它很少发生. (4认同)
  • @Alejandro - 是的,UAC可以被禁用,但是当这样时,应用程序将自动以管理员身份运行(假设您的用户具有管理员权限),因为禁用UAC意味着所有内容都以允许用户的最高权限运行.这有点像抱怨如果你在门上安装一个花式锁,如果门被拆除它将无法工作. (3认同)
  • 请注意,这不会“强制”程序以管理员身份运行。可以禁用UAC。实际上,任何事情都不能*强制*特定用户帐户下的程序。 (2认同)

And*_*ers 151

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

  • 您也可以使用`<requestedExecutionLevel level ="highestAvailable"uiAccess ="false"/>` (22认同)
  • @MarkKram:highAvailable与此有什么关系?问题是强制管理员,highestAvailable比requireAdministrator限制性更小,并且让非管理员用户在没有UAC提示的情况下启动应用程序,只有管理员会被提示... (18认同)
  • [这是一个MSN的'IsInRole`]示例(https://msdn.microsoft.com/en-us/library/system.security.principal.windowsbuiltinrole.aspx),Anders谈到. (3认同)

Has*_*man 70

详细步骤如下.

  1. 将应用程序清单文件添加到解决
  2. 将应用程序设置更改为"app.manifest"
  3. 将"requestedExecutionLevel"的标记更新为requireAdministrator.

在解决方案中添加文件

选择应用程序清单文件

选择清单选项

更新清单文件

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


NG.*_*NG. 59

我实现了一些手动执行的代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

  • 这仅检测上下文是否以管理员身份运行,它不会使应用程序按照OP的请求以管理员身份运行 (42认同)
  • 虽然你的解决方案很好但问题却不同.;) (6认同)
  • 我认为没有任何程序化方法可以强制应用程序提升自己的权限.如果有,这将是相当大的安全风险,不是吗? (5认同)

Dav*_*vid 42

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

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


小智 19

在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" />

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


小智 13

按照

<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
Run Code Online (Sandbox Code Playgroud)

如果您还没有应用程序清单,或者您不知道如何添加应用程序清单,则需要添加应用程序清单.由于某些项目不会自动添加单独的清单文件,因此首先转到项目属性,导航到" 应用程序"选项卡,然后检查以确保项目不排除点击底部的清单.

  • 接下来,右键单击项目
  • 添加新项目
  • 最后,找到并单击Application Manifest File


小智 12

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

  • 这个答案是关于VB.NET :-),而不是VS 2010."添加新项"答案是关于C#的.在C++中,您可以在项目设置中执行此操作. (6认同)

The*_*der 11

在代码中执行此操作的另一种方法是在@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);
}
Run Code Online (Sandbox Code Playgroud)


Yoc*_*mer 9

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

Right click on the Project -> Properties -> Security -> Enable ClickOnce Security Settings
Run Code Online (Sandbox Code Playgroud)

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

打开该文件并更改此行:

<requestedExecutionLevel level="asInvoker" uiAccess="false" />
Run Code Online (Sandbox Code Playgroud)

至:

 <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
Run Code Online (Sandbox Code Playgroud)

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


Gas*_*a79 9

如果您出于某种原因需要纯代码解决方案,这里有一个独立的类文件。只需在应用程序启动时调用“AdminRelauncher.RelaunchIfNotAdmin()”即可:

using System;
using System.Diagnostics;
using System.Reflection;
using System.Security.Principal;

public static class AdminRelauncher
{
    public static void RelaunchIfNotAdmin()
    {
        if (!RunningAsAdmin())
        {
            Console.WriteLine("Running as admin required!");
            ProcessStartInfo proc = new ProcessStartInfo();
            proc.UseShellExecute = true;
            proc.WorkingDirectory = Environment.CurrentDirectory;
            proc.FileName = Assembly.GetEntryAssembly().CodeBase;
            proc.Verb = "runas";
            try
            {
                Process.Start(proc);
                Environment.Exit(0);
            }
            catch (Exception ex)
            {
                Console.WriteLine("This program must be run as an administrator! \n\n" + ex.ToString());
                Environment.Exit(0);
            }
        }
    }

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

        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
}
Run Code Online (Sandbox Code Playgroud)


Hak*_*tık 8

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

public bool IsUserAdministrator()
{
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch
    {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这并不能回答问题! (3认同)