2015-05-06 9 views
10

Ich möchte eine Software mit meinem Code deinstallieren, ich habe bereits versucht wmic Ansatz zur Deinstallation, aber es kann nicht finden, meine Software im System. Ist es möglich, ohne die Verwendung von msi-Datei oder einen Setup zu deinstallieren file.I diesen Code gefunden, aber es funktioniert nicht ---Programmatisch deinstallieren Sie eine Software mit C#

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 ""; 
    } 
+0

"aber es funktioniert nicht" ist eine sinnlose Problemaussage. – Blorgbeard

+0

also können Sie mir einen Weg vorschlagen, das zu tun .... –

+0

Dies sieht aus wie ein Duplikat von http://StackOverflow.com/Questions/334490/uninstall-without-msi-file. Die einzige zuverlässige Methode ist: "msiexec.exe/x {your-product-code-guid}" –

Antwort

14

Der zuverlässigste Weg wäre programmatisch den folgenden Shell-Befehl auszuführen:

Wenn Sie das Original-MSI erstellt haben, haben Sie Zugang zu Ihrem PRODUKT-GUID, und das ist alles was Sie brauchen. Keine Notwendigkeit für die eigentliche MSI-Datei, da Windows eine Kopie davon für genau diesen Zweck verstaut.

Gerade FYI:

Windows ® Installer. V 5.0.14393.0 

msiexec /Option <Required Parameter> [Optional Parameter] 

Install Options 
    </package | /i> <Product.msi> 
     Installs or configures a product 
    /a <Product.msi> 
     Administrative install - Installs a product on the network 
    /j<u|m> <Product.msi> [/t <Transform List>] [/g <Language ID>] 
     Advertises a product - m to all users, u to current user 
    </uninstall | /x> <Product.msi | ProductCode> 
     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|+|!|*] <LogFile> 
     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 <LogFile> 
     Equivalent of /l* <LogFile> 
Update Options 
    /update <Update1.msp>[;Update2.msp] 
     Applies update(s) 
    /uninstall <PatchCodeGuid>[;Update2.msp] /package <Product.msi | ProductCode> 
     Remove update(s) for a product 
Repair Options 
    /f[p|e|c|m|s|o|d|a|u|v] <Product.msi | ProductCode> 
     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] 
+0

kann es Silent sein –

+0

Sicher, nur hinzufügen '/ quiet'. Es gibt auch viele andere Optionen, die Sie erkunden können, indem Sie das Ergebnis von 'msiexec /?' Betrachten. –

7

versuchen diese

Wir haben ein Managementobject Eigenschaft erhalten, indem das folgende Format:

Der vollständige Codeblock installierten Anwendungen zur Liste:

using System.Management 
private List<string> ListPrograms() 
{ 
    List<string> programs = new List<string>(); 

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

Jetzt das w Wenn wir eine Liste der installierten Anwendungen haben, sollten wir die Eigenschaft [Name] an unsere Deinstallationsmethode übergeben können.

Wir müssen jetzt die Win32_Product aufzurufende Methode auf „Deinstallieren“

Hier wird der gesamte Block ist eine Anwendung zu deinstallieren, ich in Detail erhalten, nachdem Sie einen Blick darauf werfen.

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; 
     } 
    } 
+0

Wie funktioniert das? Ich habe 'if (mo [" Name "]. ToString(). Enthält (" Skype ")) Objekt hr = mo.InvokeMethod (" Deinstallieren ", null);' um das Skype von meinem Rechner zu deinstallieren, aber Selbst nachdem der Code ausgeführt wurde, ist Skype immer noch da. – Ron16

Verwandte Themen