en utilisant WMI pour désinstaller des applications à distance
-
01-10-2019 - |
Question
Je suis en train d'écrire un mini exécutable W32 à désinstaller à distance une application utilisant WMI.
Je peux lister toutes les applications installées en utilisant ce code ci-dessous, mais je ne pouvais pas trouver un moyen de désinstaller l'application à distance à travers WMI et C #
Je sais que je peux le faire même en utilisant msiexec comme un processus, mais je veux résoudre ce WMI en utilisant si son possible ...
Merci, Cem
static void RemoteUninstall(string appname)
{
ConnectionOptions options = new ConnectionOptions();
options.Username = "administrator";
options.Password = "xxx";
ManagementScope scope = new ManagementScope("\\\\192.168.10.111\\root\\cimv2", options);
scope.Connect();
ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_Product");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
ManagementObjectCollection queryCollection = searcher.Get();
foreach (ManagementObject m in queryCollection)
{
// Display the remote computer information
Console.WriteLine("Name : {0}", m["Name"]);
if (m["Name"] == appname)
{
Console.WriteLine(appname + " found and will be uninstalled... but how");
//need to uninstall this app...
}
}
}
La solution
Jetez un oeil à code WMI créateur (un outil gratuit de Microsoft) -. il peut générer un code WMI pour vous dans différentes langues, y compris C #
Voici un exemple illustrant l'utilisation de la méthode Win32_Product.Uninstall
. Vous devez connaître le GUID, le nom et la version de l'application que vous souhaitez désinstaller, car ils sont les principales propriétés de la classe Win32_Product
:
...
ManagementObject app =
new ManagementObject(scope,
"Win32_Product.IdentifyingNumber='{99052DB7-9592-4522-A558-5417BBAD48EE}',Name='Microsoft ActiveSync',Version='4.5.5096.0'",
null);
ManagementBaseObject outParams = app.InvokeMethod("Uninstall", null);
Console.WriteLine("The Uninstall method result: {0}", outParams["ReturnValue"]);
Si vous avez les informations partielles sur l'application (par exemple uniquement le nom ou le nom et la version), vous pouvez utiliser une requête SELECT
pour obtenir l'objet Win32_Process
correspondant:
...
SelectQuery query = new SelectQuery("Win32_Product", "Name='Microsoft ActiveSync'");
EnumerationOptions enumOptions = new EnumerationOptions();
enumOptions.ReturnImmediately = true;
enumOptions.Rewindable = false;
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query, options);
foreach (ManagementObject app in searcher.Get())
{
ManagementBaseObject outParams = app.InvokeMethod("Uninstall", null);
Console.WriteLine("The Uninstall method result: {0}", outParams["ReturnValue"]);
}