我正在尝试使用此代码卸载程序。但是,它似乎不起作用。我尝试了其他答案,但似乎也没有用。有人可以帮助我吗?我正在尝试使用给定名称(displayName)卸载程序
例如,我给displayName = Appname,那么此代码应从我的计算机上卸载Appname程序。
public static void UninstallApplictionInstalled(string p_name)
{
string displayName;
string uninstlString;
RegistryKey key;
ProcessStartInfo info = new ProcessStartInfo();
Process uninstallProcess = new Process();
string temp;
// search in: CurrentUser
key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
foreach (String keyName in key.GetSubKeyNames())
{
RegistryKey subkey = key.OpenSubKey(keyName);
displayName = Convert.ToString(subkey.GetValue("DisplayName"));
uninstlString = Convert.ToString(subkey.GetValue("UninstallString"));
if (p_name.Equals(displayName, StringComparison.OrdinalIgnoreCase) == true)
{
uninstallProcess.StartInfo.FileName = "MsiExec.exe";
uninstallProcess.StartInfo.Arguments = " /x " + uninstlString + " /quiet /norestart";
uninstallProcess.Start();
uninstallProcess.WaitForExit();
break;
//Console.WriteLine(subkey.GetValue("UninstallString"));
}
}
// search in: LocalMachine_32
key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
foreach (String keyName in key.GetSubKeyNames())
{
RegistryKey subkey = key.OpenSubKey(keyName);
displayName = Convert.ToString(subkey.GetValue("DisplayName"));
uninstlString = Convert.ToString(subkey.GetValue("UninstallString"));
if (p_name.Equals(displayName, StringComparison.OrdinalIgnoreCase) == true)
{
uninstallProcess.StartInfo.FileName = "MsiExec.exe";
uninstallProcess.StartInfo.Arguments = " /x " + uninstlString + " /quiet /norestart";
uninstallProcess.Start();
uninstallProcess.WaitForExit();
break;
//Console.WriteLine(subkey.GetValue("UninstallString"));
}
}
// search in: LocalMachine_64
key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall");
foreach (String keyName in key.GetSubKeyNames())
{
RegistryKey subkey = key.OpenSubKey(keyName);
displayName = Convert.ToString(subkey.GetValue("DisplayName"));
uninstlString = Convert.ToString(subkey.GetValue("UninstallString"));
if (p_name.Equals(displayName, StringComparison.OrdinalIgnoreCase) == true)
{
//string prdctId = uninstlString.Substring((uninstlString.IndexOf("{")));
uninstallProcess.StartInfo.FileName = "MsiExec.exe";
uninstallProcess.StartInfo.Arguments = " /x " + uninstlString + " /quiet /norestart";
uninstallProcess.Start();
uninstallProcess.WaitForExit();
break;
//Console.WriteLine(subkey.GetValue("UninstallString"));
}
}
}
答案 0 :(得分:0)
重复 :欢迎使用Stackoverflow。顺便提一下,我看到至少有3种不同口味的问题。我们将不得不关闭您的一些问题,因为重复会分散答复,并且如果人们回答(貌似)未回答的重复会浪费很多时间。
简而言之:请不要多次发布相同的问题。这是其他问题:
C# :无论如何使用C#都是笨拙的。我不会将命令行推送到 msiexec.exe
,而是直接通过MSI API进行操作。可以通过Win32 functions或COM automation访问此API。
MSI的卸载方法 :供您参考,MSI有多种踢法 卸载: Uninstalling an MSI file from the command line without using msiexec。
上面链接中的第14 部分显示了如何使用C ++卸载-如果可以的话。但是:Visual Studio 2017模板又有变化,因此可能需要进行调整才能“即用即用”。
但是,我将使用MSI API(如前所述),并且我建议您通过本机Win32函数进行操作,并建议您使用WiX工具包中的DTF(部署工具基金会)。它是MSI API的.NET包装器-可以节省许多样板代码,但必须与产品一起部署DTF DLL: Microsoft.Deployment.WindowsInstaller.dll
。我不知道这是否可以接受。如果需要的话,我的代码不依赖于DTF,但是它要长得多。
C#模拟样例 。需要对 Microsoft.Deployment.WindowsInstaller.dll
的项目引用。然后在一个新的C#.NET项目中尝试以下代码。您可以通过安装the WiX toolkit(用于创建MSI文件的开源工具包)来获取该DLL。安装后,请检入 %ProgramFiles(x86)%\WiX Toolset v3.11\bin
(适用于WiX版本-自2018年9月起有效)。
安装程序GUI :首先重要说明:通过 Installer.SetInternalUI
UI级别 >功能。如果以静默方式运行,则需要运行提升权限的可执行文件才能使卸载正常工作,否则会发生访问异常。在完全GUI模式下运行时,您需要自行提升安装-只要您有权这样做。
using System;
using Microsoft.Deployment.WindowsInstaller;
namespace UninstallMsiViaDTF
{
class Program
{
static void Main(string[] args)
{
// Update this name to search for your product. This sample searches for "Orca"
var productcode = FindProductCode("orca");
try
{
if (String.IsNullOrEmpty(productcode)) { throw new ArgumentNullException("productcode"); }
// Note: Setting InstallUIOptions to silent will fail uninstall if uninstall requires elevation since UAC prompt then does not show up
Installer.SetInternalUI(InstallUIOptions.Full); // Set MSI GUI level (run this function elevated for silent mode)
Installer.ConfigureProduct(productcode, 0, InstallState.Absent, "REBOOT=\"ReallySuppress\"");
// Check: Installer.RebootInitiated and Installer.RebootRequired;
}
catch (Exception e)
{
Console.WriteLine("Exception: " + e.Message);
}
Console.ReadLine(); // Keep console open
}
// Find product code for product name. First match found wins
static string FindProductCode(string productname)
{
var productcode = String.Empty;
foreach (ProductInstallation product in ProductInstallation.AllProducts)
{
if (product.ProductName.ToLower().Contains(productname.ToLower()))
{
productcode = product.ProductCode;
break;
}
}
return productcode;
}
}
}