Je veux désinstaller un logiciel en utilisant mon code, j'ai déjà essayé l'approche wmic pour effectuer la désinstallation mais il ne parvient pas à trouver mon logiciel dans le système. Est-il possible de désinstaller sans utiliser le fichier msi ou tout fichier d'installation. J'ai trouvé ce code mais ça ne marche pas ---
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 "";
}
Le moyen le plus fiable serait d'exécuter par programme la commande Shell suivante:
msiexec.exe /x {PRODUCT-GUID}
Si vous avez créé le MSI d'origine, vous aurez accès à votre PRODUCT-GUID, et c'est tout ce dont vous avez besoin. Pas besoin du fichier MSI réel car Windows en cache une copie à cet effet.
Juste 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]
essaye ça
Nous obtenons une propriété ManagementObject en utilisant le format suivant:
Le bloc complet de code pour répertorier les applications installées:
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;
}
}
Maintenant que nous avons une liste des applications installées, nous devrions pouvoir transmettre la propriété [Name] à notre méthode de désinstallation.
nous devons maintenant invoquer la méthode Win32_Product pour "Désinstaller"
Voici le bloc entier pour désinstaller une application, je reviendrai en détail après avoir jeté un œil.
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;
}
}