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

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

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

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

用户在启动程序时获得UAC提示。 明智地使用; 他们的耐心会很快磨损。

在你的manifest中添加一个requestedExecutionLevel元素只是战斗的一半。 你必须记住, UAC可以closures。 如果是这样,你必须执行检查旧学校的方式,并build立一个错误的对话框,如果用户不是pipe理员
(在线程的CurrentPrincipal上调用IsInRole(WindowsBuiltInRole.Administrator) )。

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

 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文件中embedded清单文件,这将导致Windows(7或更高版本)始终以pipe理员身份运行程序。

您可以在步骤6:创build并embedded应用程序清单(UAC) (MSDN)中find更多详细信息。

具体步骤如下。

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

在Solution中添加文件

选择应用程序清单文件

选择清单选项

更新清单文件

在Visual Studio 2008上工作时,右键点击Project -> Add New Item ,然后selectApplication Manifest File

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

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

要么

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

要么

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

要将您的应用程序设置为以pipe理员身份运行,您必须select中间的一个。

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

按照

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

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

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

在代码中,另一种方法是检测stream程是否像@NG的答案那样以pipe理员身份运行。 。 然后再次打开应用程序并closures当前的应用程序。

当应用程序只在某些条件下运行时才需要pipe理员权限,例如将自己安装为服务时,我使用此代码。 所以它不需要像其他的答案一样一直以pipe理员的身份运行。

注意在下面的代码NeedsToRunAsAdmin是一个方法,检测是否在当前条件下pipe理员权限是必需的。 如果这返回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); } 

右键点击你的可执行文件,进入属性>兼容性,然后选中“以pipe理员身份运行这个程序”框。

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