PowerShell 2.0 实践(六)管理Windows日志

上一次我们对Windows注册表进行了简单的管理操作,重在理解"项"和"值"的概念。练习了新建、修改、删除、查看注册表项、值的命令,此外,借助于.NET框架,我们同样可以远程管理注册表,前提是远程计算机上的"Remote Registry"服务要启动。本次我们来重点关注一下Windows日志,Windows日志记录了各种软件、硬件发生的变化,当计算机出现问题时,方便管理员快速排错、恢复计算机等。尤其在一些软件安装失败时,根据日志中的EventID和详细信息能够帮助我们查找解决方案。

 

测试脚本下载

本系列所有脚本均在Windows Server 2008 R2 DataCenter (PowerShell 2.0) + PowerGUI Script Editor Free Edition x64中测试通过。 

 

  1. Windows日志按严重程度区分有5种类型:

Error

Warning

Information

SuccessAudit

FailureAudit

从名称就可以看出其相应含义,使用EventLogEntryType枚举可以查看这些类型:

[enum]::GetNames([System.Diagnostics.EventLogEntryType])

运行结果:

PowerShell 2.0 实践(六)管理Windows日志_第1张图片

在【开始】à【运行】输入:eventvwr调出事件查看器,这里以Windows Server 2008 R2上的事件查看器为例,可以看到Windows内置的事件分类:

PowerShell 2.0 实践(六)管理Windows日志_第2张图片

Windows按照程序、安全、安装程序、系统等对日志进行了分类,对程序和服务还进行了更细粒度的分类,方便管理员查看特定应用程序的日志。当然,我们可以添加自定义的分类,稍后将练习这种操作。

 

2、PowerShell 2.0中关于日志操作的命令有如下一些:

Get-EventLog

Get-WinEvent

New-EventLog

Clear-EventLog

Remove-EventLog

Show-EventLog

Write-EventLog

Limit-EventLog

 

  1. 查看日志分类列表。

Get-EventLog –List

运行结果:

PowerShell 2.0 实践(六)管理Windows日志_第3张图片

这里你可能会奇怪,怎么返回的分类这么少呢?刚才可是看到了很多的分类啊,这是因为从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

模拟远程计算机

 

PowerShell 2.0 实践(六)管理Windows日志_第4张图片

Get-EventLog -ComputerName 192.168.220.134 –List

运行结果:

PowerShell 2.0 实践(六)管理Windows日志_第5张图片

 

  1. 在Windows Vista/2008/7/2008R2中,可以使用Get-WinEvent查看.evtx格式的日志。

Get-WinEvent -ListLog * | Select LogName,RecordCount

运行结果:

PowerShell 2.0 实践(六)管理Windows日志_第6张图片

远程调用时提示RPC服务器不可用,不知是哪里配置错了:

PowerShell 2.0 实践(六)管理Windows日志_第7张图片

 

  1. 查看指定类别的最新日志。

Get-EventLog -LogName "Windows PowerShell" -Newest 10 | Format-Table Index,Source,Message –AutoSize

运行结果:

PowerShell 2.0 实践(六)管理Windows日志_第8张图片

远程调用结果:

PowerShell 2.0 实践(六)管理Windows日志_第9张图片

 

对于.evtx格式,这样使用:

Get-WinEvent -LogName "Windows PowerShell" -MaxEvents 10 | Format-Table EventID,Source,Message –AutoSize

运行结果:

PowerShell 2.0 实践(六)管理Windows日志_第10张图片

.evtx格式远程调用依然出错:

PowerShell 2.0 实践(六)管理Windows日志_第11张图片

 

6、筛选日志信息,Windows日志存储的内容非常多,如果不进行一些筛选,管理员难以获取有价值的信息。

如:筛选日志信息中包含【vmware】的日志,

Get-EventLog -LogName System | Where {$_.Message -like "*vmware*"}

运行结果:

PowerShell 2.0 实践(六)管理Windows日志_第12张图片

 

在【Windows PowerShell】类别中查询EventID小于500的日志信息:

Get-EventLog -LogName "Windows PowerShell" | Where {$_.EventID -lt 500}

运行结果:

PowerShell 2.0 实践(六)管理Windows日志_第13张图片

 

使用Format-List可以查看详细信息:

Get-EventLog -LogName "Windows PowerShell" | Where {$_.EventID -lt 500} | Format-List

运行结果:

PowerShell 2.0 实践(六)管理Windows日志_第14张图片

 

查询自昨天这个时候到今天这个时候的日志,并按照EventID排序、分组:

Get-EventLog -LogName "Windows PowerShell" | Where {$_.TimeWritten -gt ((Get-Date).AddDays(-1))} | Sort EventID | Group EventID

运行结果:

 

  1. 使用Get-WinEvent命令还可以使用一些高级命令来进行筛选。

使用Hashtable进行筛选,注意,只能在Win7/2008 R2上使用:

Get-WinEvent -FilterHashtable @{LogName="Windows PowerShell";ProviderName="PowerShell"} | Where {$_.TimeCreated -gt (Get-Date).AddDays(-1)}

运行结果:

PowerShell 2.0 实践(六)管理Windows日志_第15张图片

有效的键值对如下:

-- LogName=<String[]>

-- ProviderName=<String[]>

-- Path=<String[]>

-- Keywords=<Long[]>

-- ID=<Int32[]>

-- Level=<Int32[]>

-- StartTime=<DateTime>

-- EndTime=<DataTime>

-- UserID=<SID>

-- Data=<String[]>

-- *=<String[]>

 

通过XML来筛选。

在事件查看器中可以自定义筛选规则:

PowerShell 2.0 实践(六)管理Windows日志_第16张图片

在Filter中填写项筛选的规则:

PowerShell 2.0 实践(六)管理Windows日志_第17张图片

在XML选项卡中可以看到自动生成的代码:

PowerShell 2.0 实践(六)管理Windows日志_第18张图片

将这段XML复制出来,在PowerShell中通过-FilterXml查询:

$xml = @'

<QueryList>

<Query Id="0" Path="Windows PowerShell">

<Select Path="Windows PowerShell">*[System[(Level=3) and TimeCreated[timediff(@SystemTime) &lt;= 43200000]]]</Select>

</Query>

</QueryList>

'@

 

Get-WinEvent -FilterXml $xml

运行结果:

 

因为EventLog使用了内置的XML来存储,还可以使用XPath表达式进行筛选:

Get-WinEvent -LogName "System" -FilterXPath "*[System[EventID > 1000]]"

运行结果:

PowerShell 2.0 实践(六)管理Windows日志_第19张图片

 

  1. 导入、导出日志。

Get-WinEvent -ListLog * | Export-Clixml -Path F:\PSTest\EventLog.clixml -Force

 

Import-Clixml -Path F:\PSTest\EventLog.clixml | Group Source

运行结果:

PowerShell 2.0 实践(六)管理Windows日志_第20张图片

Clixml要优于csv格式,它将对象序列化为xml格式,方便后续的查询。

使用记事本来查看其存储结构:

PowerShell 2.0 实践(六)管理Windows日志_第21张图片

 

  1. 读写日志。

创建一个类别为Script,来源为PSScript的日志类别:

New-EventLog -LogName Script -Source PSScript

运行结果:

PowerShell 2.0 实践(六)管理Windows日志_第22张图片

向刚刚创建的这个类别中写入一条日志:

Write-EventLog -LogName Script -Source PSScript -Message "Test" -EntryType "Information" -EventId 1

运行结果:

PowerShell 2.0 实践(六)管理Windows日志_第23张图片

 

限制日志的容量,避免单个日志文件太大:

Limit-EventLog -LogName Script -MaximumSize 2MB

运行结果:

PowerShell 2.0 实践(六)管理Windows日志_第24张图片

 

调用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)