UAC需要控制台应用程序

本文关键字:应用程序 控制台 UAC | 更新日期: 2023-09-27 17:48:51

我有一个控制台应用程序,需要使用一些需要管理员级别的代码。我读到我需要添加一个清单文件myprogram.exe.Manifest,看起来像这样:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="requireAdministrator">
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>

但它仍然没有引发UAC(在控制台或VS中的调试中)。我该如何解决这个问题?

更新

如果我在Administrator中运行解决方案,或者当我在Administrator下运行/bin/*.exe时,我能够使其工作。我仍然想知道是否有可能在应用程序启动时弹出一些东西,而不是明确地右键单击>是否以管理员身份运行?

UAC需要控制台应用程序

对于任何使用Visual Studio的人来说,这都非常容易。在意识到它已经内置到VS中之前,我正要去设置Windows SDK并执行mt.exe的后构建步骤等等。我想我会把它记录下来留给子孙后代。

  1. 项目|添加新项->Visual C#项->应用程序清单文件
  2. 打开app.manifest,更改requestedExecutionLevel@级别为"requireAdministrator"
  3. Build

Ta da

Scott的回答将按照您的要求执行,但Microsoft建议控制台应用程序显示"拒绝访问"消息,而不是提示提升。

发件人http://msdn.microsoft.com/en-us/library/bb756922.aspx:

控制台应用程序在控制台窗口上显示其输出,而不是具有单独的用户界面。如果应用程序需要完全管理员访问令牌以运行,然后需要从启动该应用程序一个升高的控制台窗口。

对于控制台应用程序,您必须执行以下操作:

  1. 将您的应用程序标记为"asInvoker":您可以通过编写应用程序的清单来实现这一点,在该清单中将RequestedExecutionLevel==asInvoker设置为。此设置允许来自非提升上下文的调用方创建您的进程,从而允许他们继续执行步骤2。

  2. 如果应用程序在没有完全管理员访问令牌的情况下运行,请提供一条错误消息:如果应用程序是在非提升控制台中启动的,则应用程序应提供一条简短消息并退出。建议的消息是:"拒绝访问。使用所选选项需要管理员权限。使用管理员命令提示符完成这些任务。"

应用程序还应在启动失败时返回错误代码error_ELEVATION_REQUIRED,以便于编写脚本。

我的C#代码如下。它在Windows XP(管理员->ok,标准用户->拒绝)和Windows Server 2008(提升管理员->ok、非提升管理员->拒绝,标准用户->拒绝)上进行了测试。

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清单添加到托管代码。

简而言之,您可以使用WindowsSDK命令行工具将其嵌入到可执行文件中。

通过在VS项目的属性中放置以下行作为构建后任务,您可以将其自动化为构建后步骤:

mt.exe -manifest "$(ProjectDir)$(TargetName).exe.manifest" -updateresource:"$(TargetDir)$(TargetName).exe;#1"