Windows 日志高级筛选实践
背景
经常需要查看日志,不仅是用来排错,有些时候我还需要监控系统来抓取特定日志来帮助减少我的工作负担,以及时监控到异常出现,并作出通知及响应,那么从大量日志中快速并精确筛选出想要的日志,并且精确提取信息,是一个必备的技能。我曾经用内置的事件查看器的筛选器进行事件筛选,然后保存视图,或者使用powershell get-winevent 进行筛选,也使用logparser, 或者第三方的日志查看工具比如eventexplorer 进行日志筛选。但是总是遇到几个主要的问题:
从大量日志中过滤出极个别日志,每次执行的事件总是太长。
不能灵活的或者更精确的进行筛选。一般只能大概的匹配,然后再做一步处理。通常又遇到1的问题。
尝试和比较
经过一些尝试和使用,个人觉得powershell 的get-winevent 最方便,因为毕竟是一个脚本语言,可以进一步进行处理,而且可以很灵活的处理。logparser 很快,但是如果精确提取某些日志的字段,就没有那么容易了,windows 日志的EventData中的数据复杂多样,靠几个常规字段是没有办法灵活进行处理的。
论速度的话,除了logparser,使用xml 筛选是最快速的。但是xml 筛选需要使用复杂的、受限的xpath 1.0 (被微软实现后,有更多限制),虽然有点蹩脚又难懂,但是和时间节省算起,还是划的来的,特别是重复任务。
一个比较好的开始是从下面链接开始。
https://blogs.technet.microsoft.com/askds/2011/09/26/advanced-xml-filtering-in-the-windows-event-viewer/
正式实践
一个比较常用场景是,我经常需要精确过滤到哪个账号最近锁定了,哪台计算机锁定的,什么时候。我需要很快速的能查询到锁定日志。过去虽然我用get-winevent –filterhashtable 可以做到这些,但是速度实在太慢了,虽然我的域控只有4台。我经常和用户说,如果你想知道你在哪台计算机上锁定了,请等待一段时间,我会把查询结果用邮件发给你。不过现在使用xpath 过滤时,我基本上可以在用户打电话过来时,告诉他这些信息。
下面XML 过滤AD安全日志中的最近一天的某个用户名的锁定日志
<QueryList> <Query Id="0" Path="Security"> <Select Path="Security"> *[System[EventID=4740 and TimeCreated[timediff(@SystemTime) <= 86400000] and Provider[@Name='Microsoft-Windows-Security-Auditing']]] and *[EventData[Data[@Name='TargetUserName']='somebody']] </Select> </Query> </QueryList>
如果你只想过滤最近一天所有用户的锁定日志,那么这样写
<QueryList> <Query Id="0" Path="Security"> <Select Path="Security"> *[System[EventID=4740 and TimeCreated[timediff(@SystemTime) <= 86400000] and Provider[@Name='Microsoft-Windows-Security-Auditing']]] </Select> </Query> </QueryList>
上面过滤XML可以在 事件查看器的 筛选当前日志--》XML---》手动编辑查询中进行测验。
OK ,为了方便使用,我们做成一个powershell function ,方便日常使用,直接上例子。
function get-lockedEvent{<#.SYNOPSISFunction to filter user locked event which id=4740.DESCRIPTIONThis function search user locked events in DC security logs, this function need the domain admin priv..EXAMPLEget-lockedEvent -loginname oaoperator -show.EXAMPLEPS C:\> get-lockedEvent -loginname oaoperator -summaryCount Name----- ----457 Oaoperator, OA.EXAMPLEPS C:\> get-lockedEvent -loginname oaoperatorUsername LockedPC Datetime EventLocation-------- -------- -------- -------------Oaoperator OA 2018/9/27 10:27:40 dc02Oaoperator OA 2018/9/27 10:32:40 dc02#>[cmdletbinding()]param([parameter(Mandatory=$false)][string]$loginname,[Parameter(Mandatory=$false)][switch]$summary,[Parameter(Mandatory=$false)][switch]$show) # filter Locked Events generated in 1 day and username eq loginname$f2=@'<QueryList><Query Id="0" Path="Security"><Select Path="Security">*[System[EventID=4740 and TimeCreated[timediff(@SystemTime) <= 86400000] and Provider[@Name='Microsoft-Windows-Security-Auditing']]]and *[EventData[Data[@Name='TargetUserName']='{0}']]</Select></Query></QueryList> '@ # filter Locked Events generated in 1 day $f1=@'<QueryList><Query Id="0" Path="Security"><Select Path="Security">*[System[EventID=4740 and TimeCreated[timediff(@SystemTime) <= 86400000] and Provider[@Name='Microsoft-Windows-Security-Auditing']]]</Select></Query></QueryList> '@if($loginname){$f=$f2 -f $loginname}else{$f=$f1}$DCs=Get-ADDomainController -Filter *|%{$_.hostname}$r=Invoke-Command -ComputerName $DCs -ArgumentList @($f) -Command{param($filter)$events=Get-WinEvent -FilterXml $filter$events|%{$e=[xml]$_.toxml()[PSCustomObject]@{'Username'=$e.Event.EventData.Data.where({$_.Name -eq 'TargetUserName'})."#text"'LockedPC'=$e.Event.EventData.Data.where({$_.Name -eq 'TargetDomainName'})."#text"'Datetime'=[datetime]$e.Event.System.TimeCreated.SystemTime'EventLocation'=$e.Event.System.Computer}}}|Sort-Object -Property Datetime |select -Property 'UserName','LockedPC','Datetime','EventLocation'if($summary){$r=$r|Group-Object -Property Username,LockedPC -NoElement}if($show){$r|Out-GridView}else{$r} }
另外一个实践
由于最近有一些计划任务的状态需要监控,而且考虑到这应该是一个非常通用的需求,所以我想过滤计划任务名称匹配\qq_ent 开头的,然后任务执行结果不为0的日志,尽管我参考着下面的一些blog 链接,也让我尝试了好一会,我想应该记录下这些过程。
我们先来看看计划任务日志的xml 内容:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"> <System><Provider Name="Microsoft-Windows-TaskScheduler" Guid="{DE7B24EA-73C8-4A09-985D-5BDADCFA9017}" /> <EventID>201</EventID> <Version>2</Version> <Level>4</Level> <Task>201</Task> <Opcode>2</Opcode> <Keywords>0x8000000000000000</Keywords> <TimeCreated SystemTime="2018-11-18T05:00:02.058811400Z" /> <EventRecordID>144817</EventRecordID> <Correlation ActivityID="{110529FD-DBFD-4E59-B207-83DF8CC779B8}" /> <Execution ProcessID="1508" ThreadID="24392" /> <Channel>Microsoft-Windows-TaskScheduler/Operational</Channel> <Computer>ComputerName.xxx.com</Computer> <Security UserID="S-1-5-18" /> </System> <EventData Name="ActionSuccess"><Data Name="TaskName">\qq_ent\store_to_db</Data> <Data Name="TaskInstanceId">{110529FD-DBFD-4E59-B207-83DF8CC779B8}</Data> <Data Name="ActionName">C:\Users\UserName\AppData\Local\Programs\Python\Python37\python3.exe</Data> <Data Name="ResultCode">2147942401</Data> <Data Name="EnginePID">22172</Data> </EventData></Event>
说下我们的任务:
匹配 EventData 中Data 名称为TaskName的,它的值应该是\qq_ent\xxxx
匹配 EventData中 Data 名称为ResultCode的,它的值应该是>0 或者不等于0的
EventID=201
Provider Name=Microsoft-Windows-TaskScheduler
最后成型的过滤,和微软的之前的例子不一样。
<QueryList><Query Id="0" Path="Microsoft-Windows-TaskScheduler/Operational"><Select Path="Microsoft-Windows-TaskScheduler/Operational">*[System/EventID=201]and *[EventData[(Data[@Name='TaskName']='\qq_ent\download_images' or Data[@Name='TaskName']='\qq_ent\store_to_db_offline'or Data[@Name='TaskName']=='\qq_ent\gatherQQmsg' or Data[@Name='TaskName']=='\qq_ent\store_to_db')andData[@Name='ResultCode'] !=0]]</Select></Query></QueryList>
我之前按照微软的例子是这样写的,结果不对的。
<QueryList><Query Id="0" Path="Microsoft-Windows-TaskScheduler/Operational"><Select Path="Microsoft-Windows-TaskScheduler/Operational">*[System/EventID=201]and *[EventData[(Data[@Name='TaskName'] and (Data='\qq_ent\download_images' or Data='\qq_ent\store_to_db_offline'or Data='\qq_ent\gatherQQmsg' or Data='\qq_ent\store_to_db')) and(Data[@Name='ResultCode'] and Data !='0')]]</Select></Query></QueryList>
注意事项
event log 中的Xpath 受限,能使用的函数有限,因此如果你想筛选字符串,你会发现starts-with contains 这些xpath 函数都不支持。尽量使用其他条件筛选,然后再使用powershell内置过滤功能进行过滤,当然这要牺牲一些处理时间。
Xpath中的一些字符串要进行转义,比如你想比较一个数字,可能写Data>0,那么> 要转义成>
参考资料
https://blogs.technet.microsoft.com/heyscriptingguy/2011/01/24/use-powershell-cmdlet-to-filter-event-log-for-easy-parsing/
https://blogs.technet.microsoft.com/heyscriptingguy/2014/06/04/data-mine-the-windows-event-log-by-using-powershell-and-xml/
https://blogs.technet.microsoft.com/heyscriptingguy/2014/06/03/use-filterhashtable-to-filter-event-log-with-powershell/
https://blogs.technet.microsoft.com/askds/2011/09/26/advanced-xml-filtering-in-the-windows-event-viewer/
转载于:https://blog.51cto.com/yoke88/2320358
相关文章:

PAT(甲级)2018年秋季考试 7-1 Werewolf - Simple Version
1. 我设置了一个结构体变量存储每个人的指控信息 struct IF{int type 0;int no; }; 这里我发现了一件事,如果结构体只有有参数的构造函数,那么直接声明该结构体类型的数组是不行的。但是好处是数组知道下标可以直接赋值。 也就是这样组合最好&#x…

appium 启动失败解决方案
本机下载了:AppiumForWindows,启动Appium.exe 的时候,立即提示:应用程序已停止运行!! 本机环境: WIN 7 64 位,后来查了资料才知道Appium 要求安装.net framework 4.5,本机…

Django基础-数据分页
2019独角兽企业重金招聘Python工程师标准>>> pager.py # -*- coding:utf8 -*- """ 引用说明: 数据总个数:total_count 数据总页数:num_pages 每页显示的行数:perPageItemNum【默认显示10行】 最多显示页…

存货的计划属性设置(ATO模型和PTO模型)
对于原来应用ERP1时已经存在的存货,如果在存货属性中没有进行过设置或者设置不完善,需要进行补充设置。这样的补充设置包括: 自制:具有该属性的存货可由企业生产自制。如工业企业生产的产成品、半成品等存货。具有该属性的存货可用…

(C++)判断一个序列是non-increasing/non-decreasing还是两者都不的两个方法
思路:根据前两个值预设类型,再遍历后面的pair,看是否推翻预设 int judgeType(vector<int> vi){//-1 递减 0 啥也不是 1 递增 if(vi.size()1)return 0;//根据前两个元素的大小设置初始类型int type;if(vi[1]>vi[0])type 1;else …

java 下载文件功能代码例子
public static void down(HttpServletRequest request, HttpServletResponse response) throws Exception { String name"aaa.*";//文件名 String uploadPath UploadFileHelper.getRepositoryPath()"//";//文件来源 String filePath…

不要小看字符串
字符串非常非常常见又重要,而且还有那么多名堂在里面 字符串: 在标准C中,是没有字符串变量的,但是有字符数组。而且标准C带有的标准库函数:string.h中包含了大量的字符串操作函数,当然如果必要的话,你也可以…

零基础学习Python需要注意的几个点,Python培训机构排名
俗话说的好万事开头难,不管你做任何事情,开头的确很较难的,学Python编程也是如此,因此刚开始学Python编程的同学们,就要多借鉴过来人的经验,少走弯路,本文小编就为大家分享几个Python编程小白初…

PAT(甲级)2018年冬季考试 7-4 Heap Paths(非递归与递归解法)
非递归解法 1. 前置知识:完全二叉树的属性 1.1 从1开始存储,子节点的下标除以二得到的是父节点的下标 1.2 数组的存放顺序刚好是层序遍历顺序 1.3 从1开始存储,节点的下标i和结点总数n如果满足 i*2>n说明该结点是叶子结点 2. 思路&am…

Request Connection: Remote Server @ 192.229.145.200:80
录制Loadrunner脚本时,提示:Request Connection: Remote Server 192.229.145.200:80 NOT INTERCEPTED!(REASON: User requested to IGNORE connection);解决方法:1. 打开IE里的Internet选项,单击连接选项卡。单击最…

抽象工厂与工厂模式例子
NativeFactory。java package com;//定义 人有杀日本人 和 杀美国人两个方法interface NativePerson{ public void killAmeria(); public void killJapan();}//中国人实现了人的接口 class NativeChinese implements NativePerson{ //中国人杀美国人 public void killAmeria() …

《疯狂Java讲义》学习笔记(十)异常处理
2019独角兽企业重金招聘Python工程师标准>>> 0、Java的异常体系 1、异常概述 异常机制已经成为判断一门编程语言是否成熟的标准,目前主流的编程语言都提供了成熟的异常机制,增加了异常处理机制后的程序有更好的容错性,更加健壮 Ja…

PAT(甲级)2018年冬季考试 7-1 Google Recruitment
1. 本题是 substrsscanf的绝佳实践。 2. 判断素数使用i*i<n与i<(int)sqrt(0.1*x)的区别是前者可能再n接近10的9次方时溢出,但本题不会。 3. 尽管把字符串转变成了整数,但输出时仍旧输出字符串,如果选择打印整数,会遇到%0K…

MySQL 的“root”用户修改密码
MySQL 的“root”用户默认状态是没有密码的,所以在 PHP 中您可以使用 mysql_connect("localhost","root","") 来连接 MySQL 服务器;如果您想为 MySQL 中的“root”用户设置密码,请在控制台中使用“mysqladmin”…

游戏AI之初步介绍(0)
目录 游戏AI是什么?游戏AI和理论AI智能的假象(更新)游戏AI和机器学习介绍一些游戏AI4X游戏AI《求生之路》系列角色扮演/沙盒游戏中的NPC游戏AI 需要学些什么?自治智能体群体智能感知状态机(重要)行为树&…

Google Adsense实用防踢技巧总结
我们都知道,对个人草根站长来说,Google AdSense是网站收入的主要来源之一,我在这里介绍一些常用的技巧。 希望通过这些技巧能够增加大家的Google AdSense收入,并防止自己的帐号被删除。大家喜欢的话就顶下吧! 广告的位…

PAT(甲级)2018年冬季考试 7-3 Vertex Coloring
1. 起先我的思路是,对于每一种方案,把相同颜色的下标放到一个集合,对于每一个集合判断里面的元素互相之间是否有着邻接关系。有一个用例超时,20/25。 2. 转变思路,对于每一种方案,遍历邻接关系,…
蚂蚁金服×西安银行 | 西安银行手机银行App的智能升级之路
小蚂蚁说:当前,数字化信号已经逐渐深入到社会的每个角落,影响着用户的心智和行为,来到数字化时代门口的银行,需要注意到数字化信号。西安银行通过引入蚂蚁金服移动开发平台mPaaS,对手机银行进行架构升级&am…

(四十七)Quartz2D引擎初步
Quartz2D是跨平台的,同时支持iOS与Mac。 支持圆型裁剪,可以实现圆形头像等功能,也支持手势解锁、折线图等的制作。 对于复杂的UI界面,还可以通过Quartz2D将控件内部的结构画出来,可用于自定义控件。 实际上iOS大部分控…

PAT(甲级)2018年冬季考试 7-2 Decode Registration Card of PAT
目录 体会 代码(非满分) 改进 AC代码 体会 这题主要是考察对STL中string,map,vector的应用以及自定义sort()应用。 类型1和2的处理很容易。 类型3要求对于指定date,按照每个考场进行分类,记录不同考场的人数,按照人数非升序ÿ…

DOS、Mac 和 Unix 文件格式+ UltraEdit使用
文件格式 区分DOS、Mac 和 Unix分别对应三种系统从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种文件模式 区分ASCII模式和Binary模式 通常由系统决定,大多数Linux/UNIX系统只有两种模式:文本模式和二进制模式。文本传输器使用…

灰度图像--图像分割 Scharr算子
学习DIP第46天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan ,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发: https://github.com/Tony-Tan/DIPpro 更多图像处理机器学习…

FileUpload生成图片水印,文字水印(转载)
/** <summary>/// 生成缩略图/// </summary>/// <param name"originalImagePath">源图路径(物理路径)</param>/// <param name"thumbnailPath">缩略图路径(物理路径)</para…

1151 LCA in a Binary Tree (含求LCA的通法)
目录 解法一思路 结果 解法一改进 解法一改进结果 解法二思路 解法一代码 解法一改进代码 解法二代码(AC) 解法一思路 1. 根据先序和中序建树 2. 对树进行深度优先遍历,找到每一个结点的父节点(注意:由于值的范围是int,直接用可…

cf 414B Mashmokh and ACM 动态规划
题目链接:http://codeforces.com/problemset/problem/414/B dp[i][j]表示长度为i、最后一个数字为j的合法序列总数 dp[1][1...2000]都是1 后面用dp[i-1][j] 去更新 dp[i][j*t] (1 < j*t < 2000) 即用因子去更新它的倍数 表面上看是2000^3的复杂度会爆 其实不用…

解决:angularjs radio默认选中失效问题
添加ng-model后checked"checked"失效,可见angularjs也不好,会失效html标准属性解决:添加ng-checked"1"<input type"radio" ng-model"sel_course" value"1" ng-checked"1" /…

在ireport报错 报 jdk5找不到的解决办法
在ireport安装目录下, etc目录下有ireport.conf, 其中有jkdhome设置, 把前面的#(注释)去掉, 换成自己的jdk目录就行 双引号不要去掉 jdk地址放在双引号之间 比如 改成 jdkhome"G:/ACD/jdk1.5.0&quo…

如何通过中序和层序序列建立二叉树
有这样一棵二叉树 根据节点个数 9 层序遍历结果 15 23 8 16 2 32 28 7 11 中序遍历结果 16 23 7 32 11 2 28 15 8 预期先序输出 15 23 16 2 32 7 11 28 8 运行结果 这个过程和建立二叉查找树(BST)的过程是非常相像的,将laSq[laIndex]插入到根为root的子树中&a…

BZOJ 3573 米特运输
Description 米特是D星球上一种非常神秘的物质,蕴含着巨大的能量。在以米特为主要能源的D星上,这种米特能源的运输和储存一直是一个大问题。 D星上有N个城市,我们将其顺序编号为1到N,1号城市为首都。这N个城市由N-1条单向高速通…

[学习笔记]最小割之最小点权覆盖最大点权独立集
最小点权覆盖 给出一个二分图,每个点有一个非负点权要求选出一些点构成一个覆盖,问点权最小是多少 建模: S到左部点,容量为点权 右部点到T,容量为点权 左部点到右部点的边,容量inf 求最小割即可。 证明&…