1

Windows サービスとしてホストしている WCF クラス ライブラリがあります。問題は、サービスをコンソール アプリとしてデバッグ モードで実行すると、イベント ログに正しく記録されることです。しかし、inno setup で作成したセットアップ ファイルを使用して Windows サービスとしてホストすると、何らかの理由で何もログに記録されません。

<system.diagnostics>
<switches>
  <add name="Retail.ReaderService.Switch" value="4" />
</switches>
<trace autoflush="false" indentsize="4">
  <listeners>
    <add name="EventLogTraceListener" type="System.Diagnostics.EventLogTraceListener" initializeData="ServiceLog" />
  </listeners>
</trace>
</system.diagnostics>

これらの設定はメインの app.config ファイルにあります。autoflush 属性を true に変更しようとしましたが、機能しません。助けてください。

ありがとう、

4

2 に答える 2

0

プログラムをデバッグモードで実行すると、政府のように実行されます。また、マシンの管理者グループにいる場合、プログラムは管理者として実行されており、イベント ログを読み書きする権限があります。ただし、プログラムを Windows サービスとして実行している場合、そのユーザー アカウントに割り当てられた権限しかなく、イベント ログに書き込む権限がないように見えます。

私は同じ問題を抱えていたので、この関数を作成して、イベント ログに書き込む権利があるかどうかを検出しました。

private void GetServicePermissionLevel()
{
bool bAdmin = false;
try {
    SecurityIdentifier sidAdmin = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null);
    AppDomain myDomain = Thread.GetDomain();
    myDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
    WindowsPrincipal myPrincipal = (WindowsPrincipal)Thread.CurrentPrincipal;
    if (myPrincipal.IsInRole(sidAdmin)) {
        bAdmin = true;
    } else {
        bAdmin = false;
    }
} catch (Exception ex) {
    throw new Exception("Error in GetServicePermissionlevel(): " + ex.Message + " - " + ex.StackTrace);
} finally {
    _ServiceRunAsAdmin = bAdmin;
}
}

次に、イベントのログを記録したいときは、これを使用します。

if (_ServiceRunAsAdmin)
EventLog.WriteEntry(c_ServiceName, "Error in GetServiceHostParamSet: " + ex.Message + ". This parameter not found: " + sName);

うまくいけば、これが役に立ちます。

于 2013-08-13T12:55:11.400 に答える
0

私は同じ問題に遭遇しました。解決策は、WCF アプリで機能するシステム診断設定が Windows サービスの app.config にも設定されていることを確認することです。私のログをコピーするとすぐに、ログが表示されました。

于 2016-04-14T00:17:34.763 に答える