将程序安装在客户端计算机上后,如何强制程序在Windows 7上以管理员身份运行?
将程序安装在客户端计算机上后,如何强制程序在Windows 7上以管理员身份运行?
Answers:
您将需要修改嵌入到程序中的清单。这适用于Visual Studio 2008和更高版本:Project + Add New Item,选择“ Application Manifest File”。将<requestedExecutionLevel>
元素更改为:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
用户在启动程序时收到UAC提示。明智地使用;他们的耐心会很快耗尽。
在requestedExecutionLevel
清单中添加元素只是成功的一半。您必须记住可以关闭UAC。如果是这样,则如果用户不是管理员
(IsInRole(WindowsBuiltInRole.Administrator)
您必须在线程的上调用),则必须按照旧的方式执行检查并显示错误对话框CurrentPrincipal
。
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
,以及
IsInRole
Anders谈论的MSDN示例。
详细步骤如下。
请注意,使用此代码需要关闭ClickOnce的安全性设置,为此,请进入“属性”->“安全性”->“ ClickOnce安全性”
New Item...
不是我的Installer Service项目的选项。我将如何添加应用清单?我可以将其添加到我的主项目中,但不能将其添加到安装程序中。
我实现了一些代码来手动执行此操作:
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
。
在清单文件中,您将找到标签requestedExecutionLevel
,并且可以将级别设置为三个值:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
要么
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
要么
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
要设置您的应用程序以管理员身份运行,您必须选择中间一个。
在Visual Studio 2010中,右键单击您的项目名称。点击“查看Windows设置”,这将生成并打开一个名为“ app.manifest”的文件。在该文件中,将“ asInvoker”替换为“ requireAdministrator”,如文件内注释部分所述。
做到这一点的另一种方法(仅在代码中)是检测进程是否以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);
}
runas
非管理员用户身份以管理员身份启动任何操作,否则它将以当前用户权限以静默方式打开(在Windows 7 64位上选中)。据我所知,禁用UAC且缺少管理员权限的唯一操作是在适当的时候停止执行。
您可以使用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上面的this 答案的简化版本
public bool IsUserAdministrator()
{
try
{
WindowsIdentity user = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(user);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
catch
{
return false;
}
}
右键单击您的可执行文件,转到“属性”>“兼容性”,然后选中“以管理员身份运行该程序”框。
如果要以管理员身份对所有用户运行它,请在“更改所有用户的设置”中执行相同的操作。