提问人:Gold 提问时间:5/12/2010 最后编辑:Arsen KhachaturyanGold 更新时间:4/12/2022 访问量:608733
如何强制我的 .NET 应用程序以管理员身份运行?
How do I force my .NET application to run as administrator?
答:
您可以在 EXE 文件中嵌入清单文件,这将导致 Windows(7 或更高版本)始终以管理员身份运行程序。
有关详细信息,请参阅步骤 6:创建和嵌入应用程序清单 (UAC) (MSDN)。
您需要修改嵌入到程序中的清单。这适用于 Visual Studio 2008 及更高版本:项目 + 添加新项,选择“应用程序清单文件”。将元素更改为:<requestedExecutionLevel>
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
用户在启动程序时会收到 UAC 提示。明智地使用;他们的耐心会很快耗尽。
评论
将元素添加到清单只是成功的一半;您必须记住,UAC 可以关闭。如果是,则必须以老式方式执行检查,如果用户不是管理员
,则必须弹出错误对话框(在线程上调用IsInRole(WindowsBuiltInRole.Administrator)
)。requestedExecutionLevel
CurrentPrincipal
评论
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
Anders 谈到的 IsInRole
的 MSDN 示例。
在 Visual Studio 2010 中,右键单击项目名称。 点击“查看 Windows 设置”,这将生成并打开一个名为“app.manifest”的文件。 在此文件中,将“asInvoker”替换为“requireAdministrator”,如文件中的注释部分所述。
评论
在 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);
}
评论
runas
详细步骤如下。
- 将应用程序清单文件添加到项目
- 将应用程序设置更改为“app.manifest”
- 将“requestedExecutionLevel”的标记更新为 requireAdministrator。
请注意,使用此代码,您需要关闭 ClickOnce 的安全设置,为此,请进入“属性”-“>安全性”-“> ClickOnce 安全性”
评论
New Item...
不是我的安装程序服务项目中的一个选项。如何添加应用清单?我可以将它添加到我的主项目中,但不能将其添加到安装程序中。
可以使用 ClickOnce 安全设置创建清单,然后禁用它:
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" />
这将使程序需要管理员权限。
这不会强制应用程序以管理员身份工作。
这是上面这个答案的简化版本,由@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);
}
}
评论