windows 2012 r2 安全事件日志自定义插入

windos 2012 r2 security event log custom insert

我正在尝试在 windows 服务器 2012 r2 中写入日志 我可以这样写应用程序日志,

Write-EventLog -LogName Application -Source "mysource" other parameters goes here 

其正常工作并在 windowslog/application

中写入此日志

在那之后,我会像这样尝试安全日志

Write-EventLog -LogName Security -Source "Microsoft-Windows-Security-Auditing" other parameters goes here 

return 我这个错误

Write-EventLog : The registry key for the log "Security" for source "Microsoft-Windows-Security-Auditing" could not be
opened.
At line:1 char:1
+ Write-EventLog -LogName Security -Source "Microsoft-Windows-Security-Auditing" - ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (:) [Write-EventLog], Exception
    + FullyQualifiedErrorId : AccessDenied,Microsoft.PowerShell.Commands.WriteEventLogCommand

在那之后我搜索并找到一个用于写入安全日志的函数 AuthzReportSecurityEvent 我想我可以使用这个函数来写我的日志,如果我能做到的话我还有一个问题我如何在 powershell 或 python 中使用这个函数? 我想我可以通过 pywin32 模块使用这个功能吗?或者我可以直接在 powershell 脚本中调用吗? 你能给我分享一下我如何调用这个函数并使用这个函数在安全日志中写入日志的例子吗?

按照@Strive Sun的建议,我可以写登录安全

ı guess ı can write my logs using this function, if ı can do that ı have another question how can i use this function in powershell or python ?

安全日志写入访问限制在 Windows Server 2003 中有所放宽,没有通过引入一组特殊的 API 来改变基本设计(参见图 2)。这些 API 在内部使用本地过程调用 (LPC) 与 LSA 交互,指示它代表应用程序生成审计日志。机制简洁大方

首先,应用程序通过调用AuthzRegisterSecurityEventSource 向LSA 注册一个安全事件源句柄。这个 API 唯一感兴趣的参数是事件源的名称,它几乎可以是任何东西,但有一些限制。例如,不能将其命名为“Security”,因为该名称已保留供系统使用。此调用返回的安全事件源句柄用于以下步骤。

接下来,通过密切调用以下两个 relat-ed API 之一生成事件:AuthzReportSecurityEvent 或 AuthzReportSecurityEventFromParams。最后,当应用程序关闭时,它通过调用 AuthzUnregisterSecurityEventSource 注销安全事件源句柄。

参考:The Security log

can you share me any example how can ı call this function and write log in security log using this function.

代码示例:(C++)

#include <stdio.h>
#include <iostream>
#include <string>
#include <strsafe.h>
#include <windows.h>
#include <Authz.h>
#include <Ntsecapi.h>


#pragma comment(lib,"Authz.lib")
#pragma comment(lib,"Advapi32.lib")

BOOL SetPrivilege(
    HANDLE hToken,          // access token handle
    LPCTSTR lpszPrivilege,  // name of privilege to enable/disable
    BOOL bEnablePrivilege   // to enable or disable privilege
)
{
    TOKEN_PRIVILEGES tp;
    LUID luid;

    if (!LookupPrivilegeValue(
        NULL,            // lookup privilege on local system
        lpszPrivilege,   // privilege to lookup
        &luid))        // receives LUID of privilege
    {
        printf("LookupPrivilegeValue error: %u\n", GetLastError());
        return FALSE;
    }

    tp.PrivilegeCount = 1;
    tp.Privileges[0].Luid = luid;
    if (bEnablePrivilege)
        tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    else
        tp.Privileges[0].Attributes = 0;

    // Enable the privilege or disable all privileges.

    if (!AdjustTokenPrivileges(
        hToken,
        FALSE,
        &tp,
        sizeof(TOKEN_PRIVILEGES),
        (PTOKEN_PRIVILEGES)NULL,
        (PDWORD)NULL))
    {
        printf("AdjustTokenPrivileges error: %u\n", GetLastError());
        return FALSE;
    }

    if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)

    {
        printf("The token does not have the specified privilege. \n");
        return FALSE;
    }

    printf("Get the specified privilege! \n");

    return TRUE;
}




int main(int argc, const char* argv[])
{
    // Declare and initialize variables.

    BOOL bResult = TRUE;
    DWORD event_id = 4624;
    AUTHZ_SECURITY_EVENT_PROVIDER_HANDLE hEventProvider = NULL;
    PAUDIT_PARAMS p;
    std::string Source_Name = "Test security audit";
    std::wstring ws;
    std::string pbuf = "What is your purpose ?";
    std::wstring ws_buf;
    int return_code = 0;
    int i = 0;
    // Register the audit provider.
    HANDLE token;
    HANDLE hevent_source;
    ws.assign(Source_Name.begin(), Source_Name.end());
    ws_buf.assign(pbuf.begin(), pbuf.end());

    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &token))
        return FALSE;

    SetPrivilege(token, L"SeAuditPrivilege", true);

    AUTHZ_SOURCE_SCHEMA_REGISTRATION ar;
    memset(&ar, 0, sizeof(ar));
    ar.dwFlags = AUTHZ_ALLOW_MULTIPLE_SOURCE_INSTANCES;
    ar.szEventSourceName = &ws[0];
    ar.szEventMessageFile = &ws_buf[0];
    ar.szEventSourceXmlSchemaFile = NULL;
    ar.szEventAccessStringsFile = &ws_buf[0];
    ar.szExecutableImagePath = NULL;

    AuthzInstallSecurityEventSource(0, &ar);

    bResult = AuthzRegisterSecurityEventSource(0, ws.c_str(), &hEventProvider);
    int err = GetLastError();
    if (!bResult)
    {
        printf("AuthzRegisterSecurityEventSource failed, error is %d\n", err);
        return_code = -1;
    }

    SID id;
    if (hEventProvider)
    {
        // Generate the audit.
        while (i < 10) {
            bResult = AuthzReportSecurityEvent(
                APF_AuditSuccess,
                hEventProvider,
                event_id,
                NULL,
                3,
                APT_String, L"Jay Hamlin",
                APT_String, L"March 21, 1960",
                APT_Ulong, 45);
            int err1 = GetLastError();
            if (!bResult)
            {
                printf("AuthzReportSecurityEvent failed, error is %d\n", err1);
                return_code = -2;
                break;
            }

            i++;
        }

        AuthzUnregisterSecurityEventSource(0, &hEventProvider);
        AuthzUninstallSecurityEventSource(0, &ws[0]);
    }
    std::cout << "Exit  : " << return_code << std::endl;
    getchar();
}

注意:在 运行 代码示例之前,您必须在本地安全策略中执行一些操作。步骤可以 参考:

为当前用户分配权限后,请重启电脑使其生效。

更新:

请转至本地政策 -> 审计政策。为成功和失败启用“审核对象访问”。

然后你重新编译调试,你会发现安全日志出现在事件查看器中。