使用没有管理员权限的Windows API收集事件日志

问题描述:

我正在尝试收集事件日志,并且希望在没有管理员权限的情况下执行此操作。使用没有管理员权限的Windows API收集事件日志

这是我的代码..

#include "stdafx.h" 
#pragma comment(lib, "wevtapi.lib") 
#include <Windows.h> 
#include <winevt.h> 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    BOOL flag=EvtExportLog(
        NULL, 
        L"%SystemRoot%\\System32\\Winevt\\Logs\\System.evtx", 
        L"*", 
        L"D:\\SomePath\\Des.evtx", 
        EvtExportLogFilePath 
      ); 
    int i = GetLastError(); 
} 

当我尝试这样做,我得到拒绝访问错误。我能够查看使用eventvwr事件日志,我可以得到这%SystemRoot%\System32\Winevt\Logs\System.evtx日志文件的路径,但是当我再次尝试穿上run路径我得到Access denied进行查看。

我想复制.evtx日志文件,而无需任何管理权限,那么,有没有办法做下去。

单独的权限给予EventLog,所以通过使用事件日志的API,我们可以得到eventlogs.So每当我们打开eventvwr其通过事件日志的权限得到开。

因此,如果通过身份验证的用户想要得到他去thruogh事件日志的API的事件日志时。 EvtExportLog中的第四个参数是EVT_EXPORTLOG_FLAGS ,它定义的值指示事件是来自频道还是日志文件。

所以在上面的代码验证的用户不能没有事件日志的API是eventvwr访问事件日志文件,要做到这一点,我们必须为EvtExportLogChannelPathEvtExportLogFilePath更改EvtExportLog的标志。

所以上面的代码可以被修改为...

#include "stdafx.h" 
#pragma comment(lib, "wevtapi.lib") 
#include <Windows.h> 
#include <winevt.h> 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    BOOL flag=EvtExportLog(
        NULL, 
        L"System", 
        L"*", 
        L"D:\\SomePath\\Des.evtx", 
        EvtExportLogChannelPath 
      ); 
    int i = GetLastError(); 
} 

此代码将在所希望的位置得到SYSTEM日志。

如果您没有适当的提升特权,则收集事件日志文件可能不可行。

但是,您可以使用XPATH查询来消耗所有事件。 您可以稍后使用一些XML解析器来解析它们。

这里是如何做到这一点: https://msdn.microsoft.com/en-us/library/windows/desktop/dd996910(v=vs.85).aspx