2015-05-06 30 views
10

Desidero disinstallare un software utilizzando il mio codice, ho già provato l'approccio wmic per eseguire la disinstallazione ma non riesco a trovare il mio software nel sistema. E 'possibile disinstallare senza l'utilizzo di file MSI o qualsiasi configurazione file.I trovato questo codice, ma non funziona ---Disinstallare un software utilizzando 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

"ma non funziona" è un'affermazione di problema inutile. – Blorgbeard

+0

quindi mi puoi suggerire un modo per farlo .... –

+0

Questo sembra un duplicato di http://stackoverflow.com/questions/334490/uninstall-without-msi-file. L'unico modo affidabile è utilizzare: "msiexec.exe/x {your-product-code-code}" –

risposta

14

Il modo più affidabile sarebbe eseguire a livello di codice il seguente comando shell:

msiexec.exe /x {PRODUCT-GUID} 

Se hai creato l'MSI originale, avrai accesso al tuo GUID DI PRODOTTO, e questo è tutto ciò che ti serve. Non c'è bisogno del vero file MSI dato che Windows ne nasconde una copia esattamente per questo scopo.

Cordiali saluti:

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

può essere silenzioso –

+0

Certo, basta aggiungere '/ quiet'. Ci sono anche molte altre opzioni che puoi esplorare visualizzando il risultato di 'msiexec /?'. –

7

provare questo

otteniamo una proprietà ManagementObject utilizzando il seguente formato:

Il blocco completo di codice per elencare le applicazioni installate:

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

Ora che w Abbiamo un elenco di applicazioni installate che dovremmo essere in grado di passare la proprietà [Nome] al nostro metodo di disinstallazione.

ora abbiamo bisogno di richiamare il metodo Win32_Product a “Disinstalla”

Ecco l'intero blocco per disinstallare un'applicazione, vado a prendere in dettaglio dopo si dà un'occhiata.

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

Come funziona "questo lavoro"? Sto avendo if (mo ["Name"]. ToString(). Contains ("Skype")) object hr = mo.InvokeMethod ("Uninstall", null); 'per disinstallare Skype dalla mia macchina, ma anche dopo l'esecuzione del codice, Skype è ancora lì. – Ron16