VB.NET中调用MSI卸载软件的2个方法_vb.net

最近在折腾组里面的那个破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的数值,此时我们将错误信息输出。(注意:还有两个数值表示卸载成功但是需要重启,请自行查找相关手册。)

时间: 2024-09-30 19:14:11

VB.NET中调用MSI卸载软件的2个方法_vb.net的相关文章

完全指南之在 Ubuntu 操作系统中安装及卸载软件

当你从 Windows 系统转向 Linux 系统的时候,刚开始的体验绝对是非比寻常的.在 Ubuntu 系统下就连最基本的事情,比如安装个应用程序都会让(刚从 Windows 世界来的)人感到无比困惑. 但是你也不用太担心.因为 Linux 系统提供了各种各样的方法来完成同样的任务,刚开始你感到困惑那也是正常的.你并不孤单,我们大家都是这么经历过来的. 在这篇初学者指南中,我将会教大家在 Ubuntu 系统里如何以最常用的方式来安装软件,以及如何卸载之前已安装的软件. 关于在 Ubuntu 上

如何在 Ubuntu 操作系统中安装及卸载软件

当你从 Windows 系统转向 Linux 系统的时候,刚开始的体验绝对是非比寻常的.在 Ubuntu 系统下就连最基本的事情,比如安装个应用程序都会让(刚从 Windows 世界来的)人感到无比困惑. 但是你也不用太担心.因为 Linux 系统提供了各种各样的方法来完成同样的任务,刚开始你感到困惑那也是正常的.你并不孤单,我们大家都是这么经历过来的. 在这篇初学者指南中,我将会教大家在 Ubuntu 系统里如何以最常用的方式来安装软件,以及如何卸载之前已安装的软件. 关于在 Ubuntu 上

C#中调用SAPI实现语音合成的2种方法

  这篇文章主要介绍了C#中调用SAPI实现语音合成的2种方法,本文直接给出示例代码,需要的朋友可以参考下 我们都知道现在的语音合成TTS是可以通过微软的SAPI实现的,好处我就不多说了,方便而已,因为在微软的操作系统里面就自带了这个玩意,主要的方式有两种: 1.使用COM组件技术,不管是C++,C#,Delphi都能玩的转,开发出来的东西在XP和WIN7都能跑.(要引入SpeechLib,好像在项目上点引用,然后选到系统COM吧,好久没弄,记不清楚了) 2.使用WIN7的windows api

在vb.net中调用过程

一.调用Sub过程 与Function过程不同,在表达式中,Sub过程不能用其名字调用,调用Sub过程的是一个独立的语句.Sub过程还有一点与函数不同,它不会用名字返回一个值.但是,与Function过程一样,Sub过程也可以修改传递给它们的任何变量的值.调用Sub过程有两种方法: '以下两个语句都调用了名为MyProc的Sub过程. Call MyProc(FirstArgument,SecondArgument) MyProc(FirstArgument,SecondArgument)二.调

MAC下快速卸载软件的两种方法

  MAC用户想要卸载应用程序,除了之前小编给大家说的,使用Finder选择Move To Trash之外,还有其他的方法,现在小编就为大家再介绍两种其他的卸载软件的方法吧.   第一种方法: 选中要删除的应用,按住键盘上的COMMAND + DELETE 键,即可将它删除.(这个是针对哪些无耻的无法删除的Mac App的,比如 Mac Keeper) 第二种方法: 用鼠标选中"要删除的引用",直接将它拖到废纸篓里面. 如果不想选择使用Finder中的Move To Trash,那么这

在Launchpad中如何快速卸载软件

  在Launchpad中所有的应用程序像在iPad中那样依次排开, 那我们我们就想了: 既然苹果在Lion上设置的Launchpad的灵感完全是来自iPad, 那么是否我们也可以在像在iPad中那样,一直按住某个图标来重新排列图标位置和删除程序呢?? 经过小编测试,发现在iPad中能实现的功能,在Launchpad中同样能够实现! 1. 持续按住一个图标,可以发现所有的图标都开始想iPad中那样不停的抖动!我们可以任意拖动图标,重新排序.删除程序等! 我们也发现,只有从MAC App Stor

VB.NET中调用窗体要先声明实例...

要从一个窗体访问另一窗体,首先要生成引用另一窗体的变量.如:dim newForm as new SetupForm然后,可以调用了如:newForm.show

vb.net中调用带日期参数的存储过程,老是提示参数不支持,请高手帮忙看看

问题描述 运行提示ProcedureorFunction'sdk_sp_showresult'expectsparameter'@date',whichwasnotsupplied.代码如下:DimconnAsSqlClient.SqlConnectionDimdadAsSqlClient.SqlDataAdapterDimdstAsDataSetDimcmmAsSqlClient.SqlCommandDimpara1AsSqlClient.SqlParameterDimpara2AsSqlCl

VB.NET中使用FTP下载文件的两种方法

下载   .net没有专门处理FTP的类,我们可以通过调用系统自带的FTP.EXE 或者是调用win32 API中的wininet.dll来完成基本操作.希望以下的代码能为大家抛砖引玉. 方法一: 使用Ftp.exe ,通过process类来调用它. Imports System.Diagnostics ...   Public Sub GetFileByCallFtp()        '定义ProcessStartInfo,Process的启动信息.         Dim psi As N