打開控制面板-程序和功能,里面能看到想要卸載的軟件名稱
根據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 安裝的應用程序。
msiexec安裝參數詳解
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