我正在使用专用帐户(使用 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);
是什么导致了这个异常,即使有访问被拒绝异常,事件日志条目是如何被写入的?
编辑:并且在使用之前,我已经使用相关日志注册了事件源。我只包含小代码片段以保持消息简短。