専用アカウント(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);
この例外の原因と、アクセス拒否の例外があってもイベントログエントリが書き込まれるのはなぜですか?
編集:そして、私はそれを使用する前に、関連するログでイベントソースを登録しました。メッセージを短くするために、小さなコードスニペットのみを含めました。