MSI:如何检索谁安装了产品?

时间:2014-11-25 12:00:49

标签: c# windows-installer

MSI安装程序可以安装PerUser或PerMachine。

我想在新版本安装之前检测:以前的版本是安装PerUser还是PerMachine?

如果PerMachine什么也不做,因为安装程序将删除以前的版本并安装新版本,好的。 如果PerUser然后检查:它是否安装了当前用户的用户? 如果安装的当前用户==用户建议用户将安装切换到PerUser并继续。 否则给出消息" User' other_user'需要手动卸载等#34;。

问题是:我如何在c#中检查安装当前版本产品的用户名?

2 个答案:

答案 0 :(得分:3)

奥列格,

根据您提出的其他问题,我了解您所处的问题。这很不幸,但您无能为力。您可以将MSI包装在引导程序(EXE)中,以删除登录人员的任何现有每用户安装(假设它没有使用SYSTEM帐户推送到计算机),但这不能处理某些其他情况用户个人资料已安装该应用。

这是关于你的情况我能想到的最好的事情。创建新安装程序以安装到新目录和新注册表项(与旧应用程序完全不同的脚印)。为这个新的MSI提供一个新的UpgradeCode属性。创建一个活动的安装程序注册表项,以便在用户下次登录然后重新启动计算机时运行清理实用程序。将旧的UpgradeCode放在升级表中,以防万一你可以为旧的每台机器安装而幸运。

当有人第一次登录时,您的EXE将会运行。然后,它可以执行MSI API查询以查找旧版本的产品并执行卸载。及时删除旧应用程序。

我记得很久以前,在我了解ALLUSERS属性之前,让自己陷入了这种情况。每用户安装是一种痛苦,仅对非特权的“病毒”(如社交传播)应用程序有用。对于商业/企业应用来说,这不是一个好故事。

答案 1 :(得分:1)

你想要的东西没有意义。

单用户可以看到每用户安装,如果您以用户B身份运行,您将无法检索有关用户A的每用户安装应用程序的信息。只有每台计算机的安装可见为所有用户。

看看这里:

http://msdn.microsoft.com/en-us/library/aa369786(v=vs.85).aspx

  

注意如果在每个用户的安装中安装了一个应用程序   上下文,还必须执行对应用程序的任何主要升级   使用每用户上下文。如果安装了应用程序   每台机器安装上下文,对应用程序的任何重大升级   还必须使用每台机器上下文执行。 Windows   安装程序不会在安装上下文中安装主要升级。

现在回答您的问题...如果您正在为每个用户执行安装程序并且升级安装程序检测到以前的版本,则表示当前用户已安装它。