我的任务是使用“Microsoft Windows 安全审核”提供的事件创建 ETW 实时消费者。
我基于这个例子制作了一个简单的控制器和消费者应用程序http://msdn.microsoft.com/en-us/library/windows/desktop/ee441325%28v=vs.85%29.aspx http://msdn.microsoft.com/en-us/library/windows/desktop/ee441325%28v=vs.85%29.aspx并更改标志以在实时模式下工作。
主要功能如下所示:
LPTSTR SessionName = L"hahahaaa";
ULONG status = ERROR_SUCCESS;
PEVENT_TRACE_PROPERTIES pSessionProperties = NULL;
EVENT_TRACE_LOGFILE trace;
TRACEHANDLE hTrace = 0;
TRACEHANDLE hSession = 0;
const GUID providerId = { 0x54849625, 0x5478, 0x4994, { 0xA5, 0xBA, 0x3E, 0x3B, 0x03, 0x28, 0xC3, 0x0D } };
//const GUID providerId = { 0xA68CA8B7, 0x004F, 0xD7B6, { 0xA6, 0x98, 0x07, 0xE2, 0xDE, 0x0F, 0x1F, 0x5D } };
HANDLE hToken = NULL;
HANDLE hProcess = NULL;
hProcess = GetCurrentProcess();
if (OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES, &hToken) == FALSE) {
printf("Error: Couldn't open the process token\n");
goto cleanup;
}
if(!SetPrivilege(hToken, SE_SECURITY_NAME, TRUE)) goto cleanup;
if (!pSessionProperties) {
const size_t buffSize = sizeof(EVENT_TRACE_PROPERTIES)+(_tcslen(SessionName) + 1) * sizeof(TCHAR);
pSessionProperties = reinterpret_cast<EVENT_TRACE_PROPERTIES *>(malloc(buffSize));
ZeroMemory(pSessionProperties, buffSize);
pSessionProperties->Wnode.BufferSize = buffSize;
pSessionProperties->Wnode.ClientContext = 1;
pSessionProperties->Wnode.Flags = WNODE_FLAG_TRACED_GUID;
pSessionProperties->LogFileMode = EVENT_TRACE_REAL_TIME_MODE;
pSessionProperties->LoggerNameOffset = sizeof(EVENT_TRACE_PROPERTIES);
}
// Create the trace session.
status = StartTrace(&hSession, SessionName, pSessionProperties);
if (ERROR_SUCCESS != status) {
wprintf(L"StartTrace() failed with %lu\n", status);
goto cleanup;
}
status = EnableTraceEx2(hSession, &providerId, EVENT_CONTROL_CODE_ENABLE_PROVIDER, TRACE_LEVEL_VERBOSE, 0, 0, 0, NULL);
if (ERROR_SUCCESS != status) {
wprintf(L"EnableTrace() failed with %lu\n", status);
goto cleanup;
}
ZeroMemory(&trace, sizeof(EVENT_TRACE_LOGFILE));
trace.LogFileName = NULL;
trace.LoggerName = SessionName;
trace.CurrentTime = 0;
trace.BuffersRead = 0;
trace.BufferSize = 0;
trace.Filled = 0;
trace.EventsLost = 0;
trace.Context = NULL;
trace.ProcessTraceMode = PROCESS_TRACE_MODE_REAL_TIME | PROCESS_TRACE_MODE_EVENT_RECORD;
trace.EventRecordCallback = (PEVENT_RECORD_CALLBACK)(ProcessEvent);
hTrace = OpenTrace(&trace);
if (INVALID_PROCESSTRACE_HANDLE == hTrace)
{
wprintf(L"OpenTrace failed with %lu\n", GetLastError());
goto cleanup;
}
status = ProcessTrace(&hTrace, 1, 0, 0);
if (status != ERROR_SUCCESS && status != ERROR_CANCELLED)
{
wprintf(L"ProcessTrace failed with %lu\n", status);
goto cleanup;
}
“ProcessTrace()”点的应用程序应等待传入事件并将其元数据写入标准输出。但事实并非如此。我生成的所有事件(即我打开详细跟踪 - 进程创建并运行应用程序)都显示在 EventViewer 中,但我的程序没有显示任何内容。
我认为这可能是一些权限问题,并使用这个例子http://msdn.microsoft.com/en-us/library/windows/desktop/aa446619%28v=vs.85%29.aspx http://msdn.microsoft.com/en-us/library/windows/desktop/aa446619%28v=vs.85%29.aspx我设置了 SE_SECURITY_NAME 权限,当然还以管理员模式运行应用程序。但一切都没有改变。
另一种尝试是会话名称。也许这与“Windows Kernel Trace”有同样的问题,它只能记录到系统会话“NT Kernel Logger”。我发现的唯一一件事是“Microsoft Windows 安全审核”与“Eventlog-Security”会话相关,但是当我以此设置会话名称时,我收到“访问被拒绝”错误。我不知道应该设置哪些额外权限来处理这个问题。
最后一次尝试是使用“logman”并将事件收集到文件中,但一切都是一样的。当我通过“Eventlog-Security”设置会话名称时,我收到“访问被拒绝”。另一方面,当我通过其他东西设置它时,我只收到一个由“MSNT_SystemTrace”提供的事件,它是其他事件的抽象类。
如果我将提供程序更改为“Microsoft Windows Kernel General”(带注释的 GUID)并生成一个事件(更新系统时钟),则一切都会按预期工作(在我的应用程序中并使用“logman”)。
我使用 Windows 7 Professional x64 和 Visual Studio Ultimate 2013。
我的问题是,我该如何接收来自“Microsoft Windows 安全审核”提供商的事件?
谢谢你的帮助!
EDIT正如我在评论中所写,如果我们将会话名称设置为事件日志安全,应用程序被缩短为打开跟踪() and 进程跟踪().
EDIT 2正如卢克在评论中建议的那样,我使用本地系统权限运行我的应用程序,一切都开始工作。