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

时间:2010-05-12 11:09:50

标签: c# .net windows-7 administrator elevated-privileges

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

14 个答案:

答案 0 :(得分:1052)

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

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

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

答案 1 :(得分:148)

在清单中添加requestedExecutionLevel元素只是成功的一半;你必须记住UAC可以被关闭。如果是,您必须执行旧学校方式的检查并在用户不是管理员时设置错误对话框(在您的主题CurrentPrincipal上拨打IsInRole(WindowsBuiltInRole.Administrator))。

答案 2 :(得分:55)

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

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

答案 3 :(得分:55)

详细步骤如下。

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

    Select Application Manifest File

    Select Manifest option

    Update Manifest file

    请注意,使用此代码需要关闭ClickOnce的安全设置,为此,请转到属性 - &gt;安全 - &gt; ClickOnce安全

答案 4 :(得分:42)

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

您可以在 Step 6: Create and Embed an Application Manifest (UAC) (MSDN)中找到更多详细信息。

答案 5 :(得分:19)

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

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

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

OR

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

OR

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

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

答案 6 :(得分:13)

根据

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

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

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

答案 7 :(得分:12)

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

答案 8 :(得分:9)

在代码中执行此操作的另一种方法是检测进程是否像the answer by @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);
}

答案 9 :(得分:7)

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

for (var i = 0; i < 5, i++) {
  myData['db_head_image_description' + (i+1)] = DescriptionModel.header_image.image_description[0];
  myData['db_head_image_heading' + (i+1)] = DescriptionModel.header_image.image_heading[0];      
}

单击它后,将在Project的属性文件夹 app.manifest 下创建一个文件,一旦创建该文件,您可以取消选中Right click on the Project -> Properties -> Security -> Enable ClickOnce Security Settings 选项

打开该文件并更改此行:

Enable ClickOnce Security Settings

为:

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

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

答案 10 :(得分:7)

这是answer的简化版,上面是@NG

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

答案 11 :(得分:0)

如果您出于某种原因需要纯代码解决方案,只需在启动时调用“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);              }
    }

答案 12 :(得分:0)

如果您出于某种原因需要纯代码解决方案,只需在启动时调用“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());
            }
        }
    }

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

        return principal.IsInRole(WindowsBuiltInRole.Administrator);              }
    }

答案 13 :(得分:-3)

右键单击您的可执行文件,转到“属性”&gt;兼容性并选中“以管理员身份运行此程序”框。

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