代码之家  ›  专栏  ›  技术社区  ›  Patrick Desjardins

UAC需要控制台应用程序

  •  26
  • Patrick Desjardins  · 技术社区  · 17 年前

    我有一个控制台应用程序需要使用一些需要管理员级别的代码。我已阅读到,我需要添加一个清单文件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,我就能够使其正常工作。我仍然想知道是否可以在应用程序启动时弹出一些内容,而不是显式右键单击>以管理员身份运行?

    3 回复  |  直到 17 年前
        1
  •  8
  •   Judah Gabriel Himango    17 年前

    您需要将UAC清单嵌入为嵌入的win32资源。见 Adding a UAC Manifest to Managed Code .

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

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

    mt.exe -manifest "$(ProjectDir)$(TargetName).exe.manifest" -updateresource:"$(TargetDir)$(TargetName).exe;#1"
    
        2
  •  53
  •   scobi    16 年前

    对于使用Visual Studio的任何人来说,这都非常简单。我正准备安装WindowsSDK,并在构建后执行mt.exe步骤,在意识到它是内置于vs.i之前,我想我会为子孙后代录制它。

    1. 项目添加新项->Visual C项->应用程序清单文件
    2. 打开app.manifest,将requestedExecutionLevel@级别更改为“RequireAdministrator”
    3. 建造

    塔达

        3
  •  24
  •   Joe Daley    15 年前

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

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

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

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

    1. 标记您的应用程序__asinvoker_:您可以通过编写应用程序的清单来完成此操作,在该清单中设置requestedExecutionLevel==asinvoker。此设置允许来自非提升上下文的调用方创建进程,从而允许他们继续执行步骤2。

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

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

    我的代码如下。它在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);
    }
    
    推荐文章