检测所有用户.msi

时间:2016-09-02 21:56:28

标签: c# windows-installer registry visual-studio-setup-proje

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

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

我的问题是:安装程序后,有没有办法告诉他们选择哪个选项?是否有我可以挖掘的注册表项,它会告诉我他们是否选择了" Everyone"或者"只是我"安装期间?我没有以编程方式添加任何注册表项,我可以找到"卸载"我的计划的关键,但我不知道那里是否有价值告诉我。

*编辑*

更清晰的图片:

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

3 个答案:

答案 0 :(得分:0)

一种方法是检查注册表中当前登录的用户,看看它是否在>>> ("0x" + ("{:0>2X}" * len(a))).format(*tuple(a[::-1])) '0x1F0403020100' 下的已安装软件列表中列出了该软件

答案 1 :(得分:0)

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

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

有这样的API,因此比根据注册表中的内容进行猜测更为可取。

Visual Studio安装项目中的安装文件夹属性窗口具有应设置为False的InstallAllUsersVisible属性。否则,当您使用RemoveExistingProducts = True进行升级时,这将成为一场噩梦,因为这需要升级与原始安装在同一上下文中。您会发现有人尝试使用已安装的Just me产品的所有用户进行升级,但无法使用。

答案 2 :(得分:0)

由于与升级,修补等相关的所有问题,我不喜欢每用户安装...因此我设法将每用户安装迁移到使用 Installshield 及其内置的 ISSetAllUsers 自定义操作以及各种标准操作的重新排序进行主要更新安装期间的每台计算机。可以在此处找到说明:{{3}}

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