查询事件日志。如何查询以单独获取第一个和最后一个事件?
Querying for Event Log. How to query in order to get the first and last event alone?
我处理 Windows 事件日志已有一段时间了。我使用 EvtQuery()
函数收集日志。
我不习惯查询语言。我设法收集了全部数据并使用 EvtRender()
函数进行渲染。
我需要获取特定数据。也就是说,我需要向查询添加一个过滤器,以便我可以单独获取第一个和最后一个数据。有人可以帮我解决这个问题吗?
编辑
这是我试过的方法。正如我提到的,我不习惯查询语言。我根本没有 post 该程序,因为我发现它与我提出的问题无关。我能够使用该程序获取完整的日志。只是我不需要全部数据。
DWORD PrintResults(EVT_HANDLE hResults);
DWORD PrintEventValues(EVT_HANDLE hEvent);
void main() {
DWORD status = ERROR_SUCCESS;
EVT_HANDLE hResults = NULL;
const wchar_t *channelPath = L"Security";
const wchar_t *query = L"*";
//Remote handle
EVT_HANDLE hRemoteHandle;
EVT_RPC_LOGIN Credentials;
RtlZeroMemory(&Credentials, sizeof(EVT_RPC_LOGIN));
wstring comp_name = L"<ip>";
wstring user_name = L"<username>";
wstring password = L"<password>";
Credentials.Server = &comp_name[0];
Credentials.Domain = NULL;
Credentials.User = &user_name[0];
Credentials.Password = &password[0];
Credentials.Flags = EvtRpcLoginAuthNTLM;
hRemoteHandle = EvtOpenSession(EvtRpcLogin, &Credentials, 0, 0);
hResults = EvtQuery(hRemoteHandle , channelPath, query, EvtQueryChannelPath|
EvtQueryForwardDirection);
if (hResults == NULL) { //Check for an error
status = GetLastError();
if (status == ERROR_EVT_CHANNEL_NOT_FOUND)
cout << "ERROR : Channel not found...\n";
else if (status == ERROR_EVT_INVALID_QUERY)
cout << "ERROR : Invalid Query...\n";
else
cout << "ERROR STATUS : " << status;
goto Cleanup;
}
PrintResults(hResults);
Cleanup:
if (hResults)
EvtClose(hResults);
cin.get();
}
DWORD PrintResults(EVT_HANDLE hResults) {........} //Function defined
DWORD PrintEventValues(EVT_HANDLE hEvent){........} //Function defined
获取最后一个:使用带参数 EVT_SEEK_FLAGS 的 EvtSeek 函数枚举说:
EvtSeekRelativeToLast 从结果集中的最后一个条目查找到指定的偏移量。偏移量必须为负值。
轻松拿第一
我处理 Windows 事件日志已有一段时间了。我使用 EvtQuery()
函数收集日志。
我不习惯查询语言。我设法收集了全部数据并使用 EvtRender()
函数进行渲染。
我需要获取特定数据。也就是说,我需要向查询添加一个过滤器,以便我可以单独获取第一个和最后一个数据。有人可以帮我解决这个问题吗?
编辑
这是我试过的方法。正如我提到的,我不习惯查询语言。我根本没有 post 该程序,因为我发现它与我提出的问题无关。我能够使用该程序获取完整的日志。只是我不需要全部数据。
DWORD PrintResults(EVT_HANDLE hResults);
DWORD PrintEventValues(EVT_HANDLE hEvent);
void main() {
DWORD status = ERROR_SUCCESS;
EVT_HANDLE hResults = NULL;
const wchar_t *channelPath = L"Security";
const wchar_t *query = L"*";
//Remote handle
EVT_HANDLE hRemoteHandle;
EVT_RPC_LOGIN Credentials;
RtlZeroMemory(&Credentials, sizeof(EVT_RPC_LOGIN));
wstring comp_name = L"<ip>";
wstring user_name = L"<username>";
wstring password = L"<password>";
Credentials.Server = &comp_name[0];
Credentials.Domain = NULL;
Credentials.User = &user_name[0];
Credentials.Password = &password[0];
Credentials.Flags = EvtRpcLoginAuthNTLM;
hRemoteHandle = EvtOpenSession(EvtRpcLogin, &Credentials, 0, 0);
hResults = EvtQuery(hRemoteHandle , channelPath, query, EvtQueryChannelPath|
EvtQueryForwardDirection);
if (hResults == NULL) { //Check for an error
status = GetLastError();
if (status == ERROR_EVT_CHANNEL_NOT_FOUND)
cout << "ERROR : Channel not found...\n";
else if (status == ERROR_EVT_INVALID_QUERY)
cout << "ERROR : Invalid Query...\n";
else
cout << "ERROR STATUS : " << status;
goto Cleanup;
}
PrintResults(hResults);
Cleanup:
if (hResults)
EvtClose(hResults);
cin.get();
}
DWORD PrintResults(EVT_HANDLE hResults) {........} //Function defined
DWORD PrintEventValues(EVT_HANDLE hEvent){........} //Function defined
获取最后一个:使用带参数 EVT_SEEK_FLAGS 的 EvtSeek 函数枚举说:
EvtSeekRelativeToLast 从结果集中的最后一个条目查找到指定的偏移量。偏移量必须为负值。
轻松拿第一