2010-02-11 597 views
2

我有一個Windows服務和一個MSI安裝程序(安裝項目)。安裝項目具有用於分別安裝和卸載args/install和/ uninstall的自定義操作。安裝時自動啓動Windows服務

我希望服務在安裝後立即啓動。我所有的服務都是開始一個過程。當服務停止時,它確實是process.Close();

我曾嘗試做

var sc = new ServiceController("MyProcess"); 
sc.Start(); 

的過程開始,但該事件日誌消息說該服務已啓動不顯示。停止時,我得到錯誤Error stopping process: System.InvalidOperationException: No process is associated with this object.

如果我不使用服務控制器來啓動並使用Services.msc,而是在停止時按預期工作。

是否有辦法讓程序立即啓動並讓我的啓動/停止方法按預期工作?

+1

可能的重複[自動啓動Windows服務安裝](http://stackoverflow.com/questions/1036713/automatically-start-a-windows-service-on-install) – ChrisF 2010-05-11 12:50:58

回答

0

我最終採取了一種不同的方法,只是獲取正在運行的過程,而不是試圖堅持之前開始的過程。停止進程然後工作就好了,OnStart/OnStop方法無關緊要,因爲我的內部進程正在按照我的需要啓動/停止。

1

你不說你正在使用什麼操作系統,但我記得去年開發安裝程序時遇到了這個問題。我相信這是Windows 7,Server 2003/2008和Vista中的安全限制,因爲安裝程序無法啓動它安裝的任何應用程序。如果您將服務設置爲自動啓動,則應在下次系統重新啓動時啓動。

+0

這是在Windows 7上。如果你是對的,這是有道理的。 – 2010-02-11 21:47:18

+0

雖然它確實啓動服務,但不正確。我的代碼位於服務類的OnStart和OnStop方法中。 – 2010-02-11 21:49:09

0

我想你所說的是有兩個問題在這裏進行。第一個問題是該服務在安裝後不會啓動。第二個是該服務無法啓動該過程。我對嗎?

當我通過安裝項目安裝服務時,我總是從安裝程序類的Commit方法啓動服務,這樣我就知道所有東西都已正確安裝。我對此並不十分確定,但在安裝完成之前,您可能無法啓動服務。它看起來像你的自定義操作設置正確,所以不應該有任何問題與調用的方法(你有提交包括在自定義操作,對嗎?)下面是一個從一個提交方法的例子我的項目:

public override void Commit(IDictionary savedState) 
{ 
    base.Commit(savedState); 

    try 
    { 
     var serviceController = new ServiceController("<Insert Service Name>"); 
     serviceController.Start(); 
    } 
    catch 
    { 
     MessageBox.Show(
      "There was an error starting the <Insert Service Name> Service. Please manually start it, or restart the computer."); 
    } 
} 

通過顯示消息框給用戶,如果出現錯誤的服務開始,至少將通知用戶該服務需要手動啓動。在調試安裝問題時,您可以在消息框中包含異常,以獲取有關正在進行的更多詳細信息。

我很好奇 - 您在ServiceProcessInstaller中使用了哪個帳戶?此用戶是否有權啓動該計算機?該流程是否有任何特定的UAC要求?我懷疑訪問控制是什麼阻止你的過程開始。

+0

我正在使用LocalSystem帳戶。使用ServiceController啓動服務時,我啓動的進程啓動,但事件日誌中通常會顯示一條消息,說明服務已成功啓動。我保存流程實例,所以當調用OnStop時,我可以執行'process.Close()',但是流程無效。 – 2010-02-12 15:17:30

+0

我甚至無法立即啓動新流程。我昨天工作正常,但我在不同的網絡上。也許這是你說的UAC問題。如果是這樣,我可以在安裝程序中做些什麼來使服務能夠啓動這個顯然需要額外權限的進程?我啓動的進程是mongod.exe,它是MondoDB進程,所以它至少綁定到一個端口。我試過關閉防火牆,但這沒有什麼區別。 – 2010-02-12 17:08:41

+0

此外,我有一個嘗試/捕捉周圍的過程開始,是一個事件記錄在捕獲。如果這個過程沒有開始,爲什麼它不會失敗呢?它必須默默地失敗。 – 2010-02-12 17:14:09

相關問題