前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Get-WinEvent和Get-EventLog的区别及效率

Get-WinEvent和Get-EventLog的区别及效率

原创
作者头像
雷龙
修改2021-09-26 19:43:16
2.8K0
修改2021-09-26 19:43:16
举报
文章被收录于专栏:技术交流专栏

Windows事件日志查看命令通常有2种:Get-WinEvent和Get-EventLog,那么二者之间的区别是什么?应用场景又是什么呢?

一、区别与联系

联系就是二者都可以处理Windows事件日志,并且在本地执行时随便使用哪个命令都不影响输出结果内容,这里主要讨论区别:

1. Get-EventLog 仅限于所谓的“传统事件日志”,即:

Application

Security

System

HardwareEvents

Internet Explore

Key Management Service

Windows PowerShell;

而Get-WinEvent则可以查询上百种日志,其中包括更加详细的“Applications and Services Logs”。Get-WinEvent是从Windows Vista才开始引入的,比Get-EventLog晚很多;

标红色序号的7个即为Get-EventLog可以查看的日志
标红色序号的7个即为Get-EventLog可以查看的日志

通过下图命令可以看出,Get-EventLog可以查看7个日志文件;而Get-WinEvent则可以查看406个日志文件。

2. Get-EventLog只能处理Online日志,不能处理archived(offline)日志,会出现提示无法访问;而Get-WinEvent则没问题,即:Get-WinEvent既支持.evt/.evtx,又支持etl格式日志;

3. Get-EventLog当在本地计算机上工作时,可能不存在问题,但当跨网络连接时(即批量远程管理多台机器事件日志时),效率会大大降低,然而Get-WinEvent则效率会高很多。

4. 当查询语句中带有Date时,Get-WinEvent的效率会大大降低,所以,建议优先考虑Get-Eventlog。

二、执行效率对比

这里我简单写了如下PowerShell脚本,用来测试Get-EventLog和Get-WinEvent加筛选条件下的执行效率。

代码语言:javascript
复制
#########Get-EventLog和Get-WinEvent执行效率测试#################
#########################Get-EventLog###########################‎
$LogName = "Security"
$StartDate = (get-date).AddDays(-1)
$hashquery = @{logname=$LogName; StartTime=$StartDate}
Write-Host -ForegroundColor Green "测试Get-EventLog,常规过滤(条件:Eventid=4625、近1天)"
(Measure-Command -Expression {Get-EventLog -LogName $Logname -After $StartDate -InstanceId 4625}).TotalSeconds

#########################Get-WinEvent###########################‎
##方法1:
Write-Host -ForegroundColor Green "测试Get-WinEvent,使用where-object过滤(条件:Eventid=4625、近1天)"
(Measure-Command -Expression {Get-WinEvent -LogName $LogName | Where-Object { $_.TimeCreated -ge $StartDate -and $_.ID -eq "4625" }}).TotalSeconds
##方法2:
Write-Host -ForegroundColor Green "测试Get-WinEvent,使用HashTable过滤(条件:Eventid=4625、近1天)"
(Measure-Command -Expression {Get-WinEvent -FilterHashTable $hashquery}).TotalSeconds
##方法3:
Write-Host -ForegroundColor Green "测试Get-WinEvent,使用Xpath过滤(条件:Eventid=4625、近1天)"
$StartDate = (Get-Date).AddDays(-1).ToString("yyyy-MM-dd'T'HH:mm:ss'Z'")
(Measure-Command -Expression {Get-WinEvent -LogName Security -FilterXpath "*[System[(EventID=4625) and TimeCreated[@SystemTime>='$StartDate']]]"}).TotalSeconds
##方法4:
Write-Host -ForegroundColor Green "测试Get-WinEvent,使用XML过滤(条件:Eventid=4625、近1天)"
#Using the FilterXML parameter:
$XMLFilter = @'
<QueryList>
  <Query Id="0" Path="Security">
    <Select Path="Security">*[System[(EventID=4625) and TimeCreated[timediff(@SystemTime) &lt;= 86400000]]]</Select>
  </Query>
</QueryList>
'@
[array] $Events = @()
(Measure-Command -Expression {$Events += Get-WinEvent -FilterXml $XMLfilter }).TotalSeconds
##方法5:
Write-Host -ForegroundColor Green "测试Get-WinEvent,使用XML过滤(条件:Eventid=4625、近1天、关键词审核失败)"
#Using the FilterXML parameter:
$XMLFilter = @'
<QueryList>
  <Query Id="0" Path="Security">
    <Select Path="Security">*[System[band(Keywords,4503599627370496) and (EventID=4625) and TimeCreated[timediff(@SystemTime) &lt;= 86400000]]]</Select>
  </Query>
</QueryList>
'@
[array] $Events = @()
(Measure-Command -Expression {$Events += Get-WinEvent -FilterXml $XMLfilter }).TotalSeconds

测试结果如下图所示:

1. 测试Get-EventLog,常规过滤(条件:最近1天内产生的Eventid=4625事件日志),耗时:4.53秒;

2. 测试Get-WinEvent,使用where-object过滤(条件:最近1天内产生的Eventid=4625事件日志),耗时:710.76秒;

3. 测试Get-WinEvent,使用HashTable过滤(条件:最近1天内产生的Eventid=4625事件日志),耗时:268.76秒;

4. 测试Get-WinEvent,使用Xpath过滤(条件:最近1天内产生的Eventid=4625事件日志),耗时:231.09秒;

5. 测试Get-WinEvent,使用XML过滤(条件:最近1天内产生的Eventid=4625事件日志),耗时:269.49秒;

6. 测试Get-WinEvent,使用XML过滤(条件:最近1天内产生的关键词为“审核失败”且Eventid=4625事件日志),耗时:263.30秒。

通过测试结果可以看出:---注意,测试环境不同,结果难免略有差异。

1. 在本地计算机上,Get-EventLog的执行效率要比Get-WinEvent的执行效率高非常多,应用非常广泛; 2. Get-WinEvent中XPath过滤效率会比XML和HashTable效率高;但实际应用中,Xpath案例和资料较少,反而HashTable资料较多,但庆幸的是可以通过Windows图形界面简单勾选,自动生成XML和XPath筛选内容,无需手动编写代码。

演示如何通过简单勾选,自动生成XML和XPath筛选内容:

如下图,切换到XML选项卡,即可看到红色框中的为XML筛内容;绿色下划线部分则为XPath筛内容。

注意,XPath内容需要调整下 TimeCreated的格式。

三、汇总:

Get-WinEvent:功能强大,但运用略显复杂,更适合跨网络批量日志处理;

Get-EvenLog: 简单易用,但仅能管理传统日志,更适合本地日志处理。

总之,各有利弊,跨网络优先Get-WinEvent,本地优先Get-EventLog,要查看更细致的应用和服务日志,只能选择Get-WinEvent。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、区别与联系
  • 二、执行效率对比
  • 三、汇总:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档