【问题标题】:UAC need for console applicationUAC 对控制台应用程序的需求
【发布时间】:2008-10-22 19:21:32
【问题描述】:

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

【问题讨论】:

  • 您是否以管理员身份运行应用程序?
  • 我以普通用户的身份运行 VS,所以没有。但是当我右键单击控制台应用程序并以管理员身份运行它时,它可以工作。当我在visual studio中点击RUN而不是窃听时,我希望有“UAC弹出窗口”。
  • 顺便说一句,当我在管理员模式下运行 VS 时,它可以工作。如果我不以管理员身份运行,我想要的是弹出窗口让我切换到管理员模式。
  • 您是否使用清单工具 (mt.exe) 将清单嵌入到 myprogram.exe 中?还是清单只是放在磁盘上的同一目录中?

标签: c# .net .net-2.0 uac manifest


【解决方案1】:

对于任何使用 Visual Studio 的人来说,这都非常简单。我正要设置 Windows SDK 并执行 mt.exe 构建后步骤以及所有这些,然后才意识到它已内置到 VS 中。我想我会把它记录下来以供后代使用。

  1. 项目 |添加新项目 -> Visual C# 项目 -> 应用程序清单文件
  2. 打开 app.manifest,将 requestedExecutionLevel.@level 更改为“requireAdministrator”
  3. 构建

塔达

【讨论】:

    【解决方案2】:

    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);
    }
    

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

      猜你喜欢
      • 2010-11-04
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      • 2012-06-10
      • 1970-01-01
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多