如何以编程方式卸载应用程序
本文关键字:卸载 应用程序 方式 编程 | 更新日期: 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
}