检测所有用户.msi

本文关键字:msi 用户 检测 | 更新日期: 2023-09-27 18:05:20

我在Visual Studio中编写了一个c#程序,使用了Setup &用于创建.msi安装程序的部署项目。"InstallAllUsers"的值被设置为"True",因此它将默认安装"Everyone",但用户可以在安装过程中将其更改为"Just Me"。

这只是一个基本的安装程序-没什么特别的。

我的问题是:在他们安装程序之后,有没有办法告诉他们选择了哪个选项?是否有一个注册表项,我可以挖掘,将告诉我他们是否选择"每个人"或"只有我"在安装过程中?我没有以编程方式添加任何注册表项,我可以找到"卸载"键为我的程序,但我不知道是否有一个值在那里会告诉我。

* EDIT *

查看更清晰的图片:

当我对程序进行更改时,我增加版本号并将更新后的.msi提供给用户,他们只需重新运行安装程序。最初应该只有几个用户,所以我没有做一个复杂的更新程序。现在有很多用户,更新程序也在进行中。目前,当前的用户对这个过程很满意——我给他们一个新的。msi,他们再运行一次——除了一件事:安装程序不会"记住"他们上次运行安装程序时的设置(他们的话,不是我的话)。我可以从"Uninstall"注册表值中获得它们最后一次安装的目录,并使用TARGETDIR对其进行设置,这样我就覆盖了安装路径。但是我想弄清楚用户上次是否把"Everyone"改成了"Just Me"。

检测所有用户.msi

一种方法是检查当前登录用户的注册表,看看它是否有HKEY_CURRENT_USER'SOFTWARE'*

下的已安装软件列表中列出的软件

这里有一个枚举产品的示例,以查找它们安装在哪个上下文中。如果你知道ProductCode,你可以只做MsiGetProductInfo部分。

https://msdn.microsoft.com/en-us/library/windows/desktop/aa368279 (v = vs.85) . aspx

有用于此的api,因此比基于注册表中的内容猜测更可取。

Visual Studio安装项目中的安装文件夹属性窗口有一个InstallAllUsersVisible属性,你应该设置为False。否则,当您使用RemoveExistingProducts=True进行升级时,这将是一场噩梦,因为这要求升级与原始安装处于相同的上下文中。你会发现有人试图与所有用户一起升级安装的仅我一个人的产品,但它不会工作。

我不喜欢按用户安装,因为所有的问题都与升级,补丁等有关。因此,在使用Installshield及其内置的ISSetAllUsers自定义操作加上各种标准操作的重新排序期间,我设法将每个用户安装迁移到每个机器。说明可以在这里找到:windows Installer -当版本的安装策略不同(每个用户,每台机器)时卸载以前的版本

如果您想将所有安装迁移到每台机器安装,您可以使用phil的建议复制这种方法,通过您自己的自定义操作读取当前安装上下文,然后运行这个自定义操作来代替Installshield提供的ISSetAllUsers自定义操作。然后,您可以按照上面的链接执行其余的过程。