2009-11-06 108 views
4

我在c#中構建了一個setup.exe,它運行幾個鏈接的MSI(使用/ QUIET/NORESTART)。最後,我想檢查一下機器是否需要重啓(也就是說,如果其中一個MSI請求重啓)。如何找出我剛剛安裝的MSI是否請求重新啓動Windows?

我該如何檢測?

+0

我甚至見過這個實用程序:http://exodusdev.com/products/whyreboot 它不僅知道需要重新啓動,而且還爲什麼... 如何以編程方式檢索此類信息?註冊? – Nestor 2009-11-06 06:48:35

+0

請參閱此處的後續問題:http://stackoverflow.com/questions/1689610/how-to-detect-programmatically-when-the-install-updates-and-shut-down-the-comput – Nestor 2009-11-06 20:28:41

回答

2

以下注冊表項的信息:​​

HKLM\System\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations

來源:http://technet.microsoft.com/en-us/sysinternals/bb897556.aspx

+0

我有一個沒有PendingFileRenameOperations的機器顯示「關機」按鈕中的小屏蔽。怎麼來的? – Nestor 2009-11-06 15:06:17

+0

關機按鈕中的屏蔽是否意味着「安裝更新和關機」?這不等於需要重新啓動。 – 2009-11-06 15:17:48

+0

好的......那你知道如何檢測盾牌嗎?我把這作爲一個單獨的問題,有人抱怨說這是一個重複的:-) – Nestor 2009-11-06 16:57:28

1

另一種方式來完成,這是檢查是否在你的代碼運行所有的MSI的退出碼。 如果MSI的退出代碼爲3010,則需要重新啓動。http://msdn.microsoft.com/en-us/library/aa368542.aspx)。

假設你正在使用System.Diagnostics.Process運行的MSI和進程已退出後,你會使用ExitCode屬性(http://msdn.microsoft.com/en-us/library/system.diagnostics.process.exitcode(v=vs.90).aspx)檢索進程退出代碼。

因此,您可以簡單地檢查MSI進程的退出代碼,並在完成所有MSI的運行後,如果其中任何一個返回了3010,那麼您知道需要重新啓動。

+1

我已經瞭解到,如果系統在運行MSI時已經掛起重啓,某些MSI不會使用退出代碼3010。 微軟的.NET Framework 4.5.2脫機安裝程序就是一個這樣的MSI的例子,表現出這種行爲。它只是返回一個退出代碼0,如果您再次運行它,而無需在執行MSI之間重新啓動。 – afournier 2016-02-17 15:20:45

+0

@ user16563感謝您的信息,很高興知道。還有另一個很好的例子,說明如何混淆Windows不一致的趨勢。 :) – bsara 2016-02-17 22:33:04

相關問題