65.9K
CodeProject 正在变化。 阅读更多。
Home

向事件添加用户名

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.40/5 (5投票s)

2006年2月22日

viewsIcon

40767

如何将用户名添加到事件查看器。

The Event Viewer

引言

本文将解释如何将用户名添加到事件查看器中记录的事件中。

背景

我需要将用户名添加到正在记录的事件中,但没有找到直接相关的资料。微软网站上说只需将 SID 添加到 ReportEvent 函数中。但它没有说明如何获取 SID。经过大量调查,我找到一篇用另一种编程语言编写的文章,该文章获取了用户 SID,所以我将其翻译成 C 并与我正在做的事情结合起来。

使用代码

我首先编写了一个独立的程序来测试我想在工作中做的事情。我将提供所有相关部分,以便您可以简单地将可用的内容粘贴到您的项目中。

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

关注点

就这样了。GetTokenInformation 函数需要调用两次;如果您为 SID 分配的内存过多或过少,该函数将失败。

带有我们条目的事件查看器

The Event Viewer

© . All rights reserved.