我有一个控制台应用程序,需要使用一些需要管理员级别的代码.我已经读过我需要添加一个Manifest文件myprogram.exe.manifest,它看起来像这样:
但它仍然没有提升UAC(在控制台或VS中的调试).我该如何解决这个问题?
如果我在Administrator中运行解决方案或在Administrator中运行/bin/*.exe,我能够使其工作.我仍然想知道是否有可能在应用程序启动时弹出而不是显式右键单击>以管理员身份运行?
对于任何使用Visual Studio的人来说,它非常简单.我正准备设置Windows SDK并执行mt.exe后构建步骤以及所有这些步骤,然后才意识到它已内置到VS中.我想我会为后人录制它.
项目| 添加新项 - > Visual C#Items - > Application Manifest File
打开app.manifest,将requestedExecutionLevel.@ level更改为"requireAdministrator"
建立
当当
Scott的回答将按照您的要求进行,但Microsoft建议控制台应用程序显示"拒绝访问"消息,而不是提示提升.
来自http://msdn.microsoft.com/en-us/library/bb756922.aspx:
控制台应用程序在控制台窗口上显示其输出,而不是单独的用户界面.如果应用程序需要运行完整的管理员访问令牌,则需要从提升的控制台窗口启动该应用程序.
您必须对控制台应用程序执行以下操作:
标记您的应用程序"asInvoker":您可以通过创建应用程序的清单来执行此操作,您可以在其中设置RequestedExecutionLevel == asInvoker.此设置允许来自非提升上下文的调用者创建您的进程,这允许他们继续执行步骤2.
如果在没有完全管理员访问令牌的情况下运行应用程序,则提供错误消息:如果应用程序是在非提升的控制台中启动的,则应用程序应提供简短消息并退出.建议的消息是:"拒绝访问.使用所选选项需要管理员权限.使用管理员命令提示符完成这些任务."
应用程序还应在启动失败时返回错误代码ERROR_ELEVATION_REQUIRED以便于编写脚本.
我的C#代码如下.它在Windows XP(管理员 - >确定,标准用户 - >被拒绝)和Windows Server 2008(提升管理员 - >确定,非提升管理员 - >拒绝,标准用户 - >被拒绝)上进行测试.
static int Main(string[] args) { if (!HasAdministratorPrivileges()) { Console.Error.WriteLine("Access Denied. Administrator permissions are " + "needed to use the selected options. Use an administrator command " + "prompt to complete these tasks."); return 740; // ERROR_ELEVATION_REQUIRED } ... return 0; } private static bool HasAdministratorPrivileges() { WindowsIdentity id = WindowsIdentity.GetCurrent(); WindowsPrincipal principal = new WindowsPrincipal(id); return principal.IsInRole(WindowsBuiltInRole.Administrator); }
您需要将UAC清单嵌入为嵌入式Win32资源.请参阅将UAC清单添加到托管代码.
简而言之,您使用Windows SDK命令行工具将其嵌入到可执行文件中.
您可以通过在VS项目的属性中将以下行作为后期构建任务放置为后构建步骤来自动执行此操作:
mt.exe -manifest "$(ProjectDir)$(TargetName).exe.manifest" -updateresource:"$(TargetDir)$(TargetName).exe;#1"