Windows事件日志写入SQL Server并PowerBI统计分析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Windows事件日志写入SQL Server并PowerBI统计分析相关的知识,希望对你有一定的参考价值。

在这里我准备了2台系统,一个Windows Server 2012 R2的域控服务器DC01,一台SQL on CentOS7的SQL数据库服务器

技术分享图片

首先我使用SQL Manager Studio连接到SQL数据库服务器创建需要存放Windows转发事件日志的数据库“EventCollections”

CREATE DATABASE EventCollections

GO

USE EventCollections

GO

-- the table name loosely relates to the name of my Win Event Subscription name

CREATE TABLE [dbo].[GeneralEvents](

[Id] [int] NULL,

[LevelDisplayName] [varchar](255) NULL,

[LogName] [varchar](255) NULL,

[MachineName] [varchar](255) NULL,

[Message] [varchar](max) NULL,

[ProviderName] [varchar](255) NULL,

[RecordID] [bigint] NULL,

[TaskDisplayName] [varchar](255) NULL,

[TimeCreated] [smalldatetime] NULL

)

-- Create Unique Clustered Index with IGNORE_DUPE_KEY=ON to avoid duplicates in sqlbulk imports

CREATE UNIQUE CLUSTERED INDEX [ClusteredIndex-EventCombo] ON [dbo].[GeneralEvents]

(

[RecordID] ASC,

[MachineName] ASC,

[LogName] ASC

) WITH (IGNORE_DUP_KEY = ON)

GO

技术分享图片

为了避免后面每小时导入一次日志数据时出现重复,对RecordID,MachineName和LogName使用IGNORE_DUPE_KEY=ON创建唯一的聚集索引

接下来回到DC服务器配置事件服务

首先需要配置WinRM,显示可用的侦听器

winrm e winrm/config/listener

技术分享图片

执行winrm get winrm/config

检查

allowremoteAccess = true

技术分享图片

在日志源服务器(我们只有DC一台服务器,使用这台既是源也是收集日志服务器)把network Service加入到Event Log Readers组里

技术分享图片

然后在日志源服务器和收集日志服务器执行如下命令:

wevtutil sl security /ca:O:BAG:SYD:(A;;0xf0005;;;SY)(A;;0x5;;;BA)(A;;0x1;;;S-1-5-32-573)(A;;0x1;;;S-1-5-20)

技术分享图片

接下来打开事件查看器,点击订阅,这是会出现提示,是否启用Windows事件收集器服务,点击“是”

之间转发使用的HTTP端口是5985

然后创建一个新的订阅,指定需要收集的计算机,这里输入DC01

技术分享图片

选择需要订阅哪些日志,这里我选择System

技术分享图片

选择收集的事件级别

技术分享图片

在高级里指定收集日志的帐户为域管理员帐户,然后确定

技术分享图片

点击用户名密码进行输入

技术分享图片

正常:每15分钟

最小化带宽:每6小时

最小化延迟:每30秒

确定

技术分享图片

这样就创建好一个收集系统日志的订阅了

技术分享图片

按照同样的方法再创建一个安全日志的订阅

技术分享图片

如果要执行命令的审计日志,可以开启下面2个位置的组策略,然后通过事件ID4688查看

计算机配置 > 策略 > Windows 设置 > 安全设置 > 高级审核配置 > 详细跟踪>审核创建进程

技术分享图片

管理 模板系统审核创建的进程在创建事件的过程中包含命令行

技术分享图片

备注:Microsoft不建议永久启用命令行审核。启用此功能后,对Windows安全事件的读取访问权限的任何用户将能够读取任何成功创建的进程的命令行参数。请记住,命令行命令可能包含机密信息,包括密码和其他用户数据

等待15分钟后事件查看器的已转发事件里就出现了我们订阅的安全和系统日志了

技术分享图片

最后我在DC上执行如下PowerShell命令,将已转发事件的日志写入SQL里

  • 如果SQL是台Windows并且加域,那么可以采用集成身份验证方式登陆,执行下面脚本

# While this script is intended to run on an hourly basis, the filter is set for going back 65 minutes.

# This allows the script to run for 5 minutes without any missing any events. Because we setup the

# table using the IGNORE_DUPE_KEY = ON, duplicate entries are ignored in the database.

$xml = @‘

<QueryList>

<Query Id="0" Path="ForwardedEvents">

<Select Path="ForwardedEvents">*[System[TimeCreated[timediff(@SystemTime) &lt;= 3900000]]]</Select>

</Query>

</QueryList>

‘@

$events = Get-WinEvent -FilterXml $xml | Select-Object ID, LevelDisplayName, LogName, MachineName, Message, ProviderName, RecordID, TaskDisplayName, TimeCreated

$connectionString = "Data Source=sqlserver;Integrated Security=true;Initial Catalog=EventCollections;"

$bulkCopy = new-object ("Data.SqlClient.SqlBulkCopy") $connectionString

$bulkCopy.DestinationTableName = "GeneralEvents"

$dt = New-Object "System.Data.DataTable"

# build the datatable

$cols = $events | select -first 1 | get-member -MemberType NoteProperty | select -Expand Name

foreach ($col in $cols) {$null = $dt.Columns.Add($col)}

foreach ($event in $events)

{

$row = $dt.NewRow()

foreach ($col in $cols) { $row.Item($col) = $event.$col }

$dt.Rows.Add($row)

}

# Write to the database!

$bulkCopy.WriteToServer($dt)

  • 如果是采用sa帐户登陆就执行如下:

$xml = @‘

<QueryList>

<Query Id="0" Path="ForwardedEvents">

<Select Path="ForwardedEvents">*[System[TimeCreated[timediff(@SystemTime) &lt;= 3900000]]]</Select>

</Query>

</QueryList>

‘@

$events = Get-WinEvent -FilterXml $xml | Select-Object ID, LevelDisplayName, LogName, MachineName, Message, ProviderName, RecordID, TaskDisplayName, TimeCreated

$connectionString = "Data Source=sqlserver;user id=sa;[email protected];Initial Catalog=EventCollections;"

$bulkCopy = new-object ("Data.SqlClient.SqlBulkCopy") $connectionString

$bulkCopy.DestinationTableName = "GeneralEvents"

$dt = New-Object "System.Data.DataTable"

# build the datatable

$cols = $events | select -first 1 | get-member -MemberType NoteProperty | select -Expand Name

foreach ($col in $cols) {$null = $dt.Columns.Add($col)}

foreach ($event in $events)

{

$row = $dt.NewRow()

foreach ($col in $cols) { $row.Item($col) = $event.$col }

$dt.Rows.Add($row)

}

# Write to the database!

$bulkCopy.WriteToServer($dt)

其中上面这段:

<QueryList>

<Query Id="0" Path="ForwardedEvents">

<Select Path="ForwardedEvents">*[System[TimeCreated[timediff(@SystemTime) &lt;= 3900000]]]</Select>

</Query>

</QueryList>

取自于已转发事件的“筛选当前日志”

技术分享图片

XML内容

技术分享图片

执行完成以后可以到SQL去检查日志是否已经写进SQL

select * from GeneralEvents

可以看到日志成功写入SQL里

技术分享图片

最后就是做一个Windows计划任务把上面的Powershell脚本每隔1小时自动执行一次了

把上面成功执行的脚本保存成ps1文件,并把这个文件剪切到C盘根目录下

技术分享图片

打开任务计划程序,创建一个基本任务

技术分享图片

下一步

技术分享图片

选择每天

技术分享图片

下一步

技术分享图片

启动程序

技术分享图片

在程序里选择powershell的启动路径C:WindowsSystem32WindowsPowerShellv1.0powershell.exe

参数添加-command ". ‘c:event-into-sql.ps1‘"

技术分享图片

勾选“但单击“完成”时,打开此任务属性的对话框”,然后完成

技术分享图片

设置执行该计划任务的帐户,以及权限

技术分享图片

在触发器里修改每日为如下图所示

技术分享图片

确定,创建完成

技术分享图片

到这里就大功告成了。既然事件日志都写入SQL了,那么就可以利用PowerBI Desktop去读取SQL的数据进行事件日志统计分析了,如下图:

技术分享图片

以上是关于Windows事件日志写入SQL Server并PowerBI统计分析的主要内容,如果未能解决你的问题,请参考以下文章

sql server 错误日志errorlog

SQL Server 审核事件日志

如何使用不存在的源写入 Windows 事件日志记录

配置在 Windows 10 上运行的 Oracle XE 日志记录,防止写入 Windows 事件日志

关于SQL Server 安装程序在运行 Windows Installer 文件时遇到错误

SQL Server 2012 安装出现错误:在运行 Windows Installer 文件时遇到错误。