Windows 7 如何判断是否需要管理员权限? (VC60)

How does Windows 7 determine, if you need admin rights? (vc60)

问题: 我正在用 C++ 为安装程序编写单元测试。安装程序需要管理员权限,但单元测试不需要。在开始测试时,系统要求我以管理员身份启动 test/program。

当我包含原始项目的 rc 文件时开始发生这种情况。

编辑: 我正在将此项目升级到 VS2010,但仍在使用 vc60,因此没有清单支持。这可能是相关的。

评估应用程序所需权限的一个标准是名称。 因此,如果名称 包含 单词 "Setup",您将被要求获得管理员权限。

此外,由于这是从 rc 文件开始的,另一个标准是在 "Version" 下写在 rc 文件中的名称。就我而言 "VS_VERSION_INFO"。 以下条目不应包含单词设置:

FileDescription
InternalName
OriginalFilename
ProductName

您可以将任何出现的 "Setup" 更改为 "Settup"。那会阻止对话。 尽管如此,您可能无法在 "real" rc 文件中更改它。

一般情况下,资源都包含一个清单,清单的一部分会说明程序是否需要管理员权限。由于这是一个设置实用程序,它可能有一个需要管理员访问权限的清单,并且您的测试在它尝试共享资源文件时选择了它。

(其他人正在谈论用于猜测程序在没有清单时是否需要管理员访问权限的启发式方法。例如,如果您有一个在清单文件很常见之前制作的旧程序,则OS 可能会尝试通过在文件名中查找某些短语(如 "setup")来猜测它是否是安装程序。我相信还有其他启发式方法。这是针对在清单之前编写的旧程序的 hack使得明确声明您需要管理员访问权限成为可能。)

您可以通过提供自己的清单来解决您的问题。最简单的方法是使用 /MANIFESTUAC 链接器选项。

如果您使用的是较旧的工具链,您可能必须自己制作清单文件并将其包含在您的资源中。

清单是 XML 的一大块。对你来说重要的一点看起来像这样:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity version="1.0.0.0"  name="yourprogram.exe" type="win32"/>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="asInvoker"/>
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>

要将其嵌入到您的资源中,您的 .RC 文件应包含:

1 RT_MANIFEST <filename>

如果你的SDK太老,没有定义RT_MANIFEST,你可以自己定义:

#define RT_MANIFEST 24