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


875

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


3
除了Binary Worrier所写的内容之外,您可能还想编写一些代码来测试您是否具有管理员权限..(这是您所要的吗?)
lexu 2010年

38
不过,我不会掉以轻心,您应该验证它实际需要管理员执行的操作,看看您是否可以解决该问题。没有客户会一直高兴地在管理模式下运行应用程序。很多较大的客户甚至不会考虑使用这样的应用程序,并且如果徽标测试对您很重要,它将不会那样通过。
亚历克斯(Alex)2010年

2
亚历克斯非常有意思。如果可能,请仅在必要时进行提升,否则,组策略,UAC和许多其他变量将起作用。至少,对于UAC,用户必须在每次运行时进行授权,而不是仅在执行特定用户操作时才授权。
Anthony Mason

正确的方法是将清单文件嵌入到您的应用程序中。
Elmue

Answers:


1144

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

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

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


33
如果你在编译的时候一个ClickOnce错误,看到这样的回答:stackoverflow.com/questions/11023998/...
SSS

17
您的项目也必须设置为也使用应用程序清单-在“项目属性”中,检查“应用程序”标签,并确保将“资源”下的“清单:”设置为app.manifest(或任何名为的名称)。清单文件)
Victor Chelaru '16

7
在VS提示我以管理方式重启之前,我不得不重新加载项目。
乔恩

3
@Alejandro-是的,可以禁用UAC,但是那样的话,该应用程序将以管理员身份自动运行(假设您的用户具有管理员权限),因为禁用UAC意味着所有操作均以允许用户的最高权限运行。这有点像在抱怨说,如果您在门上安装了精美的锁,那么如果移开门,它将无法正常工作。
Erik Funkenbusch '18年

4
@ErikFunkenbusch不会“以管理员身份自动运行”,它将在用户的正常权限下运行(如果用户为admin,则为admin;如果用户为标准,则为standard)。即使是默认情况,依靠这种特殊情况,也是好的程序将避免像瘟疫那样避免的事情。按照您的类比,花式锁非常好,所有但设计合理的软件都必须预见到整个门都被拆除的情况,即使这种情况很少发生。
亚历杭德罗

154

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


22
你也可以使用 <requestedExecutionLevel level="highestAvailable" uiAccess="false" /> ,以及
马克·克拉姆

18
@MarkKram:highestAvailable与这个有什么关系?这个问题是关于强制管理员的,highestAvailable的限制比requireAdministrator的限制少,它将使非管理员用户在没有UAC提示的情况下无需提升就启动应用程序,只有管理员会得到提示...
Anders


我不再记得确切的细节了,但是我认为这取决于您所说的残疾人。完全将“ UAC滑块”放到底部与禁用UAC(在Vista上除外)不同。如果完全禁用了UAC,则会禁用整个完整性级别机制,并且仅可使用2000 / XP中的经典runas.exe功能。管理员角色检查处理runas.exe情况。
安德斯

1
我已在Server 2008 R2上将EnableLUA设置为0,并将自己从Administrators组中删除,重新启动后,现在运行了一个指定level =“ requireAdministrator”的exe,没有任何提示即可运行
Tal Aloni

86

详细步骤如下。

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

在解决方案中添加文件

选择应用程序清单文件

选择清单选项

更新清单文件

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


New Item...不是我的Installer Service项目的选项。我将如何添加应用清单?我可以将其添加到我的主项目中,但不能将其添加到安装程序中。
HackSlash

61

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

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

45
这只会检测上下文是否以Admin身份运行,它不会按照OP的要求强制应用程序以Admin身份运行
Matt

5
我认为没有任何编程方式可以强制应用程序提升自身权限。如果存在,那将是相当大的安全风险,不是吗?
马克·里奇曼

6
尽管您的解决方案很好,但问题却有所不同。;)
Yash

请在此处查看此方法的重构版本stackoverflow.com/a/50186997(主观)
HakanFıstık18年

这不能回答问题!
Elmue


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

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


这可行。但是,它在运行CMD应用程序时(使用c#cmd应用程序在后台运行某些exe)使空白的cmd窗口出现。
WM

13

按照

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

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

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

12

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


6
这个答案是关于VB.NET :-)的,而不是VS 2010。“添加新项”答案与C#有关。在C ++中,您可以在项目设置中执行此操作。
Philm 2013年

12

做到这一点的另一种方法(仅在代码中)是检测进程是否以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);
}

1
+1(仅代码方式)。请注意,您需要启用UAC,才能有机会以runas非管理员用户身份以管理员身份启动任何操作,否则它将以当前用户权限以静默方式打开(在Windows 7 64位上选中)。据我所知,禁用UAC且缺少管理员权限的唯一操作是在适当的时候停止执行。
realnice

9

您可以使用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" />

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


7

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

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

1
这不能回答问题!
Elmue

@Elmue将您的评论添加到我刚刚重构的原始答案中比较合乎逻辑,您可以在我的文章中找到指向该答案的链接。
哈坎·菲斯蒂克(HakanFıstık),

-3

右键单击您的可执行文件,转到“属性”>“兼容性”,然后选中“以管理员身份运行该程序”框。

如果要以管理员身份对所有用户运行它,请在“更改所有用户的设置”中执行相同的操作。


4
这不能回答问题。“一旦我的程序安装在客户端计算机上”,而不是“我如何”。
2014年

抱歉,不清楚。安装程序后,请在可执行文件的属性(您的主程序,而不是安装程序)的属性中更改此设置。他确实想强迫他的程序以管理员身份运行。
SlickJayD 2014年

2
最好在清单中设置管理要求。我认为它回答了这个问题,但几乎没有。
BradleyDotNET

3
@Joe坦白地说,接受的答案不能回答OPs的问题,因为要求您重新安装应用程序exe。对于“一旦安装了我的程序”,这几乎不是解决方案。如果这个被低估的答案比被接受的答案更正确,那么我不明白为什么该答案获得了400多个投票。
NickG 2014年

实际上,它完美地回答了两个问题。一旦安装了清单,更改清单的机会就很小,并且在许多环境中程序一旦运行就不应尝试提升其权限-这是被称为恶意软件的好途径。在大多数公司中,这个答案是最好的,因为它给用户及其权限带来了负担。我编写了很多代码,这些代码一旦投入生产,便无法“看到”或运行。尽量不要比您自己的安全性问题更聪明。
jinzai
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.