5

我们有一个 visio 插件(例如,版本 1),它由具有管理员权限的用户作为每个用户('Just me' otpion)安装,并且 msi 安装程序是使用 Visual Studio 的设置和部署创建的。后来因为组织政策到位撤销所有用户的管理员权限被撤销。因此,新版本(版本 2)需要由 IT 管理员作为每台机器(每个人的选项)安装,以便该插件可供该机器上的所有用户使用,并卸载已安装的旧版本(版本 1)由其权限被撤销的用户。

我们正在尝试自动化卸载以避免人工干预。该实用程序通过查看该计算机上的注册表项并使用 msiexec 强制卸载来检测应用程序的所有已安装实例。但是 msiexec 无法卸载其他用户安装的版本,退出代码为 1605 - 此操作仅对当前安装的产品有效

如果用户(安装了版本 1 插件)被授予卸载应用程序的管理员权限,他可以手动卸载它,这证明应用程序没有被篡改并且处于可以毫无问题地卸载的状态。

有关如何以编程方式卸载安装在其他用户使用“仅我”选项安装的计算机上的应用程序的任何指示都会真正有帮助

4

3 回答 3

3

我找到了一些进一步的文档:

如果您使用的是Installshield ,则可以使用以下方法来消除现有的每个用户安装并在每台机器上安装新包。如果您不使用 Installshield,那么您自己的“ISSetAllUsers”替换 CA 也应该可以这样做。以下假设为“主要升级”正确填充了升级表 - 搜索有关主要升级的信息:

  1. 在FindRelatedProducts之前插入 Installshield 的ISSetAllUsers自定义操作。此操作将为现有安装读取 ALLUSERS 的值,并为新设置强制执行它。有关如何添加此操作的信息,请参见下文。
  2. RemoveExistingProducts 移到序列的早期,在InstallInitialize之前。
  3. RemoveExistingProducts使用设置属性 CAALLUSERS设置回 1 之后。
  4. 上述两个操作都在InstallInitialize之前完成是非常重要的。如果在InstallInitialize之后ALLUSERS的值发生变化,所有组件在安装后都会处于无法识别的状态,一般会发生自修复。

为了插入 ISSetAllUsers 自定义操作,您需要执行以下操作:

  1. 在 Installshield 中选择工具 -> 选项 -> 常规 -> 启用“自动创建 ISSetAllUsers 操作”。单击确定。
  2. 转到升级视图并插入一个虚拟条目。
  3. 转到直接编辑器,从升级表中删除虚拟条目。
  4. 应该已插入 ISSetAllUsers 操作。转到 InstallExecuteSequence 视图并将操作移动到 FindRelatedProducts 之前。

重要提示:请注意,切勿将ISSetAllUsers自定义操作添加到任何项目,除非您需要执行每用户到每台机器的迁移。该操作将有效地确保新安装程序的安装值与旧安装程序相同,除非使用设置属性自定义操作来强制每台机器安装(正如我们在上述场景中所做的那样)。

于 2012-09-06T01:26:56.923 回答
3

这不仅仅是 Visual Studio 的问题。Windows Installer 不允许在升级期间更改安装上下文(用户/机器)。您必须以执行安装的用户配置文件身份执行登录,并在安装新的每台计算机安装之前将其删除。

于 2012-08-25T18:38:40.540 回答
1

几年前我创建了一个包来做这件事,但我一生都找不到它(见上面的答案)。我记得它涉及使用主要升级升级表在正确用户的上下文中卸载每个用户安装,然后使用设置属性自定义操作在新安装命中InstallInitialize之前更改ALLUSERS的值并执行每台机器新安装。这意味着您必须尽可能早地在InstallExecuteSequence中移动RemoveExistingProduct,然后在其后立即执行 set 属性。

听起来很疯狂,但据我回忆,它在经过一些认真的测试和调试后才起作用。关键部分是以最初安装每个用户安装的用户身份运行新安装程序。这在逻辑上并不总是容易做到的,因为 sccm 可能会在不同的上下文中运行安装。也可能是您必须在序列中更早地移动 RemoveExistingProducts,并在其后面移动一些标准操作以使其工作。我不记得确切 - 对不起。您可以使用ActiveSetup安排安装“每个用户一次”运行。然后,您可能需要禁止设置 GUI,以避免在安装不存在时向每个用户发送错误消息。

请注意,上述操作在 Orca 中很难做到。在 Wise for Windows Installer 或 Installshield 中尝试。请注意,Installshield 软件包也有自己的方式来重新提取 ALLUSERS 的值,您可能需要禁用它们的变体才能使您的变体正常工作。这不应该是容易的:-)。

于 2012-08-29T13:28:22.243 回答