2013-08-30 230 views
3

我編寫了一個程序,使用C#中的ManagementObject自動卸載一些程序。它工作正常,除了某些程序會自動重新啓動計算機,並且這會破壞我程序的目的。有沒有什麼辦法可以讓它等到一切都完成卸載重新啓動?如何在不重新啓動的情況下卸載程序

這裏是實際卸載程序的方法:

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 Installer之後,我建議您看看是否有一個標誌告訴對象不要讓安裝程序重新啓動系統,並且如果有可以在返回值中查找的標誌,告訴您安裝需要重啓完成。這就是Windows Installer的工作原理。然後,一旦所有程序都被卸載,如果需要重新啓動,則可以強制系統重新啓動。 – RobH

回答

5

嘗試使用REMOVE=ALLREBOOT=ReallySuppress選項調用MSI(安裝程序包)。

如果產品使用自定義安裝程序而不是使用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卸載方法之前終止您希望卸載的應用程序的所有進程。當然,該解決方法並非萬無一失,取決於正在卸載的程序。

相關問題