簡體   English   中英

Windows服務無法通過MSI安裝程序在幾台計算機上安裝

[英]Windows service fails to install through msi setup in few machines

我使用WiX開發了一個MSI安裝程序,其中包括c#.Net 2.0框架中的Windows窗體應用程序和Windows服務。 當我運行安裝程序時,它會通過顯示特權錯誤(“產品:mysetup-錯誤1920。服務'service displayname'(服務名)失敗),成功在所有win 7機器中成功安裝,但在少數win 7和所有win 8機器中失敗。嘗試在安裝時啟動服務時,請確認您具有啟動系統服務的足夠特權。”) 然后,我在Windows服務項目中創建了一個App.config文件,並根據此鏈接編寫了以下代碼行,該文件幫助到目前為止在所有win 7機器上都安裝了該安裝程序,但是對於任何win 8機器都沒有運氣。

<runtime><generatePublisherEvidence enabled="false"/></runtime>

關於服務細節,我已經在服務內部編寫了方法OnStart和OnStop。 它實際上在Windows啟動時啟動win窗體exe文件。 我在ServiceInstaller頁面將StartType屬性設置為Automatic,在ServiceProcessInstaller頁面將AccountType設置為LocalSystem。 我還在WiX內編寫了以下代碼來安裝我的服務。

<ServiceInstall Id="ServiceInstaller" Type="ownProcess" Name="*******" DisplayName="******" Description="****** description" Start="auto" Account="LocalSystem" ErrorControl="ignore" Vital="yes" />
<ServiceControl Id="ServiceInstallerControl" Start="install" Stop="uninstall" Remove="uninstall" Name="******" Wait="yes" />

目前,安裝程序和Windows服務已安裝並在任何win 7機器上正常運行,但在任何win 8和機器上均失敗。 Windows事件查看器未顯示任何詳細信息,但“ msi安裝失敗”。

請注意,我尚未為我的應用程序添加任何ClickOnce或Publisher證書。 我計划以后再做,如果那不是安裝失敗的原因。 如何解決此問題或獲取錯誤詳細信息或以任何方式進行調試? 請幫忙。

編輯:

PhilDW的答案非常重要。 我的服務嘗試運行的我的win表單應用程序(.exe文件)沒有顯示為GUI,但是是的,它實際上與桌面交互並實現了我所遵循並實現的此鏈接 到目前為止,這在win xp和win 7上都可以正常工作,並且只要用戶登錄,該服務就會從應用程序成功啟動win。 不確定win 8或更高版本,希望此方法不會出於更高的安全性目的而被更高版本的Microsoft Windows棄用,阻止或禁止(我的意思是,這會發生嗎?那么通過LocalSystem窗口與桌面進行交互的解決方案是什么?服務)。

在Morten Frederiksen回答之后,我做了以下工作。 在一台Win 8(32位)PC上,我檢查了Windows-> Microsoft.Net-> Framework文件夾,該文件夾包含4.0和4.5,但完全沒有Morten所說的2.0 / 3.0 / 3.5。 現在,我的獲勝表單應用程序已經按照Morten的建議在其App.config文件中包含了supportedRuntime條目,但是安裝沒有運氣。 所以我添加了相同的ie

<configuration>
    <startup>
        <supportedRuntime version="v2.0.50727"/>
    </startup>
</configuration>

在Windows服務的App.config中(我認為這是不必要的),並在重建后運行MSI,但是發生相同的事情,安裝回滾並顯示相同的特權錯誤消息。 然后,我嘗試手動運行贏表應用程序。 它顯示消息“該應用程序需要.Net framework 3.5。您是否要下載並安裝.Net framework 3.5(包括2.0和3.0)”。 我單擊“確定”,它下載並安裝了框架,並成功運行了win窗體應用程序.exe文件。 現在已經安裝了所有框架,我嘗試重新安裝MSI,現在它已成功安裝,並且該服務與該應用程序一起啟動,而該應用程序現在實際上已成功進行了桌面交互。

因此,Morten Frederiksen的回答幫助我解決了案件。 現在很明顯,就我而言,正是由於缺少所需的框架才導致Win Form應用程序失敗,這又導致Windows服務無法啟動,進而導致MSI安裝的回滾。

我會按不特定的順序查看一些區域。 除其他一些假設外,我假設您的表單應用嘗試顯示UI。

您在服務啟動中有wait = yes。 這將導致Windows等待,直到服務正常啟動為止,默認等待時間為30秒。 這意味着該服務必須在30秒內退出OnStart,以表明它實際上已經可以正常啟動。 如果由於發生了什么而導致延遲,您可能會發現計時問題可能會隨機導致它在30秒內完成。

第二個問題可能更嚴重。 我不認為您可以從服務啟動Winforms應用程序,其原因與本地系統服務無法再與桌面進行交互的原因相同-它會將系統帳戶暴露給用戶的桌面,以進行粉碎攻擊。 在Windows 8中可能會嚴格執行此操作,因此Winform進程將終止,並對該服務產生下游影響,具體取決於其編碼方式。 這與https://msdn.microsoft.com/en-us/library/windows/desktop/ms683502(v=vs.85).aspx相關

最后,即使您可以與桌面進行交互,重啟后也可能存在計時問題。 如果您的服務啟動並從Winforms應用程序中啟動,那么這可能會在任何人登錄之前發生,除非您的代碼等待登錄,因為在沒有交互用戶的情況下服務一直在運行,因此您的服務正在啟動Winforms。嘗試訪問不存在的桌面的應用程序。 我不知道您是否處理過此區域。

我建議您安裝Winforms應用程序並將快捷方式添加到“開始”->“啟動程序”菜單中,以便在用戶登錄時啟動。 然后,它可以與正在運行的服務建立通信。

我的猜測是您在Windows 8 PC上沒有安裝.NET 2.0 / 3.0 / 3.5。 通過在.config文件中添加一些配置,可以在僅安裝.NET 4.0 / 4.5的系統上啟用.NET 2.0應用程序。

方法如下: https : //msdn.microsoft.com/zh-cn/library/jj152935%28v=vs.110%29.aspx

暫無
暫無

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

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