Я использую выделенную учетную запись (с политикой 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);
Что является причиной этого исключения и почему записи журнала событий записываются даже при исключении отказа в доступе?
Edit:
И, конечно же, я зарегистрировал источник событий в соответствующем журнале перед его использованием. Я включил только небольшие фрагменты кода, чтобы сообщение было коротким.