查看: 588|回复: 2

利用PowerShell提升事件日志管理效率

 关闭 [复制链接]

签到天数: 820 天

连续签到: 1 天

[LV.10]以坛为家III

发表于 2009-7-20 11:42 | 显示全部楼层 |阅读模式
事件日志对于系统管理员的重要性自不待言,而基于图形界面的事件查看器毫无疑问是我们进行日志管理的首选工具,但绝不是最快捷的工具。其实,PowerShell提供了一种更简单的方式,利用它我们不仅可访问当前系统的事件日志,而且还可对数据进行排序、格式化等等。管理员如果能够掌握利用PowerShell访问系统日志的技巧,一定会大大提升工作效率。  PowerShell当前最高版本是2.0,不过Windows XP和Windows Vista并没有集成该工具,大家可访问微软官方网站http://www.microsoft.com/downloads/details.aspx?FamilyID=60deac2b-975b-41e6-9fa0-c2fd6aa6bc89&DisplayLang=en下载安装。不过,在安装PowerShell前需要Microsoft .NET Framework,大家可访问http://www.microsoft.com/downloads/details.aspx?FamilyID=333325fd-ae52-4e35-b531-508d977d32a6&DisplayLang=zh-cn下载并安装。Windows Server 2008中已经集成了PowerShell,不过需要手动添加,Windows 7中已经集成了PowerShell V2.0。

下面笔者就以Windows Server 2008为例,谈谈如何使用PowerShell访问事件日志。

  1、初识Get-EventLog
  在PowerShell中用来访问系统日志的命令为Get-EventLog,这个命令后面可带很多参数以实现不同的任务,大家可在PowerShell命令行中执行“help Get-EventLog”获取其参数,执行“help get-eventlog -detailed”和获得更多详细的信息、示例和Geg-EventLog的帮助信息。其实不仅仅如此,我们可以结合通道符号“|”,以及系统对象、方法来构造复杂的语句,进行显示日志的筛选、排序、格式化等等。另外,因为Get-EventLog是基于PowerShell命令行的,因此运行它所耗费的系统资源远远小于基于图形界面的事件查看器。(图1)


                               
登录/注册后可看大图

2、简单查看事件日志
  执行Get-EventLog命令,其标准输出内容提供了事件的所有关键信息。在PowerShell命令行中输入Get-EventLog,然后在其后面输入要查看的事件日志的名称,比如Application(应用程序)、system(系统)、security(安全)等。比如我们执行“Get-EventLog security”就会PowerShell窗口中详细列出所有的安全日志。就这样,在事件查看器中提供的所有Windows日志或应用程序和服务日志等都可以在命令行下查看。其实,我们刚才在给Get-EventLog后面添加日志名称时,实际上是使用了“-logname”参数即Get-EventLog -logname security。通常情况下,我们可以省略该参数。需要说明的是,如果日志名称包含有空格,则必须用引号将名称括起来,例如Get-EventLog \"DNS Server\"。此外,如果直接执行“Get-EventLog security”会显示所有的安全事件日志,不利用查看,我们可在命令后面添加“| more”即“Get-EventLog security | more”以分屏显示。当然,如果要终止命令的执行我们可以按下组合键“Ctrl+c”。(图2)
  
  

                               
登录/注册后可看大图


  Get-EventLog命令可以用于获取事件日志自身的信息,还可以获取存储在日志中的
  事件详细信息,当然我们还可以扩展这个命令返回的信息。需要提一下,Get-EventLog有一个-list参数,指定这个参数即执行“Get-EventLog -list”将会返回本地系统的事件日志列表。(图3)

  

                               
登录/注册后可看大图


3、日志的排序
  默认情况下,当我们执行Get-EventLog(例如“Get-EventLog -logname security”),就会依照事件顺序从新到旧列出所知道事件日志中的所有事件。通常情况下,日志事件是非常多的,往往会显示几屏,这当然不利于我们查看。其实,在实战中我们往往需要显示自己所需的日志(比如最近的日志),这就需要对日志进行排序。排序的策略之一是,指定只显示最新事件的详细信息,例如我们希望看到日志中最新的60或600条信息。这时我们需要用到“-newest”参数,在参数后面跟上相应的数值即可返回规定数量的最新事件。例如我们执行“Get-EventLog system -newest 30”,就会显示最新的30条系统事件。(图4)


                               
登录/注册后可看大图

4、日志的格式化
  直接执行Get-EventLog会分列显示日志的很多属性,诸如Index、Time、Type、Source、EventID、Message。其中这些属性并不都是我们关心或者需要的,为了合理利用日志,我们可将事件按照类型、来源或者事件ID进行分组。在使用类型对事件进行分组时,可以更清楚地区分关键、警告和错误事件。如果按照来源进行分组,则可以更清楚地看到来自特定来源的事件。如果按照事件ID进行分组,则可以更清楚地看到与特定事件相关的所有内容。所以,根据需要对事件进行格式化无疑会方便我们查看,提供工作效率。
  (1)分组格式化
  如果要按照来源、事件ID、事件类型和生产事件对事件进行分组,我们可以这样进行操作。首先,获得要查看的事件并将其保存到变量$e中,命令语句是“$e = Get-EventLog -newest 500 -logname application”。然后,使用group-object cmdlet将保存在$e变量中的事件对象按照指定的属性进行分组。比如,我们按照事件ID进行分组,执行命令“$e | group-object -property eventid”即可。(图5)


                               
登录/注册后可看大图
(2)排序格式化
  我们也可根据特定的属性对事件进行排列,也就是说按照来源、事件ID、事件类型或生成事件对事件进行排列,其操作如下是:首先,获得要查看的事件并将其保存在变量$e中,执行命令“$e = get-eventlog -newest 100 -logname application”。然后,使用sort-object cmdlet对保存在$e变量中的事件对象按照指定的属性进行排列,例如按照事件类型进行排列,执行命令“$e | sort-object -property entrytype”即可。(图6)


                               
登录/注册后可看大图
(3)根据关键词格式化
  有时可能需要在特定的属性中寻找匹配的特定文本。比如,我们只希望返回“错误”事件。为此,可以使用“error”作为关键词搜索事件的EntryType属性。操作方法是:首先,获得要查看的事件将其保存在变量$e中,执行命令“$e = get-eventlog -newest 500 -logname application”。然后,使用where-object cmdlet对保存在变量$e变量中的事件对象的命名属性进行搜索,例如本例中搜索所有“错误”类型事件,执行命令“$e | where-object {$_.EntryType -match \"error\"}”即可。where-object cmdlet使用的搜索算法是不区分大小写的,使用这种方法还可以搜索警告、关键或信息事件。因为where-object会将部分匹配的内容视为有效,因此我们可输入不完整的类型名称进行搜索。下面列举几个例子:
  从结果中搜索匹配类型关键词“warn”的事件
  $e = get-eventlog -newest 500 -logname aplication
  $e | where-object {$_.EntryType -match \"warn\"}
  从结果中搜索匹配来源关键词“.NET”的事件
  $e = get-eventlog -newest 500 -logname aplication
  $e | where-object {$_.Source -match \".NET\"}
  从结果中搜索匹配事件ID关键词“1101”的事件
  $e = get-eventlog -newest 500 -logname aplication
  $e | where-object {$_.EventID -match \"1101\"}
  (图7)


                               
登录/注册后可看大图
5、日志的筛选
  可以说,日志的筛选和上面说的日志格式化比较相似。之所以将其单独列出来,主要是结合实例说说get-eventlog命令结合对象的一些高级应用。
  (1).返回需求的事件日志
  其实我们在使用get-eventlog获取事件信息时,会创建一个System.Diagnostics.EventLog对象,我们可以在P0werSheIl语句中使用这个对象的任何方法和属性。比如,我们可在Where-object子句中使用的一个名为LogDisplayName的属性以返回指定的事件日志信息。执行命令“get-eventlog -list | where {$_.logdisplayname -eq \"security\"}”返回安全日志信息。简单说明一下,这个语句使用了where别名来表示where-object命令,它会对传递过来的值进行循环,之后使用子表达式来指定所需要的结果,这个表达式跟在where 之后,并用大括号括起来。这个子语句以$一字符开始,这是一个系统自带的变量,表示管道中传递过来的值或循环中的当前值。这个子语句中还有一个-eq参数,其含义就是等于的意思即logdisplayname的值必须等于security。
  前面这个例子只获取安全日志信息。不过,你可以把结果传递给Format-List获取更多的信息,执行命令“get-eventlog -list | where {$_.logdisplayname -eq \"security\"} | fl *”。其中命令最后的fl表示format-list,跟在后面的*号表示事件的所有属性信息都会返回到控制台。(图8)

 

                               
登录/注册后可看大图


  (2)获取特定事件日志的属性
  如果要访问某一对象的属性和方法以得到更多信息,使用Get-Member命令。比如执行命令“get-eventlog -list | where {$_.logdisplayname -eq \"security\"} | gm”后,会返回安全日志对象的名称、成员类型及其定义。如果我们知道可用属性的名称后,就可以获取它的值了。例如,执行语句“(get-eventlog -list | where {$_.logdisplayname -eq \"security\"}).overflowaction”就可获得overflowaction的值为OverwriteOlder,即在安全日志满了之后,Windows会覆盖以前的就日志。需要注意的是get-eventlog语句必须用括号扩起来,后面跟一个属性。当然,我们可以将语句保存到一个变量中,然后通过变量调用属性即可。命令语句为:
  $log = get-eventlog -list | where {$_.logdisplayname -eq \"security\"}
  $log.overflowaction
  (图9)

  

                               
登录/注册后可看大图


(3)获取特定时间内的事件日志
  如果我们希望获取特定时间内的日志该怎么做呢?这需要用到system.diagnostics.eventlogentry对象的TimeWritten属性,该属性表示事件发生的确切事件和日期。例如,我们要获取过去的24小时内的安全日志,可通过下面的语句来实现:
  $date = (get-date).adddays(-1)
  get-eventlog security | where {$_.timewritten -gt $date}
  第一行语句定义了$date变量,调用get-date命令获取当前的日期和时间。get-dage对象支持AddDays方法,在本例中AddDays后传入-1天的参数,意味着返回大安全日志是当前时间之前24小时内的,然后就可以在get-eventlog语句中使用$date变量了。get-eventlog命令的结果传递给了where-object命令,where-objiect子语句使用了大于操作符(-gt)把timewritten的值和$date值进行比较。如果timewritten值大于$date值,这个表达式返回true,当前的日志项也就会被返回。因此,任何在24小时内生成的安全事件日志项都会作为结果返回。(图10)
 

                               
登录/注册后可看大图

  当然,有时候我们不希望将结果返回在PowerShell控制台中,而希望将其保存到文件中。这样的话,我们只需将where-object命令的输出传递给out-FILE即可。命令可以修改为就可把之前24小时中所有的安全日志保存到c:\\security-jp.txt文件中:
  $date = (get-date).adddays(-1)
  get-eventlog security | where {$_.timewritten -gt $date} | out-file c:\\security-jp.txt
  (图11)

  

                               
登录/注册后可看大图


6、访问远程事件日志
  我们知道通过事件查看器可以访问并查看远程计算机的事件日志,其实在PowerShell下也可以。笔者以访问远程计算机server02的安全事件日志为例,进行说明。
  (1).创建对象获取事件日志
  同本地获取日志不同,我们不能通过get-eventlog来获取远程日志,要获取远程日志需要创建一个system.diagnostics.eventlog对象,其语句为:
  new-object system.diagnostics.eventlog (\"security\",\"JP\")
  这个语句以new-object开始,对象类型的名称为system.diagnostics.eventlog,要传入的事件的名称是security,目标计算机名称为JP。当然,我们也可以把new-object命令的结果传递给get-member命令,实现的语句为:
  new-object system.diagnostics.eventlog (\"security\",\"JP\") | gm
  (2)对远程日志的筛选或格式化
  获取日志属性(方法)
  如果要使用这些属性和方法,用括号将语句括起来,然后在后面加点以及属性或方法的名称。比如我们要返回日志项的列表即entries属性,可通过下面的语句实现:
  (new-object system.diagnostics.eventlog (\"security\",\"JP\")).entries
  (图12)


                               
登录/注册后可看大图
获取特定条目的日志
  如果要返回特定条目是日志,我们可将结果传递给select-object命令,然后在后面输入数值以获取自己需要的事件日志。实现语句如下:
  (new-object system.diagnostics.eventlog (\"security\",\"JP\")).entries | select
  -last 10
  通过上面的语句我们获取了最新的10条相应日志。
  (图13)


                               
登录/注册后可看大图
获取特定时间内的日志
  同样的,我们可以进一步限制获取特定时间内的事件日志,这时只需将new-object命令的结果传递给where-object即可。当然我们还需定义一个变量$date,这和前面说的一样。完整是实现语句如下:
  $date = (get-date).adddays(-2)
  (new-object system.diagnostics.eventlog (\"security\",\"JP\")).entries | where {$_.timewritten -gt $date}
  通过上面的语句我们获取了此前48小时之内的相应日志。当然,我们也可将上述日志保存为文件,完整的实现语句如下:
  $date = (get-date).adddays(-2)
  (new-object system.diagnostics.eventlog (\"security\",\"JP\")).entries | where {$_.timewritten -gt $date} | out-file c:\\secrity-jp1.txt
  (图14)


                               
登录/注册后可看大图
清除远程日志
  在远程管理中,我们通常要清除远程计算机的日志(特定的或者全部),这同样可以实现。假如我们要清除远程计算机server02上所有的安全(security)日志,可通过下面的语句来实现:
  (new-object system.diagnostics.eventlog(\"security\",\"JP\")).clear()
  语句中调用clear()方法来清除日志,我们可执行命令“(new-object system.diagnostics.eventlog (\"security\",\"JP\")).entries”查看,远程计算机JP中的security事件日志被清除干净。当然我们还可调用其他的方法以实现对日志的特定操作。(图15)



                               
登录/注册后可看大图

  总结:上面列举的只是利用PowerShell访问、管理计算机事件日志的最常用的操作,熟练掌握这些技巧加以灵活应用足以满足我们日常对事件日志的管理需要。当然,还有更多高级的技巧需要我们去学习和掌握。应该说,本文提供的技巧和实例这只是一个开始。
PCOS系统下载站:http://zhuangji.wang

签到天数: 820 天

连续签到: 1 天

[LV.10]以坛为家III

 楼主| 发表于 2009-7-20 11:42 | 显示全部楼层

利用PowerShell提升事件日志管理效率

事件日志对于系统管理员的重要性自不待言,而基于图形界面的事件查看器毫无疑问是我们进行日志管理的首选工具,但绝不是最快捷的工具。其实,PowerShell提供了一种更简单的方式,利用它我们不仅可访问当前系统的事件日志,而且还可对数据进行排序、格式化等等。管理员如果能够掌握利用PowerShell访问系统日志的技巧,一定会大大提升工作效率。  PowerShell当前最高版本是2.0,不过Windows XP和Windows Vista并没有集成该工具,大家可访问微软官方网站http://www.microsoft.com/downloads/details.aspx?FamilyID=60deac2b-975b-41e6-9fa0-c2fd6aa6bc89&DisplayLang=en下载安装。不过,在安装PowerShell前需要Microsoft .NET Framework,大家可访问http://www.microsoft.com/downloads/details.aspx?FamilyID=333325fd-ae52-4e35-b531-508d977d32a6&DisplayLang=zh-cn下载并安装。Windows Server 2008中已经集成了PowerShell,不过需要手动添加,Windows 7中已经集成了PowerShell V2.0。

下面笔者就以Windows Server 2008为例,谈谈如何使用PowerShell访问事件日志。

  1、初识Get-EventLog
  在PowerShell中用来访问系统日志的命令为Get-EventLog,这个命令后面可带很多参数以实现不同的任务,大家可在PowerShell命令行中执行“help Get-EventLog”获取其参数,执行“help get-eventlog -detailed”和获得更多详细的信息、示例和Geg-EventLog的帮助信息。其实不仅仅如此,我们可以结合通道符号“|”,以及系统对象、方法来构造复杂的语句,进行显示日志的筛选、排序、格式化等等。另外,因为Get-EventLog是基于PowerShell命令行的,因此运行它所耗费的系统资源远远小于基于图形界面的事件查看器。(图1)


                               
登录/注册后可看大图

2、简单查看事件日志
  执行Get-EventLog命令,其标准输出内容提供了事件的所有关键信息。在PowerShell命令行中输入Get-EventLog,然后在其后面输入要查看的事件日志的名称,比如Application(应用程序)、system(系统)、security(安全)等。比如我们执行“Get-EventLog security”就会PowerShell窗口中详细列出所有的安全日志。就这样,在事件查看器中提供的所有Windows日志或应用程序和服务日志等都可以在命令行下查看。其实,我们刚才在给Get-EventLog后面添加日志名称时,实际上是使用了“-logname”参数即Get-EventLog -logname security。通常情况下,我们可以省略该参数。需要说明的是,如果日志名称包含有空格,则必须用引号将名称括起来,例如Get-EventLog \"DNS Server\"。此外,如果直接执行“Get-EventLog security”会显示所有的安全事件日志,不利用查看,我们可在命令后面添加“| more”即“Get-EventLog security | more”以分屏显示。当然,如果要终止命令的执行我们可以按下组合键“Ctrl+c”。(图2)
  
  

                               
登录/注册后可看大图


  Get-EventLog命令可以用于获取事件日志自身的信息,还可以获取存储在日志中的
  事件详细信息,当然我们还可以扩展这个命令返回的信息。需要提一下,Get-EventLog有一个-list参数,指定这个参数即执行“Get-EventLog -list”将会返回本地系统的事件日志列表。(图3)

  

                               
登录/注册后可看大图


3、日志的排序
  默认情况下,当我们执行Get-EventLog(例如“Get-EventLog -logname security”),就会依照事件顺序从新到旧列出所知道事件日志中的所有事件。通常情况下,日志事件是非常多的,往往会显示几屏,这当然不利于我们查看。其实,在实战中我们往往需要显示自己所需的日志(比如最近的日志),这就需要对日志进行排序。排序的策略之一是,指定只显示最新事件的详细信息,例如我们希望看到日志中最新的60或600条信息。这时我们需要用到“-newest”参数,在参数后面跟上相应的数值即可返回规定数量的最新事件。例如我们执行“Get-EventLog system -newest 30”,就会显示最新的30条系统事件。(图4)


                               
登录/注册后可看大图

4、日志的格式化
  直接执行Get-EventLog会分列显示日志的很多属性,诸如Index、Time、Type、Source、EventID、Message。其中这些属性并不都是我们关心或者需要的,为了合理利用日志,我们可将事件按照类型、来源或者事件ID进行分组。在使用类型对事件进行分组时,可以更清楚地区分关键、警告和错误事件。如果按照来源进行分组,则可以更清楚地看到来自特定来源的事件。如果按照事件ID进行分组,则可以更清楚地看到与特定事件相关的所有内容。所以,根据需要对事件进行格式化无疑会方便我们查看,提供工作效率。
  (1)分组格式化
  如果要按照来源、事件ID、事件类型和生产事件对事件进行分组,我们可以这样进行操作。首先,获得要查看的事件并将其保存到变量$e中,命令语句是“$e = Get-EventLog -newest 500 -logname application”。然后,使用group-object cmdlet将保存在$e变量中的事件对象按照指定的属性进行分组。比如,我们按照事件ID进行分组,执行命令“$e | group-object -property eventid”即可。(图5)


                               
登录/注册后可看大图
(2)排序格式化
  我们也可根据特定的属性对事件进行排列,也就是说按照来源、事件ID、事件类型或生成事件对事件进行排列,其操作如下是:首先,获得要查看的事件并将其保存在变量$e中,执行命令“$e = get-eventlog -newest 100 -logname application”。然后,使用sort-object cmdlet对保存在$e变量中的事件对象按照指定的属性进行排列,例如按照事件类型进行排列,执行命令“$e | sort-object -property entrytype”即可。(图6)


                               
登录/注册后可看大图
(3)根据关键词格式化
  有时可能需要在特定的属性中寻找匹配的特定文本。比如,我们只希望返回“错误”事件。为此,可以使用“error”作为关键词搜索事件的EntryType属性。操作方法是:首先,获得要查看的事件将其保存在变量$e中,执行命令“$e = get-eventlog -newest 500 -logname application”。然后,使用where-object cmdlet对保存在变量$e变量中的事件对象的命名属性进行搜索,例如本例中搜索所有“错误”类型事件,执行命令“$e | where-object {$_.EntryType -match \"error\"}”即可。where-object cmdlet使用的搜索算法是不区分大小写的,使用这种方法还可以搜索警告、关键或信息事件。因为where-object会将部分匹配的内容视为有效,因此我们可输入不完整的类型名称进行搜索。下面列举几个例子:
  从结果中搜索匹配类型关键词“warn”的事件
  $e = get-eventlog -newest 500 -logname aplication
  $e | where-object {$_.EntryType -match \"warn\"}
  从结果中搜索匹配来源关键词“.NET”的事件
  $e = get-eventlog -newest 500 -logname aplication
  $e | where-object {$_.Source -match \".NET\"}
  从结果中搜索匹配事件ID关键词“1101”的事件
  $e = get-eventlog -newest 500 -logname aplication
  $e | where-object {$_.EventID -match \"1101\"}
  (图7)


                               
登录/注册后可看大图
5、日志的筛选
  可以说,日志的筛选和上面说的日志格式化比较相似。之所以将其单独列出来,主要是结合实例说说get-eventlog命令结合对象的一些高级应用。
  (1).返回需求的事件日志
  其实我们在使用get-eventlog获取事件信息时,会创建一个System.Diagnostics.EventLog对象,我们可以在P0werSheIl语句中使用这个对象的任何方法和属性。比如,我们可在Where-object子句中使用的一个名为LogDisplayName的属性以返回指定的事件日志信息。执行命令“get-eventlog -list | where {$_.logdisplayname -eq \"security\"}”返回安全日志信息。简单说明一下,这个语句使用了where别名来表示where-object命令,它会对传递过来的值进行循环,之后使用子表达式来指定所需要的结果,这个表达式跟在where 之后,并用大括号括起来。这个子语句以$一字符开始,这是一个系统自带的变量,表示管道中传递过来的值或循环中的当前值。这个子语句中还有一个-eq参数,其含义就是等于的意思即logdisplayname的值必须等于security。
  前面这个例子只获取安全日志信息。不过,你可以把结果传递给Format-List获取更多的信息,执行命令“get-eventlog -list | where {$_.logdisplayname -eq \"security\"} | fl *”。其中命令最后的fl表示format-list,跟在后面的*号表示事件的所有属性信息都会返回到控制台。(图8)

 

                               
登录/注册后可看大图


  (2)获取特定事件日志的属性
  如果要访问某一对象的属性和方法以得到更多信息,使用Get-Member命令。比如执行命令“get-eventlog -list | where {$_.logdisplayname -eq \"security\"} | gm”后,会返回安全日志对象的名称、成员类型及其定义。如果我们知道可用属性的名称后,就可以获取它的值了。例如,执行语句“(get-eventlog -list | where {$_.logdisplayname -eq \"security\"}).overflowaction”就可获得overflowaction的值为OverwriteOlder,即在安全日志满了之后,Windows会覆盖以前的就日志。需要注意的是get-eventlog语句必须用括号扩起来,后面跟一个属性。当然,我们可以将语句保存到一个变量中,然后通过变量调用属性即可。命令语句为:
  $log = get-eventlog -list | where {$_.logdisplayname -eq \"security\"}
  $log.overflowaction
  (图9)

  

                               
登录/注册后可看大图


(3)获取特定时间内的事件日志
  如果我们希望获取特定时间内的日志该怎么做呢?这需要用到system.diagnostics.eventlogentry对象的TimeWritten属性,该属性表示事件发生的确切事件和日期。例如,我们要获取过去的24小时内的安全日志,可通过下面的语句来实现:
  $date = (get-date).adddays(-1)
  get-eventlog security | where {$_.timewritten -gt $date}
  第一行语句定义了$date变量,调用get-date命令获取当前的日期和时间。get-dage对象支持AddDays方法,在本例中AddDays后传入-1天的参数,意味着返回大安全日志是当前时间之前24小时内的,然后就可以在get-eventlog语句中使用$date变量了。get-eventlog命令的结果传递给了where-object命令,where-objiect子语句使用了大于操作符(-gt)把timewritten的值和$date值进行比较。如果timewritten值大于$date值,这个表达式返回true,当前的日志项也就会被返回。因此,任何在24小时内生成的安全事件日志项都会作为结果返回。(图10)
 

                               
登录/注册后可看大图

  当然,有时候我们不希望将结果返回在PowerShell控制台中,而希望将其保存到文件中。这样的话,我们只需将where-object命令的输出传递给out-FILE即可。命令可以修改为就可把之前24小时中所有的安全日志保存到c:\\security-jp.txt文件中:
  $date = (get-date).adddays(-1)
  get-eventlog security | where {$_.timewritten -gt $date} | out-file c:\\security-jp.txt
  (图11)

  

                               
登录/注册后可看大图


6、访问远程事件日志
  我们知道通过事件查看器可以访问并查看远程计算机的事件日志,其实在PowerShell下也可以。笔者以访问远程计算机server02的安全事件日志为例,进行说明。
  (1).创建对象获取事件日志
  同本地获取日志不同,我们不能通过get-eventlog来获取远程日志,要获取远程日志需要创建一个system.diagnostics.eventlog对象,其语句为:
  new-object system.diagnostics.eventlog (\"security\",\"JP\")
  这个语句以new-object开始,对象类型的名称为system.diagnostics.eventlog,要传入的事件的名称是security,目标计算机名称为JP。当然,我们也可以把new-object命令的结果传递给get-member命令,实现的语句为:
  new-object system.diagnostics.eventlog (\"security\",\"JP\") | gm
  (2)对远程日志的筛选或格式化
  获取日志属性(方法)
  如果要使用这些属性和方法,用括号将语句括起来,然后在后面加点以及属性或方法的名称。比如我们要返回日志项的列表即entries属性,可通过下面的语句实现:
  (new-object system.diagnostics.eventlog (\"security\",\"JP\")).entries
  (图12)


                               
登录/注册后可看大图
获取特定条目的日志
  如果要返回特定条目是日志,我们可将结果传递给select-object命令,然后在后面输入数值以获取自己需要的事件日志。实现语句如下:
  (new-object system.diagnostics.eventlog (\"security\",\"JP\")).entries | select
  -last 10
  通过上面的语句我们获取了最新的10条相应日志。
  (图13)


                               
登录/注册后可看大图
获取特定时间内的日志
  同样的,我们可以进一步限制获取特定时间内的事件日志,这时只需将new-object命令的结果传递给where-object即可。当然我们还需定义一个变量$date,这和前面说的一样。完整是实现语句如下:
  $date = (get-date).adddays(-2)
  (new-object system.diagnostics.eventlog (\"security\",\"JP\")).entries | where {$_.timewritten -gt $date}
  通过上面的语句我们获取了此前48小时之内的相应日志。当然,我们也可将上述日志保存为文件,完整的实现语句如下:
  $date = (get-date).adddays(-2)
  (new-object system.diagnostics.eventlog (\"security\",\"JP\")).entries | where {$_.timewritten -gt $date} | out-file c:\\secrity-jp1.txt
  (图14)


                               
登录/注册后可看大图
清除远程日志
  在远程管理中,我们通常要清除远程计算机的日志(特定的或者全部),这同样可以实现。假如我们要清除远程计算机server02上所有的安全(security)日志,可通过下面的语句来实现:
  (new-object system.diagnostics.eventlog(\"security\",\"JP\")).clear()
  语句中调用clear()方法来清除日志,我们可执行命令“(new-object system.diagnostics.eventlog (\"security\",\"JP\")).entries”查看,远程计算机JP中的security事件日志被清除干净。当然我们还可调用其他的方法以实现对日志的特定操作。(图15)



                               
登录/注册后可看大图

  总结:上面列举的只是利用PowerShell访问、管理计算机事件日志的最常用的操作,熟练掌握这些技巧加以灵活应用足以满足我们日常对事件日志的管理需要。当然,还有更多高级的技巧需要我们去学习和掌握。应该说,本文提供的技巧和实例这只是一个开始。
PCOS系统下载站:http://zhuangji.wang

签到天数: 820 天

连续签到: 1 天

[LV.10]以坛为家III

 楼主| 发表于 2009-7-20 11:42 | 显示全部楼层

利用PowerShell提升事件日志管理效率

事件日志对于系统管理员的重要性自不待言,而基于图形界面的事件查看器毫无疑问是我们进行日志管理的首选工具,但绝不是最快捷的工具。其实,PowerShell提供了一种更简单的方式,利用它我们不仅可访问当前系统的事件日志,而且还可对数据进行排序、格式化等等。管理员如果能够掌握利用PowerShell访问系统日志的技巧,一定会大大提升工作效率。  PowerShell当前最高版本是2.0,不过Windows XP和Windows Vista并没有集成该工具,大家可访问微软官方网站http://www.microsoft.com/downloads/details.aspx?FamilyID=60deac2b-975b-41e6-9fa0-c2fd6aa6bc89&DisplayLang=en下载安装。不过,在安装PowerShell前需要Microsoft .NET Framework,大家可访问http://www.microsoft.com/downloads/details.aspx?FamilyID=333325fd-ae52-4e35-b531-508d977d32a6&DisplayLang=zh-cn下载并安装。Windows Server 2008中已经集成了PowerShell,不过需要手动添加,Windows 7中已经集成了PowerShell V2.0。

下面笔者就以Windows Server 2008为例,谈谈如何使用PowerShell访问事件日志。

  1、初识Get-EventLog
  在PowerShell中用来访问系统日志的命令为Get-EventLog,这个命令后面可带很多参数以实现不同的任务,大家可在PowerShell命令行中执行“help Get-EventLog”获取其参数,执行“help get-eventlog -detailed”和获得更多详细的信息、示例和Geg-EventLog的帮助信息。其实不仅仅如此,我们可以结合通道符号“|”,以及系统对象、方法来构造复杂的语句,进行显示日志的筛选、排序、格式化等等。另外,因为Get-EventLog是基于PowerShell命令行的,因此运行它所耗费的系统资源远远小于基于图形界面的事件查看器。(图1)


                               
登录/注册后可看大图

2、简单查看事件日志
  执行Get-EventLog命令,其标准输出内容提供了事件的所有关键信息。在PowerShell命令行中输入Get-EventLog,然后在其后面输入要查看的事件日志的名称,比如Application(应用程序)、system(系统)、security(安全)等。比如我们执行“Get-EventLog security”就会PowerShell窗口中详细列出所有的安全日志。就这样,在事件查看器中提供的所有Windows日志或应用程序和服务日志等都可以在命令行下查看。其实,我们刚才在给Get-EventLog后面添加日志名称时,实际上是使用了“-logname”参数即Get-EventLog -logname security。通常情况下,我们可以省略该参数。需要说明的是,如果日志名称包含有空格,则必须用引号将名称括起来,例如Get-EventLog \"DNS Server\"。此外,如果直接执行“Get-EventLog security”会显示所有的安全事件日志,不利用查看,我们可在命令后面添加“| more”即“Get-EventLog security | more”以分屏显示。当然,如果要终止命令的执行我们可以按下组合键“Ctrl+c”。(图2)
  
  

                               
登录/注册后可看大图


  Get-EventLog命令可以用于获取事件日志自身的信息,还可以获取存储在日志中的
  事件详细信息,当然我们还可以扩展这个命令返回的信息。需要提一下,Get-EventLog有一个-list参数,指定这个参数即执行“Get-EventLog -list”将会返回本地系统的事件日志列表。(图3)

  

                               
登录/注册后可看大图


3、日志的排序
  默认情况下,当我们执行Get-EventLog(例如“Get-EventLog -logname security”),就会依照事件顺序从新到旧列出所知道事件日志中的所有事件。通常情况下,日志事件是非常多的,往往会显示几屏,这当然不利于我们查看。其实,在实战中我们往往需要显示自己所需的日志(比如最近的日志),这就需要对日志进行排序。排序的策略之一是,指定只显示最新事件的详细信息,例如我们希望看到日志中最新的60或600条信息。这时我们需要用到“-newest”参数,在参数后面跟上相应的数值即可返回规定数量的最新事件。例如我们执行“Get-EventLog system -newest 30”,就会显示最新的30条系统事件。(图4)


                               
登录/注册后可看大图

4、日志的格式化
  直接执行Get-EventLog会分列显示日志的很多属性,诸如Index、Time、Type、Source、EventID、Message。其中这些属性并不都是我们关心或者需要的,为了合理利用日志,我们可将事件按照类型、来源或者事件ID进行分组。在使用类型对事件进行分组时,可以更清楚地区分关键、警告和错误事件。如果按照来源进行分组,则可以更清楚地看到来自特定来源的事件。如果按照事件ID进行分组,则可以更清楚地看到与特定事件相关的所有内容。所以,根据需要对事件进行格式化无疑会方便我们查看,提供工作效率。
  (1)分组格式化
  如果要按照来源、事件ID、事件类型和生产事件对事件进行分组,我们可以这样进行操作。首先,获得要查看的事件并将其保存到变量$e中,命令语句是“$e = Get-EventLog -newest 500 -logname application”。然后,使用group-object cmdlet将保存在$e变量中的事件对象按照指定的属性进行分组。比如,我们按照事件ID进行分组,执行命令“$e | group-object -property eventid”即可。(图5)


                               
登录/注册后可看大图
(2)排序格式化
  我们也可根据特定的属性对事件进行排列,也就是说按照来源、事件ID、事件类型或生成事件对事件进行排列,其操作如下是:首先,获得要查看的事件并将其保存在变量$e中,执行命令“$e = get-eventlog -newest 100 -logname application”。然后,使用sort-object cmdlet对保存在$e变量中的事件对象按照指定的属性进行排列,例如按照事件类型进行排列,执行命令“$e | sort-object -property entrytype”即可。(图6)


                               
登录/注册后可看大图
(3)根据关键词格式化
  有时可能需要在特定的属性中寻找匹配的特定文本。比如,我们只希望返回“错误”事件。为此,可以使用“error”作为关键词搜索事件的EntryType属性。操作方法是:首先,获得要查看的事件将其保存在变量$e中,执行命令“$e = get-eventlog -newest 500 -logname application”。然后,使用where-object cmdlet对保存在变量$e变量中的事件对象的命名属性进行搜索,例如本例中搜索所有“错误”类型事件,执行命令“$e | where-object {$_.EntryType -match \"error\"}”即可。where-object cmdlet使用的搜索算法是不区分大小写的,使用这种方法还可以搜索警告、关键或信息事件。因为where-object会将部分匹配的内容视为有效,因此我们可输入不完整的类型名称进行搜索。下面列举几个例子:
  从结果中搜索匹配类型关键词“warn”的事件
  $e = get-eventlog -newest 500 -logname aplication
  $e | where-object {$_.EntryType -match \"warn\"}
  从结果中搜索匹配来源关键词“.NET”的事件
  $e = get-eventlog -newest 500 -logname aplication
  $e | where-object {$_.Source -match \".NET\"}
  从结果中搜索匹配事件ID关键词“1101”的事件
  $e = get-eventlog -newest 500 -logname aplication
  $e | where-object {$_.EventID -match \"1101\"}
  (图7)


                               
登录/注册后可看大图
5、日志的筛选
  可以说,日志的筛选和上面说的日志格式化比较相似。之所以将其单独列出来,主要是结合实例说说get-eventlog命令结合对象的一些高级应用。
  (1).返回需求的事件日志
  其实我们在使用get-eventlog获取事件信息时,会创建一个System.Diagnostics.EventLog对象,我们可以在P0werSheIl语句中使用这个对象的任何方法和属性。比如,我们可在Where-object子句中使用的一个名为LogDisplayName的属性以返回指定的事件日志信息。执行命令“get-eventlog -list | where {$_.logdisplayname -eq \"security\"}”返回安全日志信息。简单说明一下,这个语句使用了where别名来表示where-object命令,它会对传递过来的值进行循环,之后使用子表达式来指定所需要的结果,这个表达式跟在where 之后,并用大括号括起来。这个子语句以$一字符开始,这是一个系统自带的变量,表示管道中传递过来的值或循环中的当前值。这个子语句中还有一个-eq参数,其含义就是等于的意思即logdisplayname的值必须等于security。
  前面这个例子只获取安全日志信息。不过,你可以把结果传递给Format-List获取更多的信息,执行命令“get-eventlog -list | where {$_.logdisplayname -eq \"security\"} | fl *”。其中命令最后的fl表示format-list,跟在后面的*号表示事件的所有属性信息都会返回到控制台。(图8)

 

                               
登录/注册后可看大图


  (2)获取特定事件日志的属性
  如果要访问某一对象的属性和方法以得到更多信息,使用Get-Member命令。比如执行命令“get-eventlog -list | where {$_.logdisplayname -eq \"security\"} | gm”后,会返回安全日志对象的名称、成员类型及其定义。如果我们知道可用属性的名称后,就可以获取它的值了。例如,执行语句“(get-eventlog -list | where {$_.logdisplayname -eq \"security\"}).overflowaction”就可获得overflowaction的值为OverwriteOlder,即在安全日志满了之后,Windows会覆盖以前的就日志。需要注意的是get-eventlog语句必须用括号扩起来,后面跟一个属性。当然,我们可以将语句保存到一个变量中,然后通过变量调用属性即可。命令语句为:
  $log = get-eventlog -list | where {$_.logdisplayname -eq \"security\"}
  $log.overflowaction
  (图9)

  

                               
登录/注册后可看大图


(3)获取特定时间内的事件日志
  如果我们希望获取特定时间内的日志该怎么做呢?这需要用到system.diagnostics.eventlogentry对象的TimeWritten属性,该属性表示事件发生的确切事件和日期。例如,我们要获取过去的24小时内的安全日志,可通过下面的语句来实现:
  $date = (get-date).adddays(-1)
  get-eventlog security | where {$_.timewritten -gt $date}
  第一行语句定义了$date变量,调用get-date命令获取当前的日期和时间。get-dage对象支持AddDays方法,在本例中AddDays后传入-1天的参数,意味着返回大安全日志是当前时间之前24小时内的,然后就可以在get-eventlog语句中使用$date变量了。get-eventlog命令的结果传递给了where-object命令,where-objiect子语句使用了大于操作符(-gt)把timewritten的值和$date值进行比较。如果timewritten值大于$date值,这个表达式返回true,当前的日志项也就会被返回。因此,任何在24小时内生成的安全事件日志项都会作为结果返回。(图10)
 

                               
登录/注册后可看大图

  当然,有时候我们不希望将结果返回在PowerShell控制台中,而希望将其保存到文件中。这样的话,我们只需将where-object命令的输出传递给out-FILE即可。命令可以修改为就可把之前24小时中所有的安全日志保存到c:\\security-jp.txt文件中:
  $date = (get-date).adddays(-1)
  get-eventlog security | where {$_.timewritten -gt $date} | out-file c:\\security-jp.txt
  (图11)

  

                               
登录/注册后可看大图


6、访问远程事件日志
  我们知道通过事件查看器可以访问并查看远程计算机的事件日志,其实在PowerShell下也可以。笔者以访问远程计算机server02的安全事件日志为例,进行说明。
  (1).创建对象获取事件日志
  同本地获取日志不同,我们不能通过get-eventlog来获取远程日志,要获取远程日志需要创建一个system.diagnostics.eventlog对象,其语句为:
  new-object system.diagnostics.eventlog (\"security\",\"JP\")
  这个语句以new-object开始,对象类型的名称为system.diagnostics.eventlog,要传入的事件的名称是security,目标计算机名称为JP。当然,我们也可以把new-object命令的结果传递给get-member命令,实现的语句为:
  new-object system.diagnostics.eventlog (\"security\",\"JP\") | gm
  (2)对远程日志的筛选或格式化
  获取日志属性(方法)
  如果要使用这些属性和方法,用括号将语句括起来,然后在后面加点以及属性或方法的名称。比如我们要返回日志项的列表即entries属性,可通过下面的语句实现:
  (new-object system.diagnostics.eventlog (\"security\",\"JP\")).entries
  (图12)


                               
登录/注册后可看大图
获取特定条目的日志
  如果要返回特定条目是日志,我们可将结果传递给select-object命令,然后在后面输入数值以获取自己需要的事件日志。实现语句如下:
  (new-object system.diagnostics.eventlog (\"security\",\"JP\")).entries | select
  -last 10
  通过上面的语句我们获取了最新的10条相应日志。
  (图13)


                               
登录/注册后可看大图
获取特定时间内的日志
  同样的,我们可以进一步限制获取特定时间内的事件日志,这时只需将new-object命令的结果传递给where-object即可。当然我们还需定义一个变量$date,这和前面说的一样。完整是实现语句如下:
  $date = (get-date).adddays(-2)
  (new-object system.diagnostics.eventlog (\"security\",\"JP\")).entries | where {$_.timewritten -gt $date}
  通过上面的语句我们获取了此前48小时之内的相应日志。当然,我们也可将上述日志保存为文件,完整的实现语句如下:
  $date = (get-date).adddays(-2)
  (new-object system.diagnostics.eventlog (\"security\",\"JP\")).entries | where {$_.timewritten -gt $date} | out-file c:\\secrity-jp1.txt
  (图14)


                               
登录/注册后可看大图
清除远程日志
  在远程管理中,我们通常要清除远程计算机的日志(特定的或者全部),这同样可以实现。假如我们要清除远程计算机server02上所有的安全(security)日志,可通过下面的语句来实现:
  (new-object system.diagnostics.eventlog(\"security\",\"JP\")).clear()
  语句中调用clear()方法来清除日志,我们可执行命令“(new-object system.diagnostics.eventlog (\"security\",\"JP\")).entries”查看,远程计算机JP中的security事件日志被清除干净。当然我们还可调用其他的方法以实现对日志的特定操作。(图15)



                               
登录/注册后可看大图

  总结:上面列举的只是利用PowerShell访问、管理计算机事件日志的最常用的操作,熟练掌握这些技巧加以灵活应用足以满足我们日常对事件日志的管理需要。当然,还有更多高级的技巧需要我们去学习和掌握。应该说,本文提供的技巧和实例这只是一个开始。
PCOS系统下载站:http://zhuangji.wang

本版积分规则