问题:我正在用c ++编写一个安装程序的单元测试。安装程序需要管理员权限,但单元测试不需要。在开始测试时,我被要求以管理员身份启动测试/程序。
当我包含原始项目的rc文件时,这种情况就开始发生了。
编辑:我正在将此项目升级到VS2010,但仍然使用vc60,因此没有明显的支持。这可能是相关的。
答案 0 :(得分:1)
评估应用程序所需权限的一个标准是名称。 因此,如果名称包含 Word“设置”,则系统会要求您提供管理员权限。
此外,由于这是从rc文件开始的,另一个标准是在“版本”下的rc-File中写入的名称。在我的情况下,在“VS_VERSION_INFO”。 以下条目不应包含单词Setup:
FileDescription
InternalName
OriginalFilename
ProductName
您可以将“设置”的任何更改更改为“设置”。这会阻止对话。 即便如此,您可能无法在“真实”rc文件中更改此内容。
答案 1 :(得分:1)
通常,资源包含清单,清单的一部分表明程序是否需要管理员访问权限。由于这是一个安装实用程序,它可能有一个需要管理员访问权限的清单,并且当您尝试共享资源文件时,您的测试会将其选中。
(其他人正在谈论用于猜测程序在没有清单时是否需要管理员访问权限的启发式方法。例如,如果您有清单文件常见之前制作的旧程序,操作系统可能会通过查找文件名中的某些短语来猜测它是否是安装程序。我相信还有其他的启发式方法。这是对旧程序的破解。在清单之前编写,可以明确声明您对管理员访问的需要。)
您可以通过提供自己的清单来解决问题。最简单的方法是使用/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