использование WMI для удаленного удаления приложений

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

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

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

Спасибо, Джем

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

}

person Nooneelse    schedule 26.08.2010    source источник
comment
Класс Win32_Product имеет метод удаления, и в сети бродят несколько примеров c ++ и powershell, однако я не смог найти ни одного примера, ни документации с использованием класса win32_product в C #.   -  person Nooneelse    schedule 26.08.2010
comment
Кстати, есть как минимум два других вопроса (с образцом кода) об удалении удаленных приложений с помощью WMI: stackoverflow.com/questions/2390268/ и stackoverflow.com/questions/327650/   -  person Helen    schedule 27.08.2010
comment
Извините, что не тороплюсь, я думаю, я немного устал и отвлекся, пока искал ответ. в любом случае спасибо за вашу помощь.   -  person Nooneelse    schedule 27.08.2010


Ответы (1)


Взгляните на Создатель кода WMI (бесплатный инструмент от Microsoft) он может генерировать для вас код 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"]);
}
person Helen    schedule 26.08.2010
comment
Большое спасибо, мой друг !! Не имел понятия о существовании такого инструмента. - person cjones26; 12.11.2014