PowerShell 2.0 实践(六)管理Windows日志
2010-08-24 21:40
459 查看
上一次我们对Windows注册表进行了简单的管理操作,重在理解"项"和"值"的概念。练习了新建、修改、删除、查看注册表项、值的命令,此外,借助于.NET框架,我们同样可以远程管理注册表,前提是远程计算机上的"Remote Registry"服务要启动。本次我们来重点关注一下Windows日志,Windows日志记录了各种软件、硬件发生的变化,当计算机出现问题时,方便管理员快速排错、恢复计算机等。尤其在一些软件安装失败时,根据日志中的EventID和详细信息能够帮助我们查找解决方案。
测试脚本下载
本系列所有脚本均在Windows
Server 2008 R2 DataCenter (PowerShell 2.0) + PowerGUI Script Editor Free
Edition x64中测试通过。
Windows日志按严重程度区分有5种类型:
Error
Warning
Information
SuccessAudit
FailureAudit
从名称就可以看出其相应含义,使用EventLogEntryType枚举可以查看这些类型:
[enum]::GetNames([System.Diagnostics.EventLogEntryType])
运行结果:
在【开始】à【运行】输入:eventvwr调出事件查看器,这里以Windows Server 2008 R2上的事件查看器为例,可以看到Windows内置的事件分类:
Windows按照程序、安全、安装程序、系统等对日志进行了分类,对程序和服务还进行了更细粒度的分类,方便管理员查看特定应用程序的日志。当然,我们可以添加自定义的分类,稍后将练习这种操作。
2、PowerShell 2.0中关于日志操作的命令有如下一些:
Get-EventLog
Get-WinEvent
New-EventLog
Clear-EventLog
Remove-EventLog
Show-EventLog
Write-EventLog
Limit-EventLog
查看日志分类列表。
Get-EventLog
–List
运行结果:
这里你可能会奇怪,怎么返回的分类这么少呢?刚才可是看到了很多的分类啊,这是因为从Windows Vista/2008开始,Windows使用了一种新的日志格式:.evtx,代替了之前的.evt,而Get-EventLog命令只能查看之前的日志格式。后面会看到如何查看.evtx格式的日志。
Get-EventLog提供了查看远程计算机上日志的能力,类似的,只需要添加-ComputerName参数即可:
PS:今天的远程测试有点杯具,本机连接VMWare中的虚拟机时老是有问题,一会提示RPC服务器不可用,一会认证失败,于是用两个虚拟机进行测试:
Get-EventLog -ComputerName 192.168.220.134 –List
运行结果:
在Windows Vista/2008/7/2008R2中,可以使用Get-WinEvent查看.evtx格式的日志。
Get-WinEvent
-ListLog
* | Select LogName,RecordCount
运行结果:
远程调用时提示RPC服务器不可用,不知是哪里配置错了:
查看指定类别的最新日志。
Get-EventLog
-LogName
"Windows PowerShell"
-Newest 10 | Format-Table Index,Source,Message –AutoSize
运行结果:
远程调用结果:
对于.evtx格式,这样使用:
Get-WinEvent
-LogName
"Windows PowerShell"
-MaxEvents 10 | Format-Table EventID,Source,Message –AutoSize
运行结果:
.evtx格式远程调用依然出错:
6、筛选日志信息,Windows日志存储的内容非常多,如果不进行一些筛选,管理员难以获取有价值的信息。
如:筛选日志信息中包含【vmware】的日志,
Get-EventLog
-LogName
System | Where {$_.Message -like
"*vmware*"}
运行结果:
在【Windows PowerShell】类别中查询EventID小于500的日志信息:
Get-EventLog
-LogName
"Windows PowerShell" | Where {$_.EventID -lt 500}
运行结果:
使用Format-List可以查看详细信息:
Get-EventLog
-LogName
"Windows PowerShell" | Where {$_.EventID -lt 500} | Format-List
运行结果:
查询自昨天这个时候到今天这个时候的日志,并按照EventID排序、分组:
Get-EventLog
-LogName
"Windows PowerShell" | Where {$_.TimeWritten -gt ((Get-Date).AddDays(-1))} | Sort
EventID | Group
EventID
运行结果:
使用Get-WinEvent命令还可以使用一些高级命令来进行筛选。
使用Hashtable进行筛选,注意,只能在Win7/2008 R2上使用:
Get-WinEvent
-FilterHashtable @{LogName="Windows PowerShell";ProviderName="PowerShell"} | Where {$_.TimeCreated -gt (Get-Date).AddDays(-1)}
运行结果:
有效的键值对如下:
-- LogName=<String[]>
-- ProviderName=<String[]>
-- Path=<String[]>
-- Keywords=<Long[]>
-- ID=<Int32[]>
-- Level=<Int32[]>
-- StartTime=<DateTime>
-- EndTime=<DataTime>
-- UserID=<SID>
-- Data=<String[]>
-- *=<String[]>
通过XML来筛选。
在事件查看器中可以自定义筛选规则:
在Filter中填写项筛选的规则:
在XML选项卡中可以看到自动生成的代码:
将这段XML复制出来,在PowerShell中通过-FilterXml查询:
$xml
=
@'
<QueryList>
<Query Id="0" Path="Windows PowerShell">
<Select Path="Windows PowerShell">*[System[(Level=3) and TimeCreated[timediff(@SystemTime) <= 43200000]]]</Select>
</Query>
</QueryList>
'@
Get-WinEvent
-FilterXml
$xml
运行结果:
因为EventLog使用了内置的XML来存储,还可以使用XPath表达式进行筛选:
Get-WinEvent
-LogName
"System"
-FilterXPath
"*[System[EventID > 1000]]"
运行结果:
导入、导出日志。
Get-WinEvent
-ListLog
* | Export-Clixml
-Path
F:\PSTest\EventLog.clixml
-Force
Import-Clixml
-Path
F:\PSTest\EventLog.clixml | Group
Source
运行结果:
Clixml要优于csv格式,它将对象序列化为xml格式,方便后续的查询。
使用记事本来查看其存储结构:
读写日志。
创建一个类别为Script,来源为PSScript的日志类别:
New-EventLog
-LogName
Script
-Source
PSScript
运行结果:
向刚刚创建的这个类别中写入一条日志:
Write-EventLog
-LogName
Script
-Source
PSScript
-Message
"Test"
-EntryType
"Information"
-EventId 1
运行结果:
限制日志的容量,避免单个日志文件太大:
Limit-EventLog
-LogName
Script
-MaximumSize 2MB
运行结果:
调用Event Viewer查看日志:
Show-EventLog
运行后将打开事件查看器。
清空、删除日志(慎用):
Clear-EventLog
-LogName
Script
Remove-EventLog
-LogName
Script
小结:
本次我们练习了WIdnows系统日志的相关操作,重在设置不同的筛选条件来查询我们感兴趣的日志,熟练掌握这些命令后,将大大提高解决问题的效率。Get-WInEvent提供了一些高级的删选命令,如Hashtable、XPath、XML等,可酌情使用。类似的WIdnows日志同样允许远程操作,但是这次我遇到了很多问题,主要分为两类:RPC服务器不可用、无访问权限。关于PowerShell的远程管理是个很大的话题,后续篇章我们再讨论,现在我也在找原因。Windows自带了一个日志管理的命令行工具:wevtutil.exe,功能也很强大,后面我们专门来测试一下这个工具。
测试脚本下载
本系列所有脚本均在Windows
Server 2008 R2 DataCenter (PowerShell 2.0) + PowerGUI Script Editor Free
Edition x64中测试通过。
Windows日志按严重程度区分有5种类型:
Error
Warning
Information
SuccessAudit
FailureAudit
从名称就可以看出其相应含义,使用EventLogEntryType枚举可以查看这些类型:
[enum]::GetNames([System.Diagnostics.EventLogEntryType])
运行结果:
在【开始】à【运行】输入:eventvwr调出事件查看器,这里以Windows Server 2008 R2上的事件查看器为例,可以看到Windows内置的事件分类:
Windows按照程序、安全、安装程序、系统等对日志进行了分类,对程序和服务还进行了更细粒度的分类,方便管理员查看特定应用程序的日志。当然,我们可以添加自定义的分类,稍后将练习这种操作。
2、PowerShell 2.0中关于日志操作的命令有如下一些:
Get-EventLog
Get-WinEvent
New-EventLog
Clear-EventLog
Remove-EventLog
Show-EventLog
Write-EventLog
Limit-EventLog
查看日志分类列表。
Get-EventLog
–List
运行结果:
这里你可能会奇怪,怎么返回的分类这么少呢?刚才可是看到了很多的分类啊,这是因为从Windows Vista/2008开始,Windows使用了一种新的日志格式:.evtx,代替了之前的.evt,而Get-EventLog命令只能查看之前的日志格式。后面会看到如何查看.evtx格式的日志。
Get-EventLog提供了查看远程计算机上日志的能力,类似的,只需要添加-ComputerName参数即可:
PS:今天的远程测试有点杯具,本机连接VMWare中的虚拟机时老是有问题,一会提示RPC服务器不可用,一会认证失败,于是用两个虚拟机进行测试:
操作系统 | IP | 作用 |
Windows HPC Server 2008 R2 | 192.168.220.133 | 模拟本地计算机 |
Hyper-V 2008 R2 | 192.168.220.134 | 模拟远程计算机 |
Get-EventLog -ComputerName 192.168.220.134 –List
运行结果:
在Windows Vista/2008/7/2008R2中,可以使用Get-WinEvent查看.evtx格式的日志。
Get-WinEvent
-ListLog
* | Select LogName,RecordCount
运行结果:
远程调用时提示RPC服务器不可用,不知是哪里配置错了:
查看指定类别的最新日志。
Get-EventLog
-LogName
"Windows PowerShell"
-Newest 10 | Format-Table Index,Source,Message –AutoSize
运行结果:
远程调用结果:
对于.evtx格式,这样使用:
Get-WinEvent
-LogName
"Windows PowerShell"
-MaxEvents 10 | Format-Table EventID,Source,Message –AutoSize
运行结果:
.evtx格式远程调用依然出错:
6、筛选日志信息,Windows日志存储的内容非常多,如果不进行一些筛选,管理员难以获取有价值的信息。
如:筛选日志信息中包含【vmware】的日志,
Get-EventLog
-LogName
System | Where {$_.Message -like
"*vmware*"}
运行结果:
在【Windows PowerShell】类别中查询EventID小于500的日志信息:
Get-EventLog
-LogName
"Windows PowerShell" | Where {$_.EventID -lt 500}
运行结果:
使用Format-List可以查看详细信息:
Get-EventLog
-LogName
"Windows PowerShell" | Where {$_.EventID -lt 500} | Format-List
运行结果:
查询自昨天这个时候到今天这个时候的日志,并按照EventID排序、分组:
Get-EventLog
-LogName
"Windows PowerShell" | Where {$_.TimeWritten -gt ((Get-Date).AddDays(-1))} | Sort
EventID | Group
EventID
运行结果:
使用Get-WinEvent命令还可以使用一些高级命令来进行筛选。
使用Hashtable进行筛选,注意,只能在Win7/2008 R2上使用:
Get-WinEvent
-FilterHashtable @{LogName="Windows PowerShell";ProviderName="PowerShell"} | Where {$_.TimeCreated -gt (Get-Date).AddDays(-1)}
运行结果:
有效的键值对如下:
-- LogName=<String[]>
-- ProviderName=<String[]>
-- Path=<String[]>
-- Keywords=<Long[]>
-- ID=<Int32[]>
-- Level=<Int32[]>
-- StartTime=<DateTime>
-- EndTime=<DataTime>
-- UserID=<SID>
-- Data=<String[]>
-- *=<String[]>
通过XML来筛选。
在事件查看器中可以自定义筛选规则:
在Filter中填写项筛选的规则:
在XML选项卡中可以看到自动生成的代码:
将这段XML复制出来,在PowerShell中通过-FilterXml查询:
$xml
=
@'
<QueryList>
<Query Id="0" Path="Windows PowerShell">
<Select Path="Windows PowerShell">*[System[(Level=3) and TimeCreated[timediff(@SystemTime) <= 43200000]]]</Select>
</Query>
</QueryList>
'@
Get-WinEvent
-FilterXml
$xml
运行结果:
因为EventLog使用了内置的XML来存储,还可以使用XPath表达式进行筛选:
Get-WinEvent
-LogName
"System"
-FilterXPath
"*[System[EventID > 1000]]"
运行结果:
导入、导出日志。
Get-WinEvent
-ListLog
* | Export-Clixml
-Path
F:\PSTest\EventLog.clixml
-Force
Import-Clixml
-Path
F:\PSTest\EventLog.clixml | Group
Source
运行结果:
Clixml要优于csv格式,它将对象序列化为xml格式,方便后续的查询。
使用记事本来查看其存储结构:
读写日志。
创建一个类别为Script,来源为PSScript的日志类别:
New-EventLog
-LogName
Script
-Source
PSScript
运行结果:
向刚刚创建的这个类别中写入一条日志:
Write-EventLog
-LogName
Script
-Source
PSScript
-Message
"Test"
-EntryType
"Information"
-EventId 1
运行结果:
限制日志的容量,避免单个日志文件太大:
Limit-EventLog
-LogName
Script
-MaximumSize 2MB
运行结果:
调用Event Viewer查看日志:
Show-EventLog
运行后将打开事件查看器。
清空、删除日志(慎用):
Clear-EventLog
-LogName
Script
Remove-EventLog
-LogName
Script
小结:
本次我们练习了WIdnows系统日志的相关操作,重在设置不同的筛选条件来查询我们感兴趣的日志,熟练掌握这些命令后,将大大提高解决问题的效率。Get-WInEvent提供了一些高级的删选命令,如Hashtable、XPath、XML等,可酌情使用。类似的WIdnows日志同样允许远程操作,但是这次我遇到了很多问题,主要分为两类:RPC服务器不可用、无访问权限。关于PowerShell的远程管理是个很大的话题,后续篇章我们再讨论,现在我也在找原因。Windows自带了一个日志管理的命令行工具:wevtutil.exe,功能也很强大,后面我们专门来测试一下这个工具。
相关文章推荐
- PowerShell 2.0 实践(六)管理Windows日志
- PowerShell 2.0 实践(七)管理活动目录(上)
- PowerShell 2.0 实践(九)管理活动目录(下)
- PowerShell 2.0 实践(八)管理活动目录(中)
- PowerShell 2.0 实践(四)管理Windows进程
- PowerShell 2.0 实践(五)管理Windows注册表
- PowerShell 2.0 实践(四)管理Windows进程
- PowerShell 2.0 实践(七)管理活动目录(上)
- PowerShell 2.0 实践(五)管理Windows注册表
- PowerShell 2.0 实践(十一)管理 TFS 2010 (2)
- PowerShell 2.0 实践(十二)管理 SQL Server 2008 R2(1)
- PowerShell 2.0 实践(九)管理活动目录(下)
- PowerShell 2.0 实践(十四)管理 SQL Server 2008 R2(2)
- PowerShell 2.0 实践(八)管理活动目录(中)
- PowerShell 2.0 实践(十一)管理 TFS 2010 (2)
- PowerShell 2.0实践(十)管理TFS 2010 (1)
- PowerShell 2.0 实践(十三)管理 TFS 2010(3)
- PowerShell 2.0 实践(十二)管理 SQL Server 2008 R2(1)
- PowerShell 2.0 实践(十三)管理 TFS 2010(3)
- PowerShell 2.0 实践(十四)管理 SQL Server 2008 R2(2)