2008-09-29 10 views
4

La classe System.Diagnostics.EventLog permet d'interagir avec un journal des événements Windows. Je l'utilise tout le temps pour l'enregistrement simple, ....NET: Comment définir les informations utilisateur dans une entrée EventLog?

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

est-il un moyen de définir les informations utilisateur dans l'entrée du journal des événements résultant en utilisant .NET?

Répondre

5

toughie ...

Je cherchais un moyen de remplir le champ de l'utilisateur avec une méthode .NET. Malheureusement, il n'y en a pas, et vous devez importer la plaine ancienne API Win32 [fonction ReportEvent] (http://msdn.microsoft.com/en-us/library/aa363679(VS.85).aspx) avec un DLLImportAttribute

Vous devez également redéclarer la fonction avec les bons types, comme Platform Invoke Data Types dit

Alors

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 
); 

devient

[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 
); 

Vous voulez aussi regarder [OpenEventLog] (http://msdn.microsoft.com/en-us/library/aa363672(VS.85).aspx) et [ConvertStringSidToSid] (http://msdn.microsoft.com/en-us/library/aa376402(VS.85).aspx)

Oh, et vous écrivez du code non managé maintenant ... Méfiez-vous la chance de leaks.Good mémoire: p

0

Vous devez l'ajouter vous-même dans le message d'événement.

Utilisez l'espace de noms System.Security.Principal pour obtenir l'identité actuelle du thread enregistrant l'événement.

0

Habituellement, l'utilisateur exécutant le code qui appelle la méthode EventLog.WriteEntry sera l'utilisateur affiché dans le journal des événements pour l'entrée. Vous pouvez tenter d'usurper l'identité d'un autre utilisateur en créant votre propre Principal et Identité et en l'associant au thread actuel, mais cela n'est pas conseillé car cela pourrait introduire des problèmes de sécurité et compliquerait définitivement votre application.

Questions connexes