簡體   English   中英

從msi安裝程序啟動服務,該服務依賴於msi安裝的程序集

[英]Launching a service from msi installer that depends on assemblies installed by the msi

我正在使用WiX編寫MSI安裝程序來啟動依賴於MSI安裝的DLL的服務。 在Vista上,DLL會在MSI的InstallFinalize階段添加到全局程序集緩存中,因此我無法在WiX中使用內置服務啟動命令。 那個嘗試在DLL在GAC之前啟動服務,並且失敗。 解決方案似乎是使用自定義操作[1],並在InstallFinalize之后運行它。

我使用的自定義操作是使用sc啟動服務。 以管理員身份運行安裝程序時,一切正常,但以普通用戶身份運行不起作用。 安裝程序將提升實際安裝階段的權限,但在完成安裝后將刪除它們,並且以sc作為非特權用戶啟動服務將失敗。 InstallFinalize [2]之后,將自定義操作設置為延遲且不模仿以獲取管理員權限將不起作用。

作為最終的kludge,我嘗試將<Condition>Privileged</Condition>到WiX文件中,告訴用戶安裝程序需要以管理員身份運行,但我也無法使用它。 在安裝期間, Privileged值設置為1,可能在主安裝序列被賦予更高權限時。

那么有沒有其他人遇到Vista,非管理員用戶的組合,安裝程序需要啟動服務和服務需要在安裝期間運行到GAC的東西? 對此有什么樣的工作方法嗎?

[1] http://www.mail-archive.com/wix-users@lists.sourceforge.net/msg09162.html

[2] http://www.mail-archive.com/wix-users@lists.sourceforge.net/msg15381.html

這是最簡單的解決方案只是安排重新啟動的時間之一。

以下是一些可能性:

  • 如果可能,請不要在GAC中安裝必備組件。 這將允許您的服務正常啟動(即在InstallInitialize和InstallFinalize之間)。

  • 創建一個bootstrapper(一個以特定順序啟動先決條件MSI的小應用程序)。 將必備程序集(GAC中的那些程序集)放入它們自己的MSI中,並在安裝服務之前讓引導程序安裝它們。

  • 創建一個啟動器(一個更小的應用程序,只需啟動您的MSI)。 給它一個清單,讓它升高。 這樣,整個MSI都會升級,而不僅僅是InstallInitialize和InstallFinalize之間的部分。 您應該能夠成功調用sc

我同意@sascha。 在這種情況下,重新啟動不僅是最簡單但最干凈的。 所有其他提出的解決方案都將為您提供更高的故障率。 恕我直言,GAC的Windows Installer設計被破壞了。 重啟是對此的認可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM