2012-11-27 142 views
2

服務安裝正確,但嘗試通過net start或從服務窗口啓動服務時,服務無法啓動,甚至無法訪問OnStart處理程序。除非使用管理員帳戶,否則Windows服務不會啓動OnStart

如果我使用管理員帳戶,服務啓動並正常工作。這似乎表明服務中的某些內容需要管理員權限,但這純粹是一種隨需應變式服務,在請求之前不會執行任何操作。對於這種類型的服務,我認爲至少應該啓動,然後在發出請求需要管理員權限的請求時失敗。

調試是不可能的,因爲我甚至無法啓動它,除了信息日誌指出服務已停止外,沒有任何事件顯示在事件日誌中。有太多的代碼在服務這裏要補充這一切,但入口點是一個相當標準的統一式服務:

partial class MyServiceHost : UnityServiceBase 
{ 
    private Bootstrapper _bootstrapper; 

    public MyServiceHost() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnStart(string[] args) 
    { 
     TextWriter tw = new StreamWriter("ServiceTestLog.txt"); 
     tw.Write("Date: " + DateTime.Now + "\n"); 

     try 
     { 
      base.OnStart(args); 

      _bootstrapper = new Bootstrapper(UnityContainer); 
      _bootstrapper.Run(); 
     } 
     catch (Exception ex) 
     { 
      tw.Write(ex.ToString()); 
     } 

     tw.Close(); 
    } 

    protected override void OnStop() 
    { 
     _bootstrapper.Teardown(); 
     base.OnStop(); 
    } 
} 

出於商業考慮,我不能只讓用戶帳戶它使用的是管理員,所以我」 d感謝有關如何解決此問題的任何建議。

+0

請參閱Steve Townsend的答案,但爲什麼它需要成爲一項服務?它做了什麼,它不能像正常的分離過程那樣運行? –

+0

@CareyGregory這只是我們代碼庫整個服務導向架構的一小部分。沒有包括爲什麼它必須是服務的所有細節,我只是說我在這件事上沒有選擇! – peacemaker

+0

運行sysinternals processmonitor(https://technet.microsoft.com/en-us/sysinternals/bb896645)並查看失敗情況。它可能會在所需的依賴項上獲得「拒絕訪問」。 –

回答

2

寫入「ServiceTestLog.txt」可能需要本地管理員權限。

+0

這可能是一個次要問題,但請注意,執行甚至不會根據q文本達到'OnStart' –

+0

這取決於OP如何確定它未達到OnStart。 – Maate

+0

我嘗試的第一件事就是寫出註釋寫入日誌,但它不起作用。不過,我這次再次嘗試,實際卸載並重新安裝服務,它的工作!多麼尷尬,但謝謝你指出這一點,讓我再試一次。 – peacemaker

2

確保您的用戶帳戶具有「作爲服務登錄」權限。如果沒有這個功能,這將無法正常工作,並且它對用戶而言並不是默認開啓的,儘管它將用於管理員。說明here

+0

作爲帳戶啓用服務登錄,但仍然無法正常工作 – peacemaker

+0

不知道這對於託管代碼有多好,但ProcessDumper可以在進程退出時生成事後調試轉儲。它可能會給你提示失敗服務退出的提示。逐步添加診斷輸出,直到縮小失敗的位置,現在和以後都應該有用。 –

+0

感謝史蒂夫,我不知道ProcessDumper將在未來派上用場。 – peacemaker

2

運行Visual Studio Debugger並附加到該服務,然後您可以逐步查看並查看發生了什麼。

您可以在initializecomponent()之前添加此項,並在Service Control Panel的「Start parameters」文本框中爲您的服務添加WAITFORDEBUGGER。

C#:

foreach (string arg in args) { 
    if (arg == "WAITFORDEBUGGER") { 
     while (!Debugger.IsAttached) { 
      Threading.Thread.Sleep(1000); 
     } 
    } 
} 

VB.Net:

For Each arg As String In args 
    If arg = "WAITFORDEBUGGER" Then 
     While Not Debugger.IsAttached 
      Threading.Thread.Sleep(1000) 
     End While 
    End If 
Next 

然後該服務將等待你火了Visual Studio和附加調試器,此時您可以通過整個跟蹤初始化和運行順序,看看有什麼損壞。

如果它從未遇到WAITFORDEBUGGER代碼,它可能無法加載依賴關係,在這種情況下,Sysinternals進程監視器(https://technet.microsoft.com/en-us/sysinternals/bb896645)可以告訴你它正在受到什麼影響。

相關問題