использование WMI для удаленного удаления приложений - PullRequest
4 голосов
/ 26 августа 2010

Я пытаюсь написать исполняемый файл mini w32 для удаленного удаления приложения с помощью WMI.

Я могу перечислить все установленные приложения, используя этот код ниже, но я не смог найти способ удаленного удаления приложения через WMI и C #

Я знаю, что могу сделать то же самое, используя msiexec как процесс, но я хочу решить эту проблему с помощью WMI, если это возможно ...

Спасибо, 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...
        }
    }

}

1 Ответ

13 голосов
/ 27 августа 2010

Взгляните на WMI Code Creator (бесплатный инструмент от Microsoft) & mdash; он может генерировать код WMI для вас на разных языках, включая C #.

Вот пример, иллюстрирующий использование метода Win32_Product.Uninstall. Вам необходимо знать GUID, имя и версию приложения, которое вы хотите удалить, поскольку они являются ключевыми свойствами класса 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"]);

Если у вас есть частичная информация о приложении (например, только имя или имя и версия), вы можете использовать запрос SELECT для получения соответствующего Win32_Process объекта:

...
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"]);
}
...