2013-08-30 2 views
3

Я написал программу для автоматической деинсталляции ряда программ с помощью ManagementObject в C#. Он работает правильно, за исключением того, что некоторые программы автоматически перезагружают компьютер, и это поражает цель моей программы. Есть ли способ, которым я могу заставить его подождать, пока все будет удалено для перезагрузки?Как удалить программу без перезагрузки

Вот метод, который фактически удаляет программы:

static void UninstallProduct(string path) 
{ 
    ManagementObject product = new ManagementObject(path); 

    if ((product != null) && (product.Path.ClassName == "Win32_Product")) 
    { 
    Console.WriteLine(
     "Uninstalling: " 
     + product.GetPropertyValue("Name") 
     + "..."); 

    object result = product.InvokeMethod("Uninstall", null); 
    Console.WriteLine(
     "The Uninstall method result is {0}", 
     result.ToString()); 
    } 
} 
+0

Я не знаком с классом ManagementObject, поэтому я не пишу это как реальный ответ. Работая с установщиком Windows, я бы предположил, что вы видите, есть ли флаг, который сообщает об этом объекту, чтобы он не позволял установщику перезагружать систему, и если есть флаг, который вы можете найти в возвращаемом значении, которое сообщает вам, что установка требует перезагрузка для завершения. Так работает установщик Windows. Затем, как только все программы будут удалены, если потребуется перезагрузка, вы можете принудительно перезагрузить систему. – RobH

ответ

5

Попробуйте вызова (установочный пакет) MSI с REMOVE=ALL и REBOOT=ReallySuppress вариантов.

Если продукт использует пользовательский установщик вместо MSI, у него может не быть возможности пропустить перезагрузку. В таких случаях я хотел бы связаться с разработчиками и указать, что перезагрузка компьютера без согласия администратора, вероятно, представляет собой атаку отказа в обслуживании: вмешательство в работу вычислительного оборудования и умышленное препятствование или задержку электронных сообщений, которые являются государственными и федеральными преступлениями. Если вы «помогаете им избегать ответственности» вместо того, чтобы избивать их законом и угрозой преследования, вы можете получить желаемое изменение в поведении (по крайней мере, в будущих версиях).

+0

Есть ли способ показать мне пример вызова пакета установщика MSI? Это похоже на то, что мне нужно сделать, потому что нет параметров для метода удаления продукта win32 (http://msdn.microsoft.com/en-us/library/windows/desktop/aa393941(v=vs.85) .aspx). –

+0

@ Landon: есть функция MSIInstallProduct, которая выглядит проста в использовании. Ваша трудность будет получаться от объектов WMI до пути к файлу MSI, отчасти потому, что не все установленные приложения используют MSI. –

+0

@LandonHammond: попробуйте вместо этого использовать метод установки или настройки, который принимает параметры? 'REMOVE = ALL REBOOT = R' должен привести к его удалению, даже если используется метод установки. –

1

См. .NET won't invoke method with command line args, чтобы понять, почему REBOOT = ReallySuppress не может быть передан MSI-деинсталлятору, если вы так думаете. То, что сработало для меня, чтобы не перезагружать во время удаления, - это уничтожить все процессы приложения, которые вы хотите удалить, прежде чем вы вызовете метод удаления MSI. Конечно, это обходное решение не является надежным и зависит от программы, которая удаляется.

Смежные вопросы