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

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

578536 次浏览

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

您可以在

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

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

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

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

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

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

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

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

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

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

另一种方法(仅在代码中)是检测进程是否像@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. 将应用程序清单文件添加到项目
  2. 将应用程序设置更改为“app.manifest”
  3. 将“请求执行级别”的标签更新为请求管理员。

在解决方案中添加文件

选择应用程序清单文件

选择清单选项

更新清单文件

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

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

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

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

这并不强制申请作为管理员工作。
这是this回答的简化版本,上面是@NG

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

如果你出于某种原因想要纯代码解决方案,这里有一个独立的类文件。只需在应用程序启动时调用“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);}}