VB.NET中調用MSI卸載軟件的2個辦法。本站提示廣大學習愛好者:(VB.NET中調用MSI卸載軟件的2個辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是VB.NET中調用MSI卸載軟件的2個辦法正文
最近在折騰組外面的那個破Lab,要自己寫順序每天裝置最新版本的build。而明天手頭上沒有任何義務,所以把用到的一些東西記上去以供今後參考。這篇日志來記載如何在.NET中卸載別的軟件。
一、直接運用MSI裝置包
假如你知道MSI裝置順序的途徑,那麼顯然可以直接運用即可:
msiexec /x "C:Table Manager Clients.msi" /quiet /qn
/quiet參數表示自動卸載,/qn表示 顯示任何UI。
這個辦法很復雜,引薦運用。但是假如軟件的版本不對,或許裝置順序做得有問題(比方我們這做的一個奇葩裝置順序),那麼就不行了。
msiexec /Option <Required Parameter> [Optional Parameter]
Install Options
</package | /i> <Product.msi>
Installs or configures a product
但是這個序列號是不定的,關於相反順序的不同版本,序列號也不一定相反(能夠會生成一個新的序列號)。為了失掉需求產品的序列號,就只能去查注冊表了。
二、運用產品序列號卸載順序
一切用MSI裝置的順序都會記載在HKEY_LOCAL_MACHINE的SOFTWAREMicrosoftWindowsCurrentVersionInstallerUserDataS-1-5-18Products子健下。S-1-5-18是零碎通用的用戶,能夠有其他的用戶目錄(比方我這有S-1-5-21-2109753547-707883502-1543859470-98763),應該是對應的在裝置時不共享的那些順序。
如上圖,在Products鍵下有一大堆十六進制的數字。在數字下能夠有InstallProperties子鍵(留意不是每一個都有),然後有DisplayName用於標識產品的稱號,DisplayVersion用於顯示版本號等等。我們只需求關注會用到的就行了,這裡就只關注產品稱號吧。
在左側顯示的數字並不是用於msi卸載的產品序列號。我們留意到有一個UninstallString屬性,這個屬性就是卸載這個順序的命令及參數:
MsiExec.exe /X{4B9E6EB0-0EED-4E74-9479-F982C3254F71}
那麼,我們要做的很顯然是搜索這些鍵,查找哪一個才是我們要卸載的產品,然後用UninstallString把它卸掉就行了。另外我們需求在參數上加上/quiet和/qn參數,這樣就能完成自動卸載了。
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中訪問注冊表的類封裝在Microsoft.Win32命名空間下,直接運用即可(次要運用RegistryKey類,RegisitryKey相似樹形構造)。
這就是完成自動卸載的代碼(外面有一些與輸入日志相關的代碼,可以不必管它)。
順序首先在Products鍵下搜索一切的產品,假如有InstallProperties子鍵,就婚配DisplayName能否與要卸載的順序相反,假如相反,就生成一個卸載的命令並啟動一個新的進程停止卸載。
假如卸載失敗,msiexec會前往一個不為0的數值,此時我們將錯誤信息輸入。(留意:還有兩個數值表示卸載成功但是需求重啟,請自行查找相關手冊。)