在客户端计算机上安装我的程序后,如何强制我的程序在Windows 7 上以管理员身份运行?
13 回答
您需要修改嵌入到程序中的清单。这适用于 Visual Studio 2008 及更高版本:Project + Add New Item,选择“Application Manifest File”。<requestedExecutionLevel>
将元素更改为:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
用户在启动程序时会收到UAC提示。明智地使用;他们的耐心很快就会耗尽。
在清单中添加requestedExecutionLevel
元素只是成功的一半;您必须记住,可以关闭UAC 。如果是这样,您必须执行旧学校的检查方式,如果用户不是管理员
(调用IsInRole(WindowsBuiltInRole.Administrator)
您的线程CurrentPrincipal
),则显示错误对话框。
我实现了一些代码来手动完成:
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 文件中嵌入清单文件,这将导致 Windows(7 或更高版本)始终以管理员身份运行程序。
您可以在步骤 6:创建和嵌入应用程序清单 (UAC) (MSDN)中找到更多详细信息。
在使用 Visual Studio 2008 时,右键单击Project -> Add New Item
然后选择Application Manifest File
.
在清单文件中,您将找到 tag requestedExecutionLevel
,您可以将级别设置为三个值:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
或者
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
或者
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
要将您的应用程序设置为以管理员身份运行,您必须选择中间的那个。
仅在代码中执行此操作的另一种方法是检测进程是否像@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);
}
按照
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
如果您还没有或不知道如何添加应用程序清单,您将需要添加一个应用程序清单。由于某些项目不会自动添加单独的清单文件,请首先转到项目属性,导航到应用程序选项卡并检查以确保您的项目不排除水龙头底部的清单。
- 接下来,右键单击项目
- 添加新项目
- 最后,找到并单击应用程序清单文件
在 Visual Studio 2010 中,右键单击您的项目名称。点击“查看 Windows 设置”,这将生成并打开一个名为“app.manifest”的文件。在此文件中,将“asInvoker”替换为“requireAdministrator”,如文件中注释部分中所述。
您可以使用 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); }
}
右键单击您的可执行文件,转到“属性”>“兼容性”并选中“以管理员身份运行此程序”框。
如果您想为所有用户以管理员身份运行它,请在“更改所有用户的设置”中执行相同的操作。