MSI 安装程序选项 - 卸载应用程序 [重复]

Posted

技术标签:

【中文标题】MSI 安装程序选项 - 卸载应用程序 [重复]【英文标题】:MSI installer option- uninstalling an application [duplicate] 【发布时间】:2019-02-15 11:05:19 【问题描述】:

如果我运行下面的代码,我很确定我应该获得应用程序的产品名称和 GUID(例如 App Path | xxx)。但我只得到了路径,没有显示 GUID。有人可以帮我吗?

// search in: LocalMachine_64
key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall");
foreach (String keyName in key.GetSubKeyNames())

    RegistryKey subkey = key.OpenSubKey(keyName);
    displayName = Convert.ToString(subkey.GetValue("DisplayName"));
    uninstlString = Convert.ToString(subkey.GetValue("UninstallString"));

    if (p_name.Equals(displayName, StringComparison.OrdinalIgnoreCase))
    
        Console.WriteLine(subkey.GetValue("UninstallString"));
        //string prdctId = uninstlString.Substring((uninstlString.IndexOf("")));
        string prdctId = uninstlString.Substring(12);
        uninstallProcess.StartInfo.FileName = "MsiExec.exe";
        uninstallProcess.StartInfo.Arguments = " /x " + prdctId + " /quiet /norestart";
        uninstallProcess.StartInfo.UseShellExecute = true;
        uninstallProcess.Start();
        uninstallProcess.WaitForExit();
        break;
        //Console.WriteLine(subkey.GetValue("UninstallString"));
    

这是我运行代码的图像

【问题讨论】:

无论你多少次,你仍然会得到类似的答案。 UninstallString您运行以卸载该应用程序。你不能/不应该把它拆开,尝试处理它,等等。 从这一系列问题中清楚的是,(个人,您的团队/部门/单位/公司)不会拥有您要卸载的应用程序。 (如果你这样做了,你就不会在注册表中寻找他们的卸载信息)。您想要悄悄卸载不属于您的应用程序这一事实让我严重怀疑您的动机。如果这样做有合法理由,请编辑您现有的问题之一,并明确该用例。 【参考方案1】:

我相信UninstallString 值是通过Add/Remove Programs 卸载应用程序时执行的值。正如您的控制台输出所示,它是可执行文件的路径。

您检索产品 ID 的方式...

string prdctId = uninstlString.Substring(12);

...因此,不正确,因为您采用的是部分路径。您需要传递给MsiExec.exe /x 的是产品代码,即注册表项名称本身,即......

string prdctId = keyName;

如果您从Command Prompt 调用该命令行,我很确定大括号需要在产品代码周围加上引号;我不确定在直接调用可执行文件时是否需要这样做,但这不会有什么坏处……

uninstallProcess.StartInfo.Arguments = " /x \"" + prdctId + "\" /quiet /norestart";

【讨论】:

抱歉,我该如何获取 keyName...? 您已经拥有keyName。这是你的 foreach 循环迭代变量。 哦,对了..那么 UninstallString 是不是不必要的? 是和不是。您的代码不需要像您一样调用MsiExec.exe,但是您可以执行存储在UninstallString 中的命令行,而不是使用MsiExec.exe,尽管您会受到卸载程序发生的事情的摆布提供而不是MsiExec.exe的一致接口。 我试过了...仍然没有卸载:

以上是关于MSI 安装程序选项 - 卸载应用程序 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

MSI 安装程序未正确卸载产品

如何从包含多个 MSI 的 wix 自定义引导程序包中安装/卸载单个 msi,例如安装项目的添加/删除功能?

用Wix手工编辑XML制作C++ MSI安装程序,怎样保证安装新版本时候强制卸载旧版本,急急急!!!

MSI没有卸载.dll文件

MSI 未卸载 .dll 文件

WIX安装项目未完全卸载应用程序