安装程序清单嵌入问题
Installer manifest embedding problems
我有自己的安装程序。为了提升管理员权限,我有这个 RC 文件:
2 ICON "icon.ico"
1 RT_MANIFEST "setup.exe.manifest"
以及以下清单:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!--This Id value indicates the application supports Windows Vista functionality -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!--This Id value indicates the application supports Windows 7 functionality-->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!--This Id value indicates the application supports Windows 8 functionality-->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
<!--This Id value indicates the application supports Windows 8.1 functionality-->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<!--The ID below indicates application support for Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
</application>
</compatibility>
<asmv3:trustInfo xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<asmv3:security>
<asmv3:requestedPrivileges>
<asmv3:requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</asmv3:requestedPrivileges>
</asmv3:security>
</asmv3:trustInfo>
</assembly>
安装程序是使用 MSVC 2017 编译的,然后我将要安装的实际数据附加到 setup.exe 文件中。我假设 EXE 文件的开头包含有关其原始长度的信息,因此系统可以读取它需要的任何内容并且实际上不会触及附加数据。图标显示正确,所以我认为一切正常。
但是我有两个问题:
在某些计算机上(不幸的是我没有,我只有报告)OS 似乎并没有真正提升权限并且安装程序无法写入一些文件.
在许多计算机上,安装程序结束后系统会显示著名的 "This software hasn't been installed correctly..." window。
知道我做错了什么吗?
编辑:如果安装程序是 "run as administrator" 通过右键单击菜单,它可以顺利完成。
Edit2:安装程序也被签名并且签名被 Windows 正确读取。
显然,像这样将其作为资源嵌入是行不通的。可以使用此命令来验证清单:
mt.exe -inputresource:blablabla.exe;#1 -out:extracted.manifest
但是当直接从 MSVC 中的链接器/清单文件页面使用时它可以工作,没有实际的清单文件,它会自己生成一些。
我有自己的安装程序。为了提升管理员权限,我有这个 RC 文件:
2 ICON "icon.ico"
1 RT_MANIFEST "setup.exe.manifest"
以及以下清单:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!--This Id value indicates the application supports Windows Vista functionality -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!--This Id value indicates the application supports Windows 7 functionality-->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!--This Id value indicates the application supports Windows 8 functionality-->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
<!--This Id value indicates the application supports Windows 8.1 functionality-->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<!--The ID below indicates application support for Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
</application>
</compatibility>
<asmv3:trustInfo xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<asmv3:security>
<asmv3:requestedPrivileges>
<asmv3:requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</asmv3:requestedPrivileges>
</asmv3:security>
</asmv3:trustInfo>
</assembly>
安装程序是使用 MSVC 2017 编译的,然后我将要安装的实际数据附加到 setup.exe 文件中。我假设 EXE 文件的开头包含有关其原始长度的信息,因此系统可以读取它需要的任何内容并且实际上不会触及附加数据。图标显示正确,所以我认为一切正常。
但是我有两个问题:
在某些计算机上(不幸的是我没有,我只有报告)OS 似乎并没有真正提升权限并且安装程序无法写入一些文件.
在许多计算机上,安装程序结束后系统会显示著名的 "This software hasn't been installed correctly..." window。
知道我做错了什么吗?
编辑:如果安装程序是 "run as administrator" 通过右键单击菜单,它可以顺利完成。 Edit2:安装程序也被签名并且签名被 Windows 正确读取。
显然,像这样将其作为资源嵌入是行不通的。可以使用此命令来验证清单:
mt.exe -inputresource:blablabla.exe;#1 -out:extracted.manifest
但是当直接从 MSVC 中的链接器/清单文件页面使用时它可以工作,没有实际的清单文件,它会自己生成一些。