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:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

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

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

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

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

确定,创建完成

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

原文地址:http://blog.51cto.com/rdsrv/2130456

时间: 2024-10-14 16:45:19

Windows事件日志写入SQL Server并PowerBI统计分析的相关文章

使用EventLog类写Windows事件日志

在程序中经常需要将指定的信息(包括异常信息和正常处理信息)写到日志中.在C#3.0中可以使用EventLog类将各种信息直接写入Windows日志.EventLog类在System.Diagnostics命名空间中.我们可以在“管理工具” > "事件查看器“中可以查看我们写入的Windows日志,如下图所示: 下面是一个使用EventLog类向应用程序(Application)写入日志的例子,日志类型使用EventLogEntryType枚举类型指定. Code highlighting

通过本地的SQL Manage sutudio管理windows azure上的SQL Server

通过SQL Manage sutudio管理windows azure上的SQL Server 说到windows azure上的SQL创建,我们在上一篇文章上有介绍了,那今天主要介绍什么呢,我们发现在windows azure上创建的sql数据库下没有SQL Server代理选项功能.我相信大家都用过SQL Server代理相关的功能,具体功能就不用多说了.拿我来说,因为我们有个服务的数据是写入到SQL Server上的,我们在本地通过计划人物实现对数据保留60天,然后通过web方式查询,这样

在windows 2008 R2中SQl Server 2008中代理启动失败的一个原因总结

启动SQL代理的时候报错如下: 关调用实时(JIT)调试而不是此对话框的详细信息,请参见此消息的结尾. ************** 异常文本 **************System.NullReferenceException: 未将对象引用设置到对象的实例. Server stack trace: 在 Microsoft.SqlServer.Management.UI.VSIntegration.ObjectExplorer.ObjectExplorer.FindObjectExplore

在Windows 10 上安装SQL Server 2000数据库

Win10本身是一个兼容性较好的操作系统,目前有很多人在咨询如何在Windows 10 上安装 SQL Server 2000数据库,都没有成功过.主要是卡在了安装过程中的mdac2.6 安装上,一直停这儿不动. 我们根据自己的实践,成功在Window 安装上了 SQL Server 2000数据库标准版,安装成功的关键是“不要”将安装程序设置兼容模式(兼容XP sp2)运行,直接以管理员身份运行SQL Server安装程序即可. 一.更换回旧的SQLUNIRL.DLL 将SQL Server

修改Windows帐户密码,导致Sql Server 2000无法启动

修改Windows帐户密码,导致Sql Server 2000无法启动. --现象以管理员或同等权限用户登录 Windows XP,建立 Sql Server 2000 数据库.之后,在修改此 Windows 帐户密码后,Sql Server 2000 不能启动,出错提示为:“未能建立与数据库的连接.原因:Sql Server 不存在或访问被拒绝”.“发生错误1069,由于登录失败而无法启动服务.” --原因因为被修改密码的帐户与建立数据库是同一个帐户.默认情况下,建立数据库的帐户被用作启动数据

查看Windows服务器安装了那些SQL Server组件

原文:查看Windows服务器安装了那些SQL Server组件 如何查看Windows服务器安装了那些SQL Server组件呢? 最近就遇到这样一个需求,需要知道Windows服务器是否安装了Replication组件,那么有几种方法查看Windows服务器安装了哪些SQL Server组件呢?下面总结一下这方面的方法,希望对遇到这样问题的人有所帮助! 1:通过SQL Server Features Discovery Report查看. 在开始菜单找到"SQL Server Install

为什么要使用日志管理?-syslog和Windows事件日志

为什么要使用日志管理?syslog和Windows事件日志 日志管理 - 确保网络安全的先决条件日志给予您有关网络活动的第一手信息.日志管理确保日志中隐藏的网络活动数据转换为有意义的可操作的安全信息.日志管理是网络安全管理员为保护网络而要完成的首要任务.日志管理包括收集.安全存储.规范化.分析.生成报表和告警.日志收集· 日志收集必须是非侵入性的.· 需要从网络中出现的不同设备.服务器和应用程序组中收集日志.· 最好以无代理的方式收集日志.在某些网络环境中,以使用代理的方式进行的日志收集应以可选

使用rsync备份Windows事件日志

使用rsync备份Windows事件日志 Windows版软件:cwRsyncServer 安装比较简单一直下一步即可,输入到创建账号页面的时候可以自己设置一个密码. 服务器端:cwRsyncServer_4.0.5_Installe.zip 客户端:cwRsync_4.0.5_Installer.zip 由于特殊原因需要收集Windows的Application.Security.Setup.System事件日志,而事件日志的位置是在C:\Windows\System32\winevt\Log

SQL Server 无法生成 FRunCM 线程。请查看 SQL Server 错误日志和 Windows 事件日志

1.IP地址配置不正确: 打开 Microsoft SQL Server 2005配置工具下的SQL Server Configuration Manager,选择MSSQLSERVER协议, 然后双击右边窗口的TCP/IP,在弹出窗口中检查IP配置. 2.可能是因为VIA协议启用造成的.解决方法如下: 另外,管理员密码修改也会造成sqlserver服务无法启动.解决方法如下: 打开 Microsoft SQL Server 2005配置工具下的SQL Server Configuration