System.Diagnostics.EventLog クラスは、Windows イベント ログと対話する方法を提供します。単純なログ記録に常に使用しています...
System.Diagnostics.EventLog.WriteEntry("MyEventSource", "My Special Message")
.NET を使用して、結果のイベント ログ エントリにユーザー情報を設定する方法はありますか?
タフな...
ユーザー フィールドに .NET メソッドを入力する方法を探しました。残念ながら何もありません。プレーンな古い Win32 API [ReportEvent 関数]( http://msdn.microsoft.com/en-us/library/aa363679(VS.85).aspx)をインポートする必要があります。DLLImportAttribute
Platform Invoke Data Typesが言うように、正しい型で関数を再宣言する必要もあります
そう
BOOL ReportEvent(
__in HANDLE hEventLog,
__in WORD wType,
__in WORD wCategory,
__in DWORD dwEventID,
__in PSID lpUserSid,
__in WORD wNumStrings,
__in DWORD dwDataSize,
__in LPCTSTR *lpStrings,
__in LPVOID lpRawData
);
になる
[DllImport("Advapi32.dll", EntryPoint="ReportEventW", SetLastError=true,
CharSet=CharSet.Unicode)]
bool WriteEvent(
IntPtr hEventLog, //Where to find it ?
ushort wType,
ushort wCategory,
ulong dwEventID,
IntPtr lpUserSid, // We'll leave this struct alone, so just feed it a pointer
ushort wNumStrings,
ushort dwDataSize,
string[] lpStrings,
IntPtr lpRawData
);
[OpenEventLog]( http://msdn.microsoft.com/en-us/library/aa363672(VS.85).aspx)と [ConvertStringSidToSid]( http://msdn.microsoft.com/ en-us/library/aa376402(VS.85).aspx)
ああ、あなたは今、アンマネージ コードを書いています... メモリ リークに注意してください。頑張ってください :p
通常、EventLog.WriteEntry メソッドを呼び出すコードを実行するユーザーは、エントリのイベント ログに表示されるユーザーになります。
独自のプリンシパルと ID を作成し、それを現在のスレッドに関連付けることで、別のユーザーになりすますこともできますが、セキュリティ上の問題が発生する可能性があり、アプリケーションが確実に複雑になるため、お勧めできません。
イベント メッセージに自分で追加する必要があります。
System.Security.Principal 名前空間を使用して、イベントをログに記録しているスレッドの現在の ID を取得します。