ETW EventSource не регистрирует события в Windows Server

Я написал ETW EventSource, используя библиотеку Microsoft EventSource 1.1.25 на Nuget. Целью EventSource является отправка событий в настраиваемый журнал событий для приложения безопасности, которое мы поддерживаем. Код работает локально, но мы не можем добиться записи событий в журнал событий на сервере.

EventSource называется (тоже похоже) Company-Security и отправляет события в канал администратора. Локально на моем компьютере для разработки я могу зарегистрировать манифест источника событий с помощью wevtutil и увидеть папку Company-Security с журналом администратора под ней в средстве просмотра событий Windows. Когда я запускаю приложение, события записываются в журнал событий.

Однако, когда я развертываю приложение на тестовом сервере (под управлением 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**
}

person Rob C    schedule 07.08.2015    source источник


Ответы (1)


Я наконец решил эту проблему. Это было связано с разрешениями для папки, в которой хранились файлы ресурсов манифеста и двоичного манифеста.

Я нашел этот ответ StackOverflow, который помог мне решить проблему: https://stackoverflow.com/a/13090615/5202678

Мне пришлось предоставить права на чтение и выполнение для папки локальной группе пользователей в папку, в которой хранились файлы манифеста. Как только я это сделал, события сразу же начали записываться в журнал событий.

person Rob C    schedule 07.08.2015