0

我在 Visual Studio 中编写了一个 C# 程序,它使用安装和部署项目来创建一个 .msi 安装程序。“InstallAllUsers”值设置为“True”,因此默认情况下会安装“Everyone”,但用户可以在安装过程中将其更改为“Just Me”。

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

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

* 编辑 *

为了更清晰的图片:

当我对我的程序进行更改时,我会增加版本号并将更新的 .msi 提供给用户,他们只是重新运行安装程序。最初应该只有几个用户,所以我没有制作复杂的更新程序。现在有很多用户,并且更新程序正在进行中。目前,当前用户对这个过程很满意——我给他们一个新的 .msi,然后他们再次运行它——除了一件事:安装程序不会“记住”他们上次运行安装程序时的设置(他们的话,不是我的)。我可以从“卸载”注册值中获取他们上次安装的目录,并使用 TARGETDIR 进行设置,因此我已经覆盖了安装路径。但我想弄清楚用户上次是否将“Everyone”更改为“Just Me”。

4

3 回答 3

0

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

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

有这方面的 API,因此它比根据注册表中可能存在的内容进行猜测更可取。

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

于 2016-09-03T17:11:39.087 回答
0

由于与升级、修补等有关的所有问题,我不喜欢按用户安装...因此,在使用Installshield及其内置的主要更新安装期间,我设法将按用户安装迁移到每台计算机ISSetAllUsers自定义操作以及各种标准操作的重新排序。可以在此处找到描述:windows Installer - 当安装策略中的版本不同时卸载以前的版本(每用户,每机器)

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

于 2016-09-04T20:40:04.360 回答
0

一种方法是在注册表中检查当前登录的用户,看看它是否有在已安装软件列表中列出的软件HKEY_CURRENT_USER\SOFTWARE\*

于 2016-09-02T22:03:16.553 回答