C#卸载软件 msiexec安装参数详解

时间:2024-02-29 15:13:44

打开控制面板-程序和功能,里面能看到想要卸载的软件名称

 

根据DisplayName就能找到UninstallString

 

public static string GetProductGuid(string displayName)
{
    string productGuid = string.Empty;

    string bit32 = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
    //注意 64位的程序还可能在: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\

    RegistryKey localMachine = Registry.LocalMachine;
    RegistryKey unistall = localMachine.OpenSubKey(bit32, true);

    var subNames = unistall.GetSubKeyNames();

    foreach (string subkey in subNames)
    {
        RegistryKey product = unistall.OpenSubKey(subkey);
        try
        {
            if (product.GetValueNames().Any(n => n == "DisplayName") == true)
            {
                string tempDisplayName = product.GetValue("DisplayName").ToString();
                if (tempDisplayName == displayName && product.GetValueNames().Any(n => n == "UninstallString") == true)
                {
                    var unitstallStr = product.GetValue("UninstallString").ToString();
                    
                    //注意:如果不包含MsiExec,可以返回unitstallStr   
                    if (unitstallStr.Contains("MsiExec.exe"))
                    {
                        string[] strs = unitstallStr.Split(new char[2] { \'{\', \'}\' });
                        productGuid = strs[1];
                        break;
                    }
                }
            }
        }
        catch
        {
            return string.Empty;
        }
    }

    return productGuid;
}

 

如果找不到,就要手动在注册表  HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall 下面找到DisplayName和卸载字符串

 

 

卸载

Process p = new Process();
p.StartInfo.FileName = "msiexec.exe";
//用 /i 替换 /x 就不会弹出提示框 “您确定要卸载此产品吗?”
p.StartInfo.Arguments = "/x {72D96FC3-7E2F-448B-86DA-4CB1C8882407}";

p.Start(); 

 

Process p = new Process();
p.StartInfo.FileName=@"C:\Program Files (x86)\InstallShield Installation Information\{05B77F59-5655-4E62-8139-BD9E400D8D15}\setup.exe" ;
p.StartInfo.Arguments=" -runfromtemp -l0x0409  -removeonly";
p.Start(); 

 

 

 

当我们把  HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall  中的所有注册表项都浏览一遍后,发现在控制面板的“添加删除程序”列表中的应用程序好像并没有全部显示在这里,例如我们常用的 Office 系列就找不到相应的注册表项。这是怎么回事呢?
    原来,还有其它两个注册表项用来保存已注册的应用程序信息,它们就是  HKEY_CLASSES_ROOT/Installer/Products  和  HKEY_CURRENT_USER/Software/Microsoft/Installer/Products 。如果我们把这三个注册表项定义的全部应用程序都加在一起,就是我们在“添加删除程序”列表中看到的所有程序了。
     HKEY_CLASSES_ROOT/Installer/Products  和  HKEY_CURRENT_USER/Software/Microsoft/Installer/Products  主要用来保存那些基于 Windows Installer 安装的应用程序,例如 Office;而  HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall  则主要用来保存那些基于其它安装程序的应用程序,例如常见的基于 InstallShield 安装的应用程序。

 

 

 

 

 

 

1 安装

/i表示安装,/x 表示卸载/f表示修复。/l*v 表示输出详细日志
安装参数有
/qn 无用户界面;/qb 基本界面; /qr 精简界面;/qf 完整界面(默认值)

/q 设置 UI 级别。
q、qn - 没有 UI。
qb 基本 UI。
qr 简化的 UI。 在安装结束时显示 一个模式对话框。
qf 完整 UI。在安装结束时显示 一个模式对话框。
qn+ 没有 UI。但是,在安装结束时显示一个模式对话框。
qb+ 基本 UI。在安装结束时显示一个模式对话框。如果取消安装,将不显示模式对话框。
qb- 不带模式对话框的基本 UI。
qb+-开关不是一个受支持的 UI 级别。

下面以安装msicreate.msi为例

(1)/qn
msiexec /i \\troy\ISO_ISO\tools\msicreate.msi /qn /l*v msiexec_log.txt

 

 

执行后软件自动装上,没有跳出任何安装界面,在和bat文件相同目录的位置出现日志。

(2)/qb
msiexec /i \\troy\ISO_ISO\tools\msicreate.msi /qb /l*v msiexec_log.txt



只跳出上图的安装界面,之后没有任何界面,期间无需用户操作,安装完全自动完成。

(3)/qr
msiexec /i \\troy\ISO_ISO\tools\msicreate.msi /qr /l*v msiexec_log.txt



只出现上面的界面,无需用户交互,安装自动完成

(4)/qf
msiexec /i \\troy\ISO_ISO\tools\msicreate.msi /qf /l*v msiexec_log.txt



出现上图,需要用户交互操作,才能完成安装。(默认的安装方式,和不加任何安装参数效果一样)

(5)/qn+
msiexec /i\\troy\ISO_ISO\tools\msicreate.msi /qn+ /l*v msiexec_log.txt



和/qn的区别是安装结束后会出现上图的成功安装对话框

(6)/qb+
msiexec /i \\troy\ISO_ISO\tools\msicreate.msi /qb+ /l*v msiexec_log.txt





和/qb之间的差别是在安装结束之后,会跳出安装成功的对话框。

(7)/qb-
msiexec /i\\troy\ISO_ISO\tools\msicreate.msi /qb- /l*v msiexec_log.txt
没看出和/qb之间的区别
(8)/qb+-
msiexec /i \\troy\ISO_ISO\tools\msicreate.msi /qb+- /l*v msiexec_log.txt
没看出和/qb+-之间的区别

另外,在默认安装的时候只是针对当前用户的,而非admin的时候。如果要对所有用户的话,就要用到ALLUSERS=1,如:

msiexec /i \\troy\ISO_ISO\tools\msicreate.msi /qb+- /l*v msiexec_log.txt  ALLUSERS=1