How do I force my .NET application to run as administrator?
一旦我的程序安装在客户机上,如何强制我的程序在Windows7上以管理员身份运行?
您将要修改嵌入到程序中的清单。这适用于Visual Studio 2008及更高版本:Project+添加新项,选择"应用程序清单文件"。将
1 | <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> |
用户启动程序时会得到UAC提示。明智地使用;他们的耐心会很快耗尽。
在您的清单中添加一个
(在线程的
我实现了一些手动操作的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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; } |
具体步骤如下。
请注意,使用此代码需要关闭ClickOnce的安全设置,为此,请进入"属性"->"安全性"->"ClickOnce安全性"。
可以在exe文件中嵌入清单文件,这将导致Windows(7或更高版本)始终以管理员身份运行程序。
您可以在步骤6中找到更多详细信息:创建和嵌入应用程序清单(UAC)(msdn)。
在使用Visual Studio 2008时,右键单击
在清单文件中,您将找到标签
或
或
要将应用程序设置为以管理员身份运行,必须选择中间的一个。
按照
1 | <requestedExecutionLevel level="highestAvailable" uiAccess="false" /> |
如果您还没有或不知道如何添加应用程序清单,您将希望添加一个应用程序清单。由于某些项目不会自动添加单独的清单文件,请首先转到"项目属性",导航到"应用程序"选项卡并检查以确保您的项目不排除龙头底部的清单。
- 下一步,右键单击"项目"
- 添加新项目
- 最后,查找并单击应用程序清单文件
在Visual Studio 2010中,右键单击项目名称。点击"查看Windows设置",这将生成并打开一个名为"app.manifest"的文件。在此文件中,将"asinvoker"替换为"RequireAdministrator",如文件中注释部分所述。
另一种实现这一点的方法(仅限代码)是检测进程是否以管理员的身份运行,就像@ng.在答案中那样。然后再次打开应用程序并关闭当前应用程序。
当应用程序仅在某些条件下运行时需要管理员权限时(如将其自身安装为服务时),我使用此代码。所以它不需要像其他答案一样一直以管理员身份运行。
注:在下面的代码中,
尽管此代码具有上述优点,但它确实需要作为一个新的过程重新启动自己,而这并不总是您想要的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | 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); } |
这是这个答案的简化版本,上面是@ng
1 2 3 4 5 6 7 8 9 10 11 12 13 | public bool IsUserAdministrator() { try { WindowsIdentity user = WindowsIdentity.GetCurrent(); WindowsPrincipal principal = new WindowsPrincipal(user); return principal.IsInRole(WindowsBuiltInRole.Administrator); } catch { return false; } } |
您可以使用ClickOnce安全设置创建清单,然后禁用它:
1 | Right click on the Project -> Properties -> Security -> Enable ClickOnce Security Settings |
单击后,将在项目的属性文件夹app.manifest下创建一个文件。创建后,可以取消选中
打开该文件并更改此行:
1 | <requestedExecutionLevel level="asInvoker" uiAccess="false" /> |
到:
1 | <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> |
这将使程序需要管理员权限。
右键单击可执行文件,转到属性>兼容性并选中"以管理员身份运行此程序"框。
如果要将其作为所有用户的管理员运行,请在"更改所有用户的设置"中执行相同的操作。