VB.NET中調(diào)用MSI卸載軟件的2個(gè)方法
最近在折騰組里面的那個(gè)破Lab,要自己寫程序每天安裝最新版本的build。而今天手頭上沒有任何任務(wù),所以把用到的一些東西記下來以供今后參考。這篇日志來記錄如何在.NET中卸載別的軟件。
一、直接使用MSI安裝包
如果你知道MSI安裝程序的路徑,那么顯然可以直接使用即可:
msiexec /x "C:Table Manager Clients.msi" /quiet /qn
/quiet參數(shù)表示自動(dòng)卸載,/qn表示 顯示任何UI。
這個(gè)方法很簡(jiǎn)單,推薦使用。但是如果軟件的版本不對(duì),或者安裝程序做得有問題(比如我們這做的一個(gè)奇葩安裝程序),那么就不行了。
msiexec /Option <Required Parameter> [Optional Parameter]
Install Options
</package | /i> <Product.msi>
Installs or configures a product
但是這個(gè)序列號(hào)是不定的,對(duì)于相同程序的不同版本,序列號(hào)也不一定相同(可能會(huì)生成一個(gè)新的序列號(hào))。為了得到需要產(chǎn)品的序列號(hào),就只能去查注冊(cè)表了。
二、使用產(chǎn)品序列號(hào)卸載程序
所有用MSI安裝的程序都會(huì)記錄在HKEY_LOCAL_MACHINE的SOFTWAREMicrosoftWindowsCurrentVersionInstallerUserDataS-1-5-18Products子健下。S-1-5-18是系統(tǒng)通用的用戶,可能有其他的用戶目錄(比如我這有S-1-5-21-2109753547-707883502-1543859470-98763),應(yīng)該是對(duì)應(yīng)的在安裝時(shí)不共享的那些程序。
如上圖,在Products鍵下有一大堆十六進(jìn)制的數(shù)字。在數(shù)字下可能有InstallProperties子鍵(注意不是每一個(gè)都有),然后有DisplayName用于標(biāo)識(shí)產(chǎn)品的名稱,DisplayVersion用于顯示版本號(hào)等等。我們只需要關(guān)注會(huì)用到的就行了,這里就只關(guān)注產(chǎn)品名稱吧。
在左側(cè)顯示的數(shù)字并不是用于msi卸載的產(chǎn)品序列號(hào)。我們注意到有一個(gè)UninstallString屬性,這個(gè)屬性就是卸載這個(gè)程序的命令及參數(shù):
MsiExec.exe /X{4B9E6EB0-0EED-4E74-9479-F982C3254F71}
那么,我們要做的很顯然是搜索這些鍵,查找哪一個(gè)才是我們要卸載的產(chǎn)品,然后用UninstallString把它卸掉就行了。另外我們需要在參數(shù)上加上/quiet和/qn參數(shù),這樣就能實(shí)現(xiàn)自動(dòng)卸載了。
Private Sub UninstallMsi(productName As String)
Dim reg_path As String = "SOFTWAREMicrosoftWindowsCurrentVersionInstallerUserDataS-1-5-18Products"
Dim key As RegistryKey = Registry.LocalMachine.OpenSubKey(reg_path)
For Each temp_key_name As String In key.GetSubKeyNames()
Dim temp_key As RegistryKey = key.OpenSubKey(temp_key_name & "InstallProperties")
If temp_key IsNot Nothing Then
If temp_key.GetValue("DisplayName").ToString.Trim.ToLower = productName.Trim.ToLower Then
Dim uninstall_string As String = temp_key.GetValue("UninstallString").ToString
uninstall_string = uninstall_string.ToLower.Replace("msiexec.exe", "").Replace("msiexec", "").ToUpper
uninstall_string = uninstall_string.Replace("/I", "/x")
uninstall_string = uninstall_string.Replace("/i", "/x")
uninstall_string &= " /quiet /qn"
Console.WriteLine("Uninstalling product " & uninstall_string)
LogDataAccess.InsertApplicationLog(TMConfigrationManager.GetConfig("ServerType"), _
"Uninstalling " & productName & """" & uninstall_string & """ ...")
Dim proc_start_info As New ProcessStartInfo("msiexec", uninstall_string)
Dim proc As Process = Process.Start(proc_start_info)
If (proc IsNot Nothing) Then proc.WaitForExit()
If proc.ExitCode <> 0 Then
Dim err_message As String = "Uninstall " & productName & " failed."
LogDataAccess.InsertApplicationLog(TMConfigrationManager.GetConfig("ServerType"), err_message)
Console.WriteLine(err_message)
End If
LogDataAccess.InsertApplicationLog(TMConfigrationManager.GetConfig("ServerType"), "Uninstall previous version of " & productName & " successful.")
Exit Sub
End If
End If
Next
Dim message As String = "Cannot find " & productName & " registry entries. Do not need to uninstall."
LogDataAccess.InsertApplicationLog(TMConfigrationManager.GetConfig("ServerType"), message)
Console.WriteLine(message)
End Sub
.NET中訪問注冊(cè)表的類封裝在Microsoft.Win32命名空間下,直接使用即可(主要使用RegistryKey類,RegisitryKey類似樹形結(jié)構(gòu))。
這就是實(shí)現(xiàn)自動(dòng)卸載的代碼(里面有一些與輸出日志相關(guān)的代碼,可以不用管它)。
程序首先在Products鍵下搜索所有的產(chǎn)品,如果有InstallProperties子鍵,就匹配DisplayName是否與要卸載的程序相同,如果相同,就生成一個(gè)卸載的命令并啟動(dòng)一個(gè)新的進(jìn)程進(jìn)行卸載。
如果卸載失敗,msiexec會(huì)返回一個(gè)不為0的數(shù)值,此時(shí)我們將錯(cuò)誤信息輸出。(注意:還有兩個(gè)數(shù)值表示卸載成功但是需要重啟,請(qǐng)自行查找相關(guān)手冊(cè)。)
上一篇:VBS下載者(通過vbscript實(shí)現(xiàn)文件下載)
欄 目:vb
本文標(biāo)題:VB.NET中調(diào)用MSI卸載軟件的2個(gè)方法
本文地址:http://mengdiqiu.com.cn/a1/vb/7258.html
您可能感興趣的文章
- 01-10VBS中的正則表達(dá)式的用法大全 <font color=red>原創(chuàng)&
- 01-10VBS中SendKeys的基本應(yīng)用
- 01-10VBS中Select CASE的其它用法
- 01-10VBScript教程 第二課在HTML頁(yè)面中添加VBscript代碼
- 01-10VBScript教程 第十四課在VBScript中使用對(duì)象
- 01-10MsgBox函數(shù)語言參考
- 01-10VBS教程:函數(shù)-Mid 函數(shù)
- 01-10利用vbscript腳本修改文件內(nèi)容,此適用于自動(dòng)化的操作中
- 01-10VBS教程:在 VBScript 中使用對(duì)象
- 01-10ntiIframe.vbs用于批量清除被添加到文件中的惡意代碼


閱讀排行
- 1C語言 while語句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10下載文件到本地運(yùn)行的vbs
- 01-10飄葉千夫指源代碼,又稱qq刷屏器
- 01-10SendKeys參考文檔
- 01-10什么是一個(gè)高效的軟件
- 01-10VBS中的正則表達(dá)式的用法大全 &l
- 01-10exe2swf 工具(Adodb.Stream版)
- 01-10VBS中SendKeys的基本應(yīng)用
- 01-10用VBSCRIPT控制ONSUBMIT事件
- 01-10VBScript教程 第十一課深入VBScript
- 01-10VBScript語法速查及實(shí)例說明
隨機(jī)閱讀
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10delphi制作wav文件的方法
- 04-02jquery與jsp,用jquery
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載