【问题标题】:How to do Vista/UAC aware self-extract installer如何进行 Vista/UAC 感知自解压安装程序
【发布时间】:2012-02-10 14:48:49
【问题描述】:

我使用 WinZip 自解压存档 (SFX) 分发我的软件。
我知道thisthat。但这些似乎不适用于 SFX 场景。

在安装时,SFX 解压缩并启动一个包含的程序(由我编写),它会执行安装。这包括在 Windows 控制面板下为程序列表创建注册表项。此外,该程序具有清单。 所以它应该是“Vista-aware”的。 SFX 可执行文件还包括一个清单。

问题是程序兼容性助手 (PCA) 抛出了它的消息 "This program might not have installed correctly" 无论如何。 所以我的客户告诉我我是一个糟糕的程序员......

我在 Google 上搜索了很多,并阅读了很多关于 PCA 的信息,包括许多 Microsoft 网站。
那些告诉我要做:

  1. 嵌入清单
  2. 为 Windows 控制面板下的程序列表创建注册表项

我的清单如下所示:

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <applicationRequestMinimum>
        <defaultAssemblyRequest permissionSetReference="Custom" />
        <PermissionSet class="System.Security.PermissionSet" version="1" Unrestricted="true" ID="Custom" SameSite="site" />
      </applicationRequestMinimum>
      <requestedPrivileges>
        <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
      </requestedPrivileges>
    </security>
  </trustInfo>
</asmv1:assembly>

那么我哪里做错了?
PCA 还有其他事情要做吗?
SFX 可执行文件是否必须包含其他内容?

【问题讨论】:

  • 自解压请求提升吗?它有setup.exe 的名字吗?上面的清单是来自您的安装程序还是 SFX?
  • 是的,SFX 需要提升的安装权限,并且名称中包含“setup”。上面的清单是我自己的,SFX 也包含清单,但我不知道如何更改它。
  • 您确定 SFX 中的清单已请求执行级别吗?如果有,则不应显示兼容性对话框。
  • 是的,SFX 清单包含 requestExecutionLevel,level="requireAdministrator"。无论如何都会出现对话框。我认为 PCA 会在 windows 控制面板/程序中寻找一个创建的条目,它不是由 SFX 编写的。
  • 当应用程序具有声明的requestedExecutionLevel 清单时,不应用PCA。安装程序检测仅针对没有清单的应用程序执行。所以肯定少了点什么。此外,您可以通过清单声明您的应用与 Vista/7 兼容。

标签: windows-7 installation uac self-extracting winzip


【解决方案1】:

We fixed 在 NSIS 中通过将 PE 标头中的 version field 设置为 6.0 来解决类似问题。我相信这适用于我们的卸载程序,但它也可能适用于您的场景。

【讨论】:

  • 在构建后操作 SFX exe 效果很好。谢谢你,你救了我的命!有这方面的文件吗?你是怎么做到的?
  • 6.0 版必须适合操作系统版本(Win Vista / Win 7)还是您自己的?
【解决方案2】:

正如另一个答案中所述,关键是在文件的 PE (Portable Executable) 部分中正确设置标题。我们在尝试使用 SFX 文件和 7-zip 构建自解压可执行文件时遇到了这个问题。

可移植可执行文件 (PE) 格式是用于 32 位和 64 位版本的 Windows 操作系统中的可执行文件、目标代码、DLL、FON 字体文件和其他文件的文件格式。 PE 格式是一种数据结构,它封装了 Windows 操作系统加载程序管理打包的可执行代码所需的信息。

注意:PE文件格式类似于Linux下的ELF

构建这些文件很顺利,但是当我们尝试在 Win7 上运行生成的文件时,我们会看到以下对话框。

                                

这里最大的提示是这个对话框是由 PCA - Program Compatibility Assistant 抛出的。抛出此错误是因为 PCA 已检测到:

  1. 没有条目被添加到添加/删除程序中
  2. PE 可执行文件的版本字段设置正确

使用 PE 工具修复

在我们的例子中,似乎是 #2 导致了问题。所以我们下载了PE Tools 并打开了 7-zip SFX 文件。 注意:我们加载了文件7zS.sfx

加载后,我们将以下版本信息从 4 更改为 6

                     

参考文献

【讨论】:

  • 感谢您的回答。在我的情况下,缺少的部分是#2,#1(程序中的条目)仍然完成。与大多数情况一样,在服务器上自动构建应用程序时,任何必须手动使用的工具都没有用。我已经通过在我们的构建工具中设置版本字段来做到这一点。这是通过 zip 文件和解压后 7zip 调用的 exe 完成的。
  • @joe - 是的,我也做了类似的事情,我们预先构建了 SFX 文件,然后在组装包时使用它,但我认为描述如何做到这一点会有所帮助,因为其他 A 没有' 并没有真正进入细节,我们努力了一点来弄清楚如何做到这一点。
  • 好吧,安德斯的回答是缺少的提示 - 足以让我自己做剩下的路。这就是这里所指望的。对问题进行更深入的研究对将来会遇到同样问题的人有好处 - 这就是在 SO 上更重要的事情!
  • @joe - 同意,我通常喜欢将详细信息添加为 A,如果那里的内容没有拼写出足够的内容来遵循它们。我来自 Unix 世界,所以对整个 PE windows 世界不太熟悉。所以现在 SO 的这个小角落对我来说更清楚了,希望将来可能会在你的 Q 上发生其他事情。
  • 您也可以只使用十六进制编辑器并按照维基百科页面上的结构:en.wikipedia.org/wiki/Portable_Executable - 基本上在您的应用程序中找到 0x3C 处的值(指向标头的指针),将 0x40 添加到该值( PE 标头中主要操作系统版本的静态偏移量),您得到的是主要操作系统版本的偏移量,我将其更改为 windows 10 的 10。我工作 =D。显然,PE Tools 是一种黑客工具,已不再可用......
猜你喜欢
  • 2011-01-17
  • 2015-03-10
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
相关资源
最近更新 更多