Windows安装程序 - 当安装策略(每个用户,每台机器)不同时,卸载先前的版本。

4
我们有一个Visio插件(如版本1),用户以管理员身份按用户(“仅我”选项)安装,msi安装程序使用Visual Studio的设置和部署创建。后来,由于组织政策要求吊销所有用户的管理员权限,所以新版本(版本2)需要由IT管理员作为每台机器(everyone选项)安装,以便插件对该机器上的所有用户都可用,并卸载由权限被吊销的用户安装的旧版本(版本1)。
我们正在尝试自动化卸载以避免手动干预。该实用程序通过查看该计算机上的注册表键来检测已安装的应用程序的所有已安装实例,并使用msiexec强制卸载。但是,msiexec无法卸载由其他用户安装的版本,退出代码为1605-此操作仅适用于当前安装的产品。
如果向安装版本1插件的用户授予管理员权限以卸载应用程序,则可以手动卸载它,这证明了应用程序未被篡改并且处于可以无问题卸载的状态。
关于如何编程方式卸载由“仅我”选项安装的其他用户安装的应用程序的任何指针都将非常有帮助。

抱歉,你运气不好。Visual Studio安装包非常糟糕,管理员安装的每个用户包到每台机器位置更是如此。很抱歉,你没有办法了! - saschabeaumont
3个回答

4

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


你说得对。我们联系了微软支持,答案是这是设计上的问题。唯一的方法是手动卸载,然后再进行自动安装。 - jbagavathi
@Christopher Painter http://stackoverflow.com/questions/30450998/installscopedlg-in-custom-wix-ui-not-working 帮我解决这个问题。 - Dah Sra

3
我找到了更多的文档:
如果您使用的是Installshield,则可以使用以下方法来消除现有的每个用户安装并安装新的每台机器包。如果您不使用Installshield,则可以使用自己的替代CA来替换“ISSetAllUsers”。以下假定“major upgrade”已正确填充Upgrade表-在搜索“major upgrade”的信息时执行以下操作:
1. 在FindRelatedProducts之前插入Installshield的ISSetAllUsers自定义操作。此操作将读取现有安装的ALLUSERS值并强制其适用于新设置。有关添加此操作的详细信息,请参见下文。 2. 在InstallInitialize之前,将RemoveExistingProducts提前移动到序列中。 3. 在RemoveExistingProducts后立即使用set property CAALLUSERS设置回1。 4. 非常重要的是,在InstallInitialize之前完成上述两个操作。如果ALLUSERS的值在InstallInitialize之后更改,则所有组件在安装后都将处于未识别状态,通常会发生自我修复。
为了插入ISSetAllUsers自定义操作,您需要执行以下操作:
1. 在Installshield中选择工具->选项->常规->启用“自动创建ISSetAllUsers操作”。单击确定。 2. 转到升级视图并插入一个虚拟条目。 3. 转到直接编辑器,从Upgrade表中删除虚拟条目。 4. ISSetAllUsers操作应该已插入。转到InstallExecuteSequence视图并将操作移动到FindRelatedProducts之前。 重要提示:请注意,除非需要执行每个用户到每台机器的迁移,否则不应向任何项目添加ISSetAllUsers自定义操作。除非使用set property自定义操作强制执行每台机器的安装(如上述场景所描述的那样),否则此操作将有效地确保新设置与旧设置具有相同的值。

这将仅删除当前用户的安装。所有其他用户将在“添加或删除程序”中看到旧版本和新版本。您知道一种方法可以为所有用户执行此操作吗? - ChrisM

1

我几年前创建了一个包来完成这个任务,但是我怎么也找不到它了(请参见上面的答案)。据我回忆,它涉及使用主要升级升级表来在正确的用户上下文中卸载每个用户安装,然后使用设置属性自定义操作在新安装命中InstallInitialize并执行新的机器安装之前更改ALLUSERS的值。这意味着您必须尽早将RemoveExistingProduct移动到InstallExecuteSequence中,并在其后立即进行属性设置。

听起来很疯狂,但据我回忆,在经过一些严格的测试和调试后它确实有效。关键部分是以最初安装每个用户的用户身份运行新的安装程序。由于 SCCM 可能在不同的上下文中运行安装程序,因此这并不总是容易做到。您还可能需要将 RemoveExistingProducts 移动到序列中更早的位置,并将某些标准操作放在其后才能使其正常工作。我记不清了 - 抱歉。您可以使用 ActiveSetup 来安排安装程序“每个用户仅运行一次”。然后,您可能需要抑制设置 GUI,以避免如果安装程序不存在而向每个用户发送错误消息。
请注意,以上内容在 Orca 中很难实现。请尝试使用 Wise for Windows Installer 或 Installshield。请注意,Installshield 包也有自己的重新提取 ALLUSERS 值的方法,您可能需要禁用它们的变体才能使您的工作正常进行。这并不容易 :-)。

添加了一个新答案,同时保留此内容以供参考。 - Stein Åsmul
感谢您的回复。我们没有使用Installshield。 - jbagavathi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接