我如何强制我的.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更多详细信息。
具体步骤如下。
- 将解决scheme添加到应用程序清单
- 将应用程序设置更改为“app.manifest”
- 将“requestedExecutionLevel”的标签更新为requireAdministrator。
在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理员身份运行它,请在“更改所有用户的设置”中执行同样的操作。