Gol*_*old 838 .net c# administrator windows-7 elevated-privileges
一旦我的程序安装在客户端计算机上,如何强制我的程序在Windows 7上以管理员身份运行?
Han*_*ant 1100
您将要修改嵌入在程序中的清单.这适用于Visual Studio 2008及更高版本:Project + Add New Item,选择"Application Manifest File".将<requestedExecutionLevel>
元素更改为:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
Run Code Online (Sandbox Code Playgroud)
用户在启动程序时会收到UAC提示.明智地使用; 他们的耐心很快就会消失.
And*_*ers 151
在requestedExecutionLevel
清单中添加元素只是战斗的一半; 你必须记住UAC可以关闭.如果是,则必须执行旧学校方式的检查并在用户不是管理员时
调用错误对话框(IsInRole(WindowsBuiltInRole.Administrator)
在线程上调用CurrentPrincipal
).
Has*_*man 70
详细步骤如下.
请注意,使用此代码需要关闭ClickOnce的安全设置,为此,请进入属性 - >安全性 - > ClickOnce安全性
NG.*_*NG. 59
我实现了一些手动执行的代码:
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;
}
Run Code Online (Sandbox Code Playgroud)
Dav*_*vid 42
您可以在EXE文件中嵌入清单文件,这将导致Windows(7或更高版本)始终以管理员身份运行程序.
您可以在步骤6:创建和嵌入应用程序清单(UAC)(MSDN)中找到更多详细信息.
小智 19
在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" />
要将应用程序设置为以管理员身份运行,您必须选择中间应用程序.
小智 13
按照
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
Run Code Online (Sandbox Code Playgroud)
如果您还没有应用程序清单,或者您不知道如何添加应用程序清单,则需要添加应用程序清单.由于某些项目不会自动添加单独的清单文件,因此首先转到项目属性,导航到" 应用程序"选项卡,然后检查以确保项目不排除点击底部的清单.
小智 12
在Visual Studio 2010中,右键单击项目名称.点击"查看Windows设置",生成并打开一个名为"app.manifest"的文件.在此文件中,将"asInvoker"替换为"requireAdministrator",如文件中注释部分所述.
The*_*der 11
在代码中执行此操作的另一种方法是在@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);
}
Run Code Online (Sandbox Code Playgroud)
您可以使用ClickOnce安全设置创建清单,然后将其禁用:
Right click on the Project -> Properties -> Security -> Enable ClickOnce Security Settings
Run Code Online (Sandbox Code Playgroud)
单击它后,将在项目的属性文件夹下创建一个名为app.manifest的文件,一旦创建该文件,您可以取消选中该Enable ClickOnce Security Settings
选项
打开该文件并更改此行:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
Run Code Online (Sandbox Code Playgroud)
至:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
Run Code Online (Sandbox Code Playgroud)
这将使程序需要管理员权限.
如果您出于某种原因需要纯代码解决方案,这里有一个独立的类文件。只需在应用程序启动时调用“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);
}
}
Run Code Online (Sandbox Code Playgroud)
这是@NG上面这个答案的简化版本
public bool IsUserAdministrator()
{
try
{
WindowsIdentity user = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(user);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
catch
{
return false;
}
}
Run Code Online (Sandbox Code Playgroud)