一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - vb.net - VB.NET中調用MSI卸載軟件的2個方法

VB.NET中調用MSI卸載軟件的2個方法

2021-10-08 23:42VB.NET教程網 vb.net

這篇文章主要介紹了VB.NET中調用MSI卸載軟件的2個方法,一是直接調用MSI安裝包命令,二是產品序列號卸載程序,需要的朋友可以參考下

最近在折騰組里面的那個破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),應該是對應的在安裝時不共享的那些程序。

VB.NET中調用MSI卸載軟件的2個方法

 如上圖,在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的數值,此時我們將錯誤信息輸出。(注意:還有兩個數值表示卸載成功但是需要重啟,請自行查找相關手冊。)

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 俄罗斯一级毛片免费播放 | 高h喷水荡肉爽文np肉色文 | 火影小南被爆羞羞网站 | 欧美牛逼aa| 免费视频完整版在线观看网站 | 国产一区视频在线免费观看 | 69成人影院 | 娇妻被朋友征服中文字幕 | 精品AV亚洲乱码一区二区 | 男女羞羞的视频 | 日日碰碰 | 99精品免费在线 | 女同69式互添在线观看免费 | 国产综合亚洲欧美日韩一区二区 | 九九99热久久999精品 | 隔壁老王国产在线精品 | 精品久久久久久影院免费 | 日韩欧美一区二区三区中文精品 | 800精品国产导航 | 500福利第一导航 | 四虎视屏 | 久久久久国产一级毛片高清片 | 久久精品国产亚洲AV麻豆欧美玲 | 乳女教师欲乱动漫无修版动画3d | 大ji巴好好爽好深网站 | 门房秦大爷在线阅读 | 日韩欧美推理片免费在线播放 | 欧洲第一区第二区第三区 | 情人我吃糖果小说 | 国产亚洲玖玖玖在线观看 | 国产男女性特黄录像 | 黑人biglackon10十 | 狠狠澡 | 国产欧美精品一区二区三区–老狼 | 99热在线免费观看 | 日韩在线视频一区二区三区 | sihu国产午夜精品一区二区三区 | 操久| 欧美va免费精品高清在线 | 亚洲日本中文字幕天堂网 | 五月色婷婷在线影院 |