Журнал событий, олицетворение и отказ в доступе Win32Exception

Я использую выделенную учетную запись (с политикой SDDL) для записи записей журнала событий в пользовательский журнал событий. Для этого я использую WindowsImpersonationContext и получаю токен с LogonUser:

WindowsIdentity impersonationIdentity = new WindowsIdentity(ptr);            
WindowsImpersonationContext impersonationContext = impersonationIdentity.Impersonate();
EventLog.WriteEntry("MyCustomSource", DateTime.Now.ToLongTimeString(), EventLogEntryType.Warning);
impersonationContext.Undo();
NativeMethods.CloseHandle(ptr);

Этот фрагмент кода создает записи в журнале событий, но я также получаю Win32Exception:

Unhandled Exception: System.InvalidOperationException: Cannot open log for source 'MyCustomSource'. You may not have write access. ---> System.ComponentModel.Win32Exception: Access is denied

Теперь исключение исчезает, если я помещаю Thread.Sleep(500) после строки олицетворения:

WindowsImpersonationContext impersonationContext = impersonationIdentity.Impersonate();
System.Threading.Thread.Sleep(500);

В чем причина этого исключения и почему записи в журнале событий записываются даже при исключении отказа в доступе?

Редактировать: И, конечно же, я зарегистрировал источник события в соответствующем журнале перед его использованием. Я включил только небольшие фрагменты кода, чтобы сообщение было коротким.

1 ответ

Этот вопрос старый и, кажется, не ответил. Похоже на мою проблему ( https://stackru.com/questions/17997152/registereventsource-fails-with-access-denied-for-impersonated-user-in-asp-net).

Я связываю этот вопрос со своим вопросом, так как считаю, что это та же проблема, и я изучил его немного подробнее. Это связано с logonType, который указан в вызове LogonUser().

Может быть, это поможет.

Другие вопросы по тегам