вход в пользовательский журнал событий (приложение C #, но с использованием Win32 API) - PullRequest
0 голосов
/ 15 мая 2009

Из-за ограничения в классе .NET EventLog у меня есть некоторый код, использующий PInvoke, который записывает в журнал приложений. Код работает без проблем.

Но теперь я хотел бы войти в пользовательский журнал событий. Итак, я попытался изменить 2-й параметр RegisterEventSource на «companyX» (мой пользовательский журнал). Он правильно записал в «companyX» (вместо журнала приложений), но также установил для поля «Источник» (отдельной записи журнала) значение «companyX», а это не то, что Я хочу.

Так как мне изменить код на:

  • Используйте новый пользовательский журнал событий ("companyX"), но также
  • Используйте правильное значение источника («MyApp»)

В настоящее время он либо правильно записывает данные в журнал приложений (с правильным значением «MyApp» в поле «Источник»), либо записывает в настраиваемый журнал событий («companyX») и использует неверный источник. значение (вместо «MyApp» оно устанавливает значение «Source» равным «companyX», имя настраиваемого журнала).

РЕДАКТИРОВАТЬ: Обратите внимание, что журнал "companyX" уже был создан (в коде установщика WIX).

Вот мой код:

private void WriteEntryToLog(string msg, LogEventType entryType)
{
    // ApplicationName = "MyApp"
    // The code as-is is writing to the Application log. Changing the 2nd param of
    // the function below to "companyX" allows me to write to my "companyX" event log,
    // but also changes the Source value of each entry append to that log to "companyX" rather than "MyApp"
    IntPtr eventSrcHandle = NativeMethods.RegisterEventSource(null, Resources.ApplicationName);


    try
    {
        uint tokenInfoSize = 0;
        IntPtr userTokenPtr = WindowsIdentity.GetCurrent().Token;
        const UInt16 typeError = 1, typeWarning = 2, typeInformation = 4;

        //using this first call, get the length required to hold the token information in the tokenInfoSize parameter
        bool bresult = NativeMethods.GetTokenInformation(userTokenPtr, NativeMethods.TOKEN_INFORMATION_CLASS.TokenUser, IntPtr.Zero, tokenInfoSize, out tokenInfoSize);
        if (bresult) throw new Win32Exception(Marshal.GetLastWin32Error());

        IntPtr userTokenInfo = Marshal.AllocHGlobal((int)tokenInfoSize);
        try
        {
            //get the user token now with the pointer allocated to the right size
            bresult = NativeMethods.GetTokenInformation(userTokenPtr, NativeMethods.TOKEN_INFORMATION_CLASS.TokenUser, userTokenInfo, tokenInfoSize, out tokenInfoSize);
            if (!bresult) throw new Win32Exception(Marshal.GetLastWin32Error());

            UInt16 type = typeError;
            switch (entryType)
            {
                case LogEventType.Error:
                    type = typeError; 
                    break;
                case LogEventType.Warning:
                    type = typeWarning; 
                    break;
                case LogEventType.Information:
                    type = typeInformation; 
                    break;
                    default: 
                        type = typeInformation; 
                        break;
            }

            NativeMethods.TOKEN_USER tokUser = (NativeMethods.TOKEN_USER)Marshal.PtrToStructure(userTokenInfo, typeof(NativeMethods.TOKEN_USER));

            string[] message = new string[1];
            message[0] = msg;
            bresult = NativeMethods.ReportEvent(eventSrcHandle, type, 0, 0, tokUser.User.Sid, 1, 0, message, new byte());
            if (!bresult) throw new Win32Exception(Marshal.GetLastWin32Error());
        }
        finally
        {
            Marshal.FreeHGlobal(userTokenInfo);
        }
    }
    finally
    {
        NativeMethods.DeregisterEventSource(eventSrcHandle);
    }

}

О, и это не повторение вопроса здесь: Пользовательское значение для свойства источника журнала событий для ошибок ASP.NET так как я должен использовать PInvoke для этого. =)

1 Ответ

1 голос
/ 15 мая 2009

Вы должны создать источник с именем MyApp и сопоставить его с вашим журналом "CompanyX".

В этой статье подробно рассматривается создание источника событий с .Net Framework BCL.

http://msdn.microsoft.com/en-us/library/5zbwd3s3.aspx

Это изменение требует обновления доступа к реестру.

...