2

Nuget で Microsoft EventSource Libary 1.1.25 を使用して ETW EventSource を作成しました。EventSource の目的は、管理しているセキュリティ アプリケーションのカスタム イベント ログにイベントを送信することです。コードはローカルで動作しますが、サーバー上のイベント ログにイベントを書き込むことができません。

EventSource は (同様に) Company-Security という名前で、管理チャネルにイベントを送信します。開発用マシンのローカルで、eventsource マニフェストを wevtutil に登録し、Windows イベント ビューアーの下にある管理者ログを含む Company-Security フォルダーを確認できます。アプリケーションを実行すると、イベントがイベント ログに記録されます。

ただし、アプリケーションをテスト サーバー (Windows Server 2012 を実行) に展開すると、イベント ログが機能しません。マニフェストを wevtutil に登録すると、ログが作成されてイベント ビューアーに表示されますが、名前は少し異なります。Company-Security/Admin という名前のフォルダーが作成され、そのフォルダー内に Company-Security/Admin という名前のログが作成されます。サーバーで perfview を実行して、作成されたイベントを確認することもできます。ただし、イベント ログには何も書き込まれません。また、EventSource コードにいくつかのデバッグ ステートメントを追加したところ、EventSource IsEnabled() が true を返していることがわかります。

以下は、私が書いたイベントソースの基本クラスと実装クラスのコード スニペットです。

イベントログがサーバーでは機能しないが、開発マシンでは機能する理由について調査しましたが、説明が見つかりません。私は何かが欠けていると思いますが、何がわからないのですか。

抽象基本クラス:

    public abstract class SecurityEventsBase : EventSource {
    protected unsafe void WriteEvent(int eventId, long arg1, string arg2, string arg3) {
        if (IsEnabled()) {
            if (arg2 == null) {
                arg2 = "[not provided]";
            }
            if (arg3 == null) {
                arg3 = "[not provided]"; ;
            }
            fixed (char* arg2Ptr = arg2) {
                fixed (char* arg3Ptr = arg3) {

                    EventSource.EventData* dataDesc = stackalloc EventSource.EventData[3];
                    dataDesc[0].DataPointer = (IntPtr)(&arg1);
                    dataDesc[0].Size = 8;
                    dataDesc[1].DataPointer = (IntPtr)arg2Ptr;
                    dataDesc[1].Size = (arg2.Length + 1) * 2;
                    dataDesc[2].DataPointer = (IntPtr)arg3Ptr;
                    dataDesc[2].Size = (arg3.Length + 1) * 2;

                    WriteEventCore(eventId, 3, dataDesc);
                }
            }
        }
    }

EventSource クラス:

  [EventSource(Name="Company-Security",LocalizationResources="Events.Properties.Resources")]
public sealed class AuthorizationEvents : SecurityEventsBase {

    public static AuthorizationEvents Log = new AuthorizationEvents();

    [Event(2000,Level=EventLevel.Informational,Channel=EventChannel.Admin,Message="User '{1}' ({0}) logged in successfully from IP Address {2}")]
    public void Login(long UserId, string UserName, string IPAddress) {
        if (IsEnabled()) {
            WriteEvent(2000, UserId, UserName, IPAddress);
        }
    }
    ** additional events would follow here**
}
4

1 に答える 1