一旦我的程序安装在客户端计算机上,如何强制我的程序在Windows 7上以管理员身份运行?
您将要修改嵌入在程序中的清单 . 这适用于Visual Studio 2008及更高版本:Project Add New Item,选择"Application Manifest File" . 将 <requestedExecutionLevel> 元素更改为:
<requestedExecutionLevel>
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
用户在启动程序时会收到UAC提示 . 明智地使用;他们的耐心很快就会消失 .
将 requestedExecutionLevel 元素添加到清单只是成功的一半;你必须记住UAC可以关闭 . 如果是,您必须检查旧学校方式并在用户不是管理员时设置错误对话框(在你的主题的 CurrentPrincipal 上调用IsInRole(WindowsBuiltInRole.Administrator)) .
requestedExecutionLevel
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; }
详细步骤如下 .
将应用程序清单文件添加到解决方案中
将应用程序设置更改为"app.manifest"
将"requestedExecutionLevel"的标记更新为requireAdministrator .
请注意,使用此代码需要关闭ClickOnce的安全设置,为此,请进入属性 - >安全性 - > ClickOnce安全性
您可以在EXE文件中嵌入清单文件,这将导致Windows(7或更高版本)始终以管理员身份运行该程序 .
您可以在Step 6: Create and Embed an Application Manifest (UAC)(MSDN)中找到更多详细信息 .
在Visual Studio 2008上工作时,右键单击 Project -> Add New Item ,然后选择 Application Manifest File .
Project -> Add New Item
Application Manifest File
在清单文件中,您将找到标签 requestedExecutionLevel ,您可以将级别设置为三个值:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
要么
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
要将应用程序设置为以管理员身份运行,您必须选择中间应用程序 .
在Visual Studio 2010中,右键单击项目名称 . 点击“查看Windows设置”,生成并打开一个名为“app.manifest”的文件 . 在此文件中,将“asInvoker”替换为“requireAdministrator”,如文件中注释部分所述 .
按照
如果您不知道如何添加应用程序清单,则需要添加应用程序清单 . 由于某些项目不会自动添加单独的清单文件,因此首先转到项目属性,导航到“应用程序”选项卡,然后检查以确保项目不排除点击底部的清单 .
接下来,右键单击项目
添加新项目
最后,找到并单击Application Manifest File
在代码中执行此操作的另一种方法是检测进程是否像the answer by @NG.中的管理员一样运行 . 然后再次打开应用程序并关闭当前应用程序 .
当应用程序在某些条件下运行时仅需要管理员权限时,例如将自身安装为服务时,我会使用此代码 . 因此,它不需要像其他答案一样强制执行管理员 .
请注意下面的代码 NeedsToRunAsAdmin 是一种检测当前条件是否需要管理员权限的方法 . 如果返回 false ,代码将不会提升自身 . 这是这种方法相对于其他方法的主要优点 .
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); }
这是这个的简化版answer
public bool IsUserAdministrator() { try { WindowsIdentity user = WindowsIdentity.GetCurrent(); WindowsPrincipal principal = new WindowsPrincipal(user); return principal.IsInRole(WindowsBuiltInRole.Administrator); } catch { return false; } }
您可以使用ClickOnce安全设置创建清单,然后将其禁用:
Right click on the Project -> Properties -> Security -> Enable ClickOnce Security Settings
单击它后,将在项目的属性文件夹下创建一个名为 app.manifest 的文件,一旦创建,您可以取消选中 Enable ClickOnce Security Settings 选项
Enable ClickOnce Security Settings
打开该文件并更改此行:
至:
这将使程序需要管理员权限 .
右键单击您的可执行文件,转到“属性”>“兼容性”,然后选中“以管理员身份运行此程序”框 .
如果您想以管理员身份为所有用户运行它,请在“更改所有用户的设置”中执行相同的操作 .
12 回答
您将要修改嵌入在程序中的清单 . 这适用于Visual Studio 2008及更高版本:Project Add New Item,选择"Application Manifest File" . 将
<requestedExecutionLevel>
元素更改为:用户在启动程序时会收到UAC提示 . 明智地使用;他们的耐心很快就会消失 .
将
requestedExecutionLevel
元素添加到清单只是成功的一半;你必须记住UAC可以关闭 . 如果是,您必须检查旧学校方式并在用户不是管理员时设置错误对话框(在你的主题的
CurrentPrincipal
上调用IsInRole(WindowsBuiltInRole.Administrator)) .我实现了一些手动执行的代码:
详细步骤如下 .
将应用程序清单文件添加到解决方案中
将应用程序设置更改为"app.manifest"
将"requestedExecutionLevel"的标记更新为requireAdministrator .
请注意,使用此代码需要关闭ClickOnce的安全设置,为此,请进入属性 - >安全性 - > ClickOnce安全性
您可以在EXE文件中嵌入清单文件,这将导致Windows(7或更高版本)始终以管理员身份运行该程序 .
您可以在Step 6: Create and Embed an Application Manifest (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”,如文件中注释部分所述 .
按照
如果您不知道如何添加应用程序清单,则需要添加应用程序清单 . 由于某些项目不会自动添加单独的清单文件,因此首先转到项目属性,导航到“应用程序”选项卡,然后检查以确保项目不排除点击底部的清单 .
接下来,右键单击项目
添加新项目
最后,找到并单击Application Manifest File
在代码中执行此操作的另一种方法是检测进程是否像the answer by @NG.中的管理员一样运行 . 然后再次打开应用程序并关闭当前应用程序 .
当应用程序在某些条件下运行时仅需要管理员权限时,例如将自身安装为服务时,我会使用此代码 . 因此,它不需要像其他答案一样强制执行管理员 .
请注意下面的代码
NeedsToRunAsAdmin
是一种检测当前条件是否需要管理员权限的方法 . 如果返回false
,代码将不会提升自身 . 这是这种方法相对于其他方法的主要优点 .尽管此代码具有上述优点,但它确实需要重新启动自身作为一个并不总是您想要的新流程 .
这是这个的简化版answer
您可以使用ClickOnce安全设置创建清单,然后将其禁用:
单击它后,将在项目的属性文件夹下创建一个名为 app.manifest 的文件,一旦创建,您可以取消选中
Enable ClickOnce Security Settings
选项打开该文件并更改此行:
至:
这将使程序需要管理员权限 .
右键单击您的可执行文件,转到“属性”>“兼容性”,然后选中“以管理员身份运行此程序”框 .
如果您想以管理员身份为所有用户运行它,请在“更改所有用户的设置”中执行相同的操作 .