3

サービスは正しくインストールされますが、サービスウィンドウを介して、またはサービスウィンドウから開始しようとするとnet start、まったく開始されず、OnStartハンドラーに到達することさえありません。

管理者アカウントを使用すると、サービスが開始され、正しく機能します。これは、サービス内の何かに管理者権限が必要であることを示唆しているようですが、これは純粋にオンデマンドスタイルのサービスであり、要求されるまで何も実行されません。このタイプのサービスでは、少なくとも開始し、後で管理者権限を必要とする要求が行われたときに失敗する必要があると思いますか?

デバッグを開始することすらできず、サービスが停止したことを示す情報ログ以外にイベントログに何も表示されないため、デバッグできません。サービスに含まれるコードが多すぎてここにすべてを追加することはできませんが、エントリポイントはかなり標準的なUnityスタイルのサービスです。

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();
    }
}

ビジネス上の理由から、管理者を使用するユーザーアカウントを作成することはできないため、この問題を修正する方法についての提案をいただければ幸いです。

4

3 に答える 3

2

ユーザーアカウントに「サービスとしてログオン」権限があることを確認してください。これがないと機能しません。また、管理者の場合でも、ユーザーの場合はデフォルトでオンになりません。ここでの説明。

于 2012-11-27T22:26:48.743 に答える
2

「ServiceTestLog.txt」への書き込みには、ローカル管理者権限が必要な場合があります。

于 2012-11-27T22:30:57.573 に答える
2

Visual Studio Debuggerを実行してサービスに接続すると、サービスをステップ実行して何が起こっているかを確認できます。

これをinitializecomponent()の前に追加し、サービスのサービスコントロールパネルの[開始パラメーター]テキストボックスに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 Process Monitor(https://technet.microsoft.com/en-us/sysinternals/bb896645)は、何が問題になっているのかを教えてくれます。

于 2016-07-28T14:33:12.573 に答える