上一次我们对Windows注册表进行了简单的管理操作,重在理解"项"和"值"的概念。练习了新建、修改、删除、查看注册表项、值的命令,此外,借助于.NET框架,我们同样可以远程管理注册表,前提是远程计算机上的"Remote Registry"服务要启动。本次我们来重点关注一下Windows日志,Windows日志记录了各种软件、硬件发生的变化,当计算机出现问题时,方便管理员快速排错、恢复计算机等。尤其在一些软件安装失败时,根据日志中的EventID和详细信息能够帮助我们查找解决方案。
本系列所有脚本均在Windows Server 2008 R2 DataCenter (PowerShell 2.0) + PowerGUI Script Editor Free Edition x64中测试通过。
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
运行结果:
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
运行结果:
使用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,功能也很强大,后面我们专门来测试一下这个工具。