一旦我的程序安装在客户端机器上,我如何强制我的程序在Windows 7上以管理员身份运行?
您可以在EXE文件中嵌入清单文件,这将使Windows(7或更高版本)始终以管理员身份运行程序。
您可以在步骤6:创建和嵌入应用程序清单(UAC) (MSDN)中找到更多详细信息。
您需要修改嵌入到程序中的清单。这适用于Visual Studio 2008及更高版本:项目+添加新项目,选择“应用程序清单文件”。将<requestedExecutionLevel>元素更改为:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
用户在启动程序时得到UAC提示。明智地使用;他们的耐心很快就会耗尽。
添加一个requestedExecutionLevel元素到你的清单中只是战斗的一半;你必须记住UAC是可以关闭的。如果是,你必须执行老式的检查方法,如果用户不是管理员(在你的线程的CurrentPrincipal上调用IsInRole(WindowsBuiltInRole.Administrator)),就弹出一个错误对话框。
在Visual Studio 2010中右键单击项目名称。 点击“查看Windows设置”,这会生成并打开一个名为“app.manifest”的文件。 在此文件中,将“asInvoker”替换为“requireAdministrator”,如文件中的注释部分所述。
在Visual Studio 2008上工作时,右键单击项目->添加新项,然后选择应用程序清单文件。
在清单文件中,你会发现标签requestedExecutionLevel,你可以将级别设置为三个值:
<requestExecutionLevel level=“asInvoker” uiAccess=“false” />
OR
< requestdexecutionlevel level="requireAdministrator" uiAccess="false" />
OR
<requestExecutionLevel level=“highestAvailable” uiAccess=“false” />
要将应用程序设置为以管理员身份运行,必须选择中间的一个。
As的
<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;
}
另一种方法是仅在代码中检测进程是否以admin身份运行,就像@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);
}
具体步骤如下。
将应用程序清单文件添加到项目 更改应用程序设置为"app.manifest" 更新标签“requestedExecutionLevel”为requireAdministrator。
注意,使用这段代码你需要关闭ClickOnce的安全设置,为此,进入Properties -> security -> ClickOnce security
您可以使用ClickOnce Security Settings创建清单,然后禁用它:
Right click on the Project -> Properties -> Security -> Enable ClickOnce Security Settings
单击后,将在项目的属性文件夹下创建一个名为app.manifest的文件,一旦创建,您可以取消选中启用ClickOnce安全设置选项
打开该文件并更改这一行:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
to:
<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);
}
}