Winapi 如何打开windows';特定于服务的事件日志

Winapi 如何打开windows';特定于服务的事件日志,winapi,event-log,Winapi,Event Log,我们需要以编程方式读取特定于服务的事件日志“Microsoft Windows TerminalsServices LocalSessionManager/Operational”。以下代码 LPWSTR pwsLogName = L"Microsoft-Windows-TerminalServices-LocalSessionManager/Operational"; HANDLE hEventLog = OpenEventLog(nullptr, pwsLogName); 结果打开“应用程

我们需要以编程方式读取特定于服务的事件日志“Microsoft Windows TerminalsServices LocalSessionManager/Operational”。以下代码

LPWSTR pwsLogName = L"Microsoft-Windows-TerminalServices-LocalSessionManager/Operational";
HANDLE hEventLog = OpenEventLog(nullptr, pwsLogName);
结果打开“应用程序”日志而不是必需的

同时,命令行实用程序wevtutil可以成功地读取所需的日志:

wevtutil query-events Microsoft-Windows-TerminalServices-LocalSessionManager/Operational

我们做错了什么?

最后我们发现OpenEventLog()已经死了,我们需要使用Evt*函数(&company)

最后我们发现OpenEventLog()已经死了,我们需要使用Evt*函数(&company)

行为是经过设计的;见:

Todo:首先检查注册表项是否存在,如果成功,则使用
openEventLog()

   _stprintf_s(szKeyName, _T("System\\CurrentControlSet\\Services\\EventLog\\%s"),szLogName);
    dwRet = RegOpenKey(HKEY_LOCAL_MACHINE, szKeyName, &hKey);
    if (ERROR_SUCCESS == dwRet)
    { 
        RegCloseKey(hKey);
        // continue with openEventLog()

这种行为是故意的;见:

Todo:首先检查注册表项是否存在,如果成功,则使用
openEventLog()

   _stprintf_s(szKeyName, _T("System\\CurrentControlSet\\Services\\EventLog\\%s"),szLogName);
    dwRet = RegOpenKey(HKEY_LOCAL_MACHINE, szKeyName, &hKey);
    if (ERROR_SUCCESS == dwRet)
    { 
        RegCloseKey(hKey);
        // continue with openEventLog()

OpenEventLog
是传统的一部分。Vista引入了,在这里您可以找到此终端服务事件频道。您可以通过和(如XML)从该通道查询和呈现事件。使用
EvtClose
关闭所有句柄
OpenEventLog
是旧版的一部分。Vista引入了,在这里您可以找到此终端服务事件频道。您可以通过和(如XML)从该通道查询和呈现事件。使用
EvtClose
关闭所有句柄。