【问题标题】:windows Installer - uninstalling previous version when the versions differ in installation policy (per-user, per-machine)windows Installer - 当版本安装策略不同时卸载以前的版本(每个用户,每台机器)
【发布时间】:2021-04-04 19:41:55
【问题描述】:

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

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

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

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

【问题讨论】:

  • 抱歉,不走运。众所周知,Visual Studio 安装包很糟糕,管理员安装到每台机器位置的每用户包是最糟糕的。对不起,你不走运!

标签: windows-installer


【解决方案1】:

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

【讨论】:

  • 你是对的。我们联系了 Microsoft 支持,答案是它的设计。唯一的方法是手动卸载,然后自动安装。
  • @Christopher Painter stackoverflow.com/questions/30450998/… 帮我解决这个问题
【解决方案2】:

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

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

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

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

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

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

【讨论】:

  • 这只会删除当前用户的安装。然后,所有其他用户将在“添加或删除程序”中同时看到旧版本和新版本。您知道为所有用户执行此操作的方法吗?
【解决方案3】:

几年前我创建了一个包来执行此操作,但我一生都找不到它 (see answer above)。我记得它涉及使用 ma​​jor upgradeUpgrade table 在正确用户的上下文中卸载每个用户的安装,然后使用 set 属性自定义操作,以在新安装点击 InstallInitialize 之前更改 ALLUSERS 的值并在每台计算机上执行新安装。这意味着您必须尽可能早地在 InstallExecuteSequence 中移动 RemoveExistingProduct,然后在其后执行 set 属性。

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

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

【讨论】:

  • 添加了一个新答案,也留作参考。
  • 感谢您的意见。我们没有使用 Installshield。
猜你喜欢
  • 2020-08-10
  • 2019-01-28
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
  • 2015-11-03
  • 1970-01-01
  • 2017-01-07
  • 1970-01-01
相关资源
最近更新 更多