5

System.Diagnostics.EventLog クラスは、Windows イベント ログと対話する方法を提供します。単純なログ記録に常に使用しています...

System.Diagnostics.EventLog.WriteEntry("MyEventSource", "My Special Message")

.NET を使用して、結果のイベント ログ エントリにユーザー情報を設定する方法はありますか?

4

3 に答える 3

5

タフな...

ユーザー フィールドに .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

于 2008-10-01T20:53:30.907 に答える
0

通常、EventLog.WriteEntry メソッドを呼び出すコードを実行するユーザーは、エントリのイベント ログに表示されるユーザーになります。

独自のプリンシパルと ID を作成し、それを現在のスレッドに関連付けることで、別のユーザーになりすますこともできますが、セキュリティ上の問題が発生する可能性があり、アプリケーションが確実に複雑になるため、お勧めできません。

于 2008-09-29T02:36:00.737 に答える
0

イベント メッセージに自分で追加する必要があります。

System.Security.Principal 名前空間を使用して、イベントをログに記録しているスレッドの現在の ID を取得します。

于 2008-09-29T02:26:45.500 に答える