使用没有Admin权限的Windows API收集事件日志

时间:2016-10-03 06:27:16

标签: c++ windows event-log

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

这是我的代码..

#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();
}

当我尝试这样做时,我得到Access Denied错误。我能够使用eventvwr查看事件日志,我可以获取日志文件%SystemRoot%\System32\Winevt\Logs\System.evtx的路径,但是当我尝试通过将路径放在{{1}上来查看它时我被拒绝访问。

我想复制那个没有任何管理员权限的run日志文件,所以有没有办法这样做。

2 个答案:

答案 0 :(得分:0)

如果您没有适当的提升权限,则可能无法收集事件日志文件。

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

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

答案 1 :(得分:0)

EventLog提供单独的权限,因此通过使用事件日志API,我们可以获得eventlogs.So每当我们通过事件日志权限打开eventvwr时,就会获得它。

因此,如果经过身份验证的用户想要获取事件日志,则必须使用thruogh eventlog API。 EvtExportLog中的第四个参数是EVT_EXPORTLOG_FLAGS 它定义了指示事件是来自通道还是日志文件的值。

因此,在上面的代码中,经过身份验证的用户无法在没有eventvwr的事件日志API的情况下访问事件日志文件,为此,我们必须将EvtExportLog中的标记更改为EvtExportLogChannelPath { {1}}。

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

EvtExportLogFilePath

此代码会将#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(); } 日志提供到所需位置。