使用c#以编程方式卸载软件

我想通过使用我的代码卸载软件,我已经尝试过wmic方法来执行卸载,但它无法在系统中找到我的软件。 是否可以在不使用msi文件或任何安装文件的情况下卸载。我发现此代码但它不起作用—

public 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 ""; } 

最可靠的方法是以编程方式执行以下shell命令:

 msiexec.exe /x {PRODUCT-GUID} 

如果您制作了原始MSI,则可以访问PRODUCT-GUID,这就是您所需要的。 不需要实际的MSI文件,因为Windows正为此目的存放了这个文件的副本。

仅供参考:

 Windows ® Installer. V 5.0.14393.0 msiexec /Option  [Optional Parameter] Install Options   Installs or configures a product /a  Administrative install - Installs a product on the network /j  [/t ] [/g ] Advertises a product - m to all users, u to current user   Uninstalls the product Display Options /quiet Quiet mode, no user interaction /passive Unattended mode - progress bar only /q[n|b|r|f] Sets user interface level n - No UI b - Basic UI r - Reduced UI f - Full UI (default) /help Help information Restart Options /norestart Do not restart after the installation is complete /promptrestart Prompts the user for restart if necessary /forcerestart Always restart the computer after installation Logging Options /l[i|w|e|a|r|u|c|m|o|p|v|x|+|!|*]  i - Status messages w - Nonfatal warnings e - All error messages a - Start up of actions r - Action-specific records u - User requests c - Initial UI parameters m - Out-of-memory or fatal exit information o - Out-of-disk-space messages p - Terminal properties v - Verbose output x - Extra debugging information + - Append to existing log file ! - Flush each line to the log * - Log all information, except for v and x options /log  Equivalent of /l*  Update Options /update [;Update2.msp] Applies update(s) /uninstall [;Update2.msp] /package  Remove update(s) for a product Repair Options /f[p|e|c|m|s|o|d|a|u|v]  Repairs a product p - only if file is missing o - if file is missing or an older version is installed (default) e - if file is missing or an equal or older version is installed d - if file is missing or a different version is installed c - if file is missing or checksum does not match the calculated value a - forces all files to be reinstalled u - all required user-specific registry entries (default) m - all required computer-specific registry entries (default) s - all existing shortcuts (default) v - runs from source and recaches local package Setting Public Properties [PROPERTY=PropertyValue] 

试试这个

我们使用以下格式获取ManagementObject属性:

列出已安装应用程序的完整代码块:

 using System.Management private List ListPrograms() { List programs = new List(); try { ManagementObjectSearcher mos = new ManagementObjectSearcher("SELECT * FROM Win32_Product"); foreach (ManagementObject mo in mos.Get()) { try { //more properties: //http://msdn.microsoft.com/en-us/library/windows/desktop/aa394378(v=vs.85).aspx programs.Add(mo["Name"].ToString()); } catch (Exception ex) { //this program may not have a name property } } return programs; } catch (Exception ex) { return programs; } } 

现在我们已经安装了应用程序列表,我们应该能够将[Name]属性传递给我们的uninstall方法。

我们现在需要调用Win32_Product方法来“卸载”

这是卸载应用程序的整个块,稍后我会详细介绍。

  private bool UninstallProgram(string ProgramName) { try { ManagementObjectSearcher mos = new ManagementObjectSearcher( "SELECT * FROM Win32_Product WHERE Name = '" + ProgramName + "'"); foreach (ManagementObject mo in mos.Get()) { try { if (mo["Name"].ToString() == ProgramName) { object hr = mo.InvokeMethod("Uninstall", null); return (bool)hr; } } catch (Exception ex) { //this program may not have a name property, so an exception will be thrown } } //was not found... return false; } catch (Exception ex) { return false; } }