Click here to Skip to main content
5,943,977 members and growing! (16,903 online)
Email Password   helpLost your password?
Platforms, Frameworks & Libraries » Win32/64 SDK & OS » General     Intermediate

Adding User Name to Events

By maththaios

How to add user names to the Event Viewer.
VC6, C++Windows, WinXPVS6, Visual Studio, Dev
Posted:22 Feb 2006
Views:16,430
Bookmarked:14 times
Announcements
Want a new Job?
Search    
Advanced Search
Sitemap
printPrint   Broken Article?Report       add Share
  Discuss Discuss   Recommend Article Email
5 votes for this Article.
Popularity: 3.08 Rating: 4.40 out of 5

1

2
1 vote, 20.0%
3
1 vote, 20.0%
4
3 votes, 60.0%
5

The Event Viewer

Introduction

This article will explain how to add a user name to the Events that are logged in to the Event Viewer.

Background

I needed to add user names to events that were being logged, and I could not find anything directly on target. Microsoft's website stated to simply add the SID to the ReportEvent function. It did not tell how to get the SID. After much more investigation, I found something written in another programming language that got the user SID, so I translated it into C and combined it with what I was doing.

Using the code

I wrote a standalone program first to test out what I wanted to do at work. I will provide all the relevant portions here so that you can simply paste into your project something that works.

Collapse
    HANDLE hToken;
    HANDLE g_eventHandle = NULL;
    int rc;
    DWORD dwLength = 0;
    PTOKEN_USER pTokenUser = NULL;
    TCHAR *params[1];

        // in order to use ReportEvent we must first Register Event

    g_eventHandle = RegisterEventSource(NULL, _T("SID_TEST"));
    OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken);

    // Get required buffer size and allocate the PTOKEN_USER buffer.

    if (!GetTokenInformation(
        hToken,         // handle to the access token

        TokenUser,    // get information about the token's groups

        (LPVOID) pTokenUser,   // pointer to TOKEN_USER buffer

        0,              // size of buffer

        &dwLength       // receives required buffer size

    ))
    {
        if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
            goto Cleanup;

        pTokenUser = (PTOKEN_USER)HeapAlloc(GetProcessHeap(),
            HEAP_ZERO_MEMORY, dwLength);

        if (pTokenUser == NULL)
            goto Cleanup;
    }

    // Get the token group information from the access token.

    if (!GetTokenInformation(
        hToken,         // handle to the access token

        TokenUser,    // get information about the token's groups

        (LPVOID) pTokenUser,   // pointer to TOKEN_USER buffer

        dwLength,       // size of buffer

        &dwLength       // receives required buffer size

    ))
    {
        goto Cleanup;
    }

    params[0] = const_cast<TCHAR*>("test string");

    // the actual call that places the event into the Event Viewer

    rc = ReportEvent(g_eventHandle, EVENTLOG_INFORMATION_TYPE, 0, 0,
        pTokenUser->User.Sid,// the sid goes here <-------

        1, 0, (LPCTSTR *)params, NULL);

Cleanup:

    // Free the buffer for the token .

    if (pTokenUser != NULL)
        HeapFree(GetProcessHeap(), 0, (LPVOID)pTokenUser);

    // i am finished with the Event

    DeregisterEventSource(g_eventHandle);

Points of Interest

That's all there is to it. The GetTokenInformation function has to be called twice; if you have too much or too little allocated for your SID, the function will fail.

The Event View with our entry:

The Event Viewer

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

maththaios


I am a computer programmer in Florida.
Occupation: Software Developer (Senior)
Location: United States United States

Other popular Applications & Tools articles:

Article Top
Sign Up to vote for this article
You must Sign In to use this message board.
FAQ FAQ Noise ToleranceSearch Search Messages 
 Layout  Per page   
 Msgs 1 to 5 of 5 (Total in Forum: 5) (Refresh)FirstPrevNext
GeneralNice example but do you have vb.net version.memberMember 491154817:31 25 Mar '08  
GeneralWhat about using LookupAccountName ?memberlumoryel5:22 12 Apr '06  
GeneralRe: What about using LookupAccountName ?membermaththaios6:26 12 Apr '06  
GeneralNice but i have a questionmembernesculcas1:23 6 Mar '06  
GeneralRe: Nice but i have a questionmembermaththaios10:04 6 Mar '06  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 22 Feb 2006
Editor: Smitha Vijayan
Copyright 2006 by maththaios
Everything else Copyright © CodeProject, 1999-2009
Web20 | Advertise on the Code Project