如何以编程方式卸载应用程序

本文关键字:卸载 应用程序 方式 编程 | 更新日期: 2023-09-27 18:28:59

我尝试过这样做,这是为了以编程方式卸载应用程序。我没有收到任何错误或异常,但应用程序没有从我的机器上卸载。请参阅试用代码也

public static string GetUninstallCommandFor(string productDisplayName)
{
    RegistryKey localMachine = Registry.LocalMachine;
    string productsRoot = @"SOFTWARE'Microsoft'Windows'CurrentVersion'Installer'UserData'S-1-5-18'Products";
    RegistryKey products = localMachine.OpenSubKey(productsRoot);
    string[] productFolders = products.GetSubKeyNames();
    foreach (string p in productFolders)
    {
        RegistryKey installProperties = products.OpenSubKey(p + @"'InstallProperties");
        if (installProperties != null)
        {
            string displayName = (string)installProperties.GetValue("DisplayName");
            if ((displayName != null) && (displayName.Contains(productDisplayName)))
            {
                string uninstallCommand =(string)installProperties.GetValue("UninstallString");
                return uninstallCommand;
            }
        }
    }
    return "";        
}

请帮助我使用C#以编程方式卸载该应用程序。

如何以编程方式卸载应用程序

上面的例程将返回一个字符串,假设它找到了一个匹配项,可能看起来像:

MsiExec.exe /X{02DA0248-DB55-44A7-8DC6-DBA573AEEA94}

你需要把它作为一个过程来运行:

System.Diagnostics.Process.Start(uninstallString);

注意它可能并不总是msiexec,它可以是程序选择指定的任何内容。在msiexec的情况下,可以将/q参数附加到uninstallString中,使其以静默方式卸载(并且不会显示"修复/删除"对话框)。

更新:如果您使用的是Windows安装程序3.0或更高版本,您也可以使用/quiet进行静默安装/卸载。它与/qn基本相同(如果您使用的是旧版本)。来源感谢@JRO提出!

使用UninstallString属性不足以卸载产品。根据微软的说法,该财产意味着:

UninstallString由Windows安装程序确定和设置。

这意味着字符串可以是Msiexec.exe /I{someProductKey}。这不会卸载任何内容。但是,它可以帮助您获得productKey。在提示符下运行命令powershellmsiexec.exe /?将显示选项。在那里你可以看到如何卸载产品。

为了获得productKeyCode您可以通过多种方式实现这一点,但仅举一个使用正则表达式的例子:

var uninstallCommand = (string)installProperties.GetValue ("UninstallString");
var productKey       = Regex.Match (uninstallCommand, @"'{([^(*)]*)'}").Groups[0].Value;
// Once you get the product key, uninstall it properly.
var processInfo = new ProcessStartInfo ();
processInfo.Arguments       = $"/uninstall {productKey} /quiet";
processInfo.CreateNoWindow  = true;
processInfo.UseShellExecute = false;
processInfo.FileName        = "msiexec.exe";
var process = System.Diagnostics.Process.Start (processInfo);

也许在你的@"SOFTWARE'Microsoft'Windows'CurrentVersion'Installer'UserData"中可以有多个文件夹,如果你只是硬编码文件夹名称,你的产品就找不到了。就像:

var localMachine    = Registry.LocalMachine;
var userDataRoot    = @"SOFTWARE'Microsoft'Windows'CurrentVersion'Installer'UserData";
var userData        = localMachine.OpenSubKey (userDataRoot);
string[]    userDataFolders = userData.GetSubKeyNames ();
foreach (var folder in userDataFolders)
{
   var productsRoot   = @$"{userDataRoot}'{folder}'Products";
   var products       = localMachine.OpenSubKey (productsRoot);
   string[]    productFolders = products.GetSubKeyNames ();
   foreach (string p in productFolders)
   {
      // code
   }