zoukankan      html  css  js  c++  java
  • 通过PowerShell操作事件日志

    管理员能够获取信息的主要来源是事件日志,PowerShell中有专门的Get-EventLog cmdlet处理事件日志。为了获取已存在的事件日志,需要使用-list参数以返回System.Diagnostics.EventLog类型的对象集合。获取这些对象后即可实现任何与系统日志相关联的操作,如下所示:

    image

    从下例的输出能够看到当前系统中存在的日志条数:

    PS C:\PowerShell\AppendixB> get-eventlog -list

    Max(K) Retain OverflowAction Entries Name

    ------ ------ -------------- ------- ----

    512 7 OverwriteOlder 486 Application

    512 7 OverwriteOlder 0 Internet Explorer

    512 7 OverwriteOlder 1 Security

    512 7 OverwriteOlder 2,166 System

    15,360 0 OverwriteAsNeeded 2,148 Windows PowerShell

    一、获取特定的事件日志

    首先获取关于PowerShell系统日志的日志对象:

    PS C:\PowerShell\AppendixB> $log = get-eventlog -list |

    >> ? { $_.logdisplayname -like "*Pow*" }

    >>

    接下来检查获取的日志是否正常:

    PS C:\PowerShell\AppendixB> $log.LogDisplayName

    Windows PowerShell

    随后查看最近发生的5条系统日志:

    PS C:\PowerShell\AppendixB> get-eventlog $log.LogDisplayName -newest 5

    Index Time EntryType Source InstanceID Message

    ----- ---- --------- ------ ---------- -------

    2148 九月 20 10:06 Information PowerShell 400 Engine state is changed fro...

    2147 九月 20 10:06 Information PowerShell 600 Provider "Certificate" is S...

    2146 九月 20 10:06 Information PowerShell 600 Provider "Variable" is Star...

    2145 九月 20 10:06 Information PowerShell 600 Provider "Registry" is Star...

    2144 九月 20 10:06 Information PowerShell 600 Provider "Function" is Star...

    查看系统日志最大的容量:

    PS C:\PowerShell\AppendixB> $log.MaximumKilobytes

    15360

    从中能够看到是15 MB,然后加倍系统允许的最大日志大小:

    PS C:\PowerShell\AppendixB> $log.MaximumKilobytes *= 2

    PS C:\PowerShell\AppendixB> $log.MaximumKilobytes

    30720

    二、将事件日志作为实时对象

    EventLog对象的主要特点是其实时性,即一旦获取这个对象,则可不断地检查它,以查看是否发生了新的事件。例如,可以查看保存在$log变量中的PowerShell日志:

    PS C:\PowerShell\AppendixB> $log

    Max(K) Retain OverflowAction Entries Name

    ------ ------ -------------- ------- ----

    30,720 0 OverwriteAsNeeded 2,148 Windows PowerShell

    能够看到当前的日志条数是2 148条。下面增加启动多个PowerShell实例增加多条日志,这里向PowerShell实例传递了exit命令,每个新实例在启动之后立即退出:

    PS C:\PowerShell\AppendixB> powershell exit

    PS C:\PowerShell\AppendixB> powershell exit

    PS C:\PowerShell\AppendixB> powershell exit

    下面再次查看$log的属性:

    PS C:\PowerShell\AppendixB> $log

    Max(K) Retain OverflowAction Entries Name

    ------ ------ -------------- ------- ----

    30,720 0 OverwriteAsNeeded 2,187 Windows PowerShell

    可以看到日志中已经添加了多条新纪录。接下来清理已经添加的日志,执行此操作通过单独启动PowerShell实例清除现有PowerShell的日志,命令如下:

    PS C:\PowerShell\AppendixB> powershell {

    >> (get-eventlog -list |

    >> ?{$_.LogDisplayName -like "*Pow*"}).Clear()

    >> }

    >>

    其中的命令传递脚本块给一个新的PowerShell进程,这个脚本块获取PowerShell EventLog对象并调用Clear()方法清除已有的日志,在子进程结束之后查看当前的日志:

    PS C:\PowerShell\AppendixB> $log

    Max(K) Retain OverflowAction Entries Name

    ------ ------ -------------- ------- ----

    30,720 0 OverwriteAsNeeded 1 Windows PowerShell

    可以看到PowerShell的日志已经被清空。

    三、保存事件日志

    可以通过PowerShell的Export-Clixml cmdlet保存事件日志以便于后期处理,导出日志的命令如下所示:

    PS C:\PowerShell\AppendixB> $log.Entries | Export-Clixml c:\log.xml

    这里通过命令将数据再次读出日志:

    PS C:\PowerShell\AppendixB> $date = Import-Clixml C:\log.xml

    为了对比从实时对象读取的日志,以及从外部读入的日志的不同,下面输出实施日志的信息:

    PS C:\PowerShell\AppendixB> $log.Entries[0..3] |

    >> ft -auto Index,Time,EventID,Message

    >>

    Index Time EventID Message

    ----- ---- ------- -------

    1 403 Engine state is changed from Available to StoppeD- ...

    2 600 Provider "WSMan" is StarteD- ...

    3 600 Provider "Alias" is StarteD- ...

    4 600 Provider "Environment" is StarteD- ...

    从外部再次读入的数据记录如下:

    PS C:\> $data[0..3] |

    >> ft -auto Index,Time,EventID,Message

    >>

    Index Time EventID Message

    ----- ---- ------- -------

    1 403 Engine state is changed from Available to StoppeD- ...

    2 600 Provider "WSMan" is StarteD- ...

    3 600 Provider "Alias" is StarteD- ...

    4 600 Provider "Environment" is StarteD- ...

    两次输出的内容或多或少相同。当然读入的数据与实时对象有所不同,它不再是实时对象。没有任何方法,对其属性的修改也不会反作用于系统。

    Get-MachinesMissingHotfix.ps1脚本的代码如下所示:

    get-process | foreach {$processes = @{}} {

    $processes[$_.processname] = $_}

    get-service |

    where {$_.Status -match "running" –and

    $_.ServiceType -eq "Win32OwnProcess" } |

    foreach {

    new-object psobject |

    add-member -pass NoteProperty Name $_.Name |

    add-member -pass NoteProperty PID $processes[$_.Name].Id |

    add-member -pass NoteProperty WS $processes[$_.Name].WS |

    add-member -pass NoteProperty Description $_.DisplayName |

    add-member -pass NoteProperty FileName `

    $processes[$_.Name].MainModule.FileName

    } |

    export-csv -notype ./service_datA.csv

    作者: 付海军
    出处:http://fuhj02.cnblogs.com
    版权:本文版权归作者和博客园共有
    转载:欢迎转载,为了保存作者的创作热情,请按要求【转载】,谢谢
    要求:未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
    个人网站: http://txj.shell.tor.hu/

  • 相关阅读:
    Educational CF # 17 C 二分,字符串 D 最长路,dp
    HDU-1878 判断无向图欧拉回路,水
    LightOJ-1094 求树直径,水
    POJ-1144 Tarjan求割点,双连通模板题
    HDU-1269 Tarjan求强连通分量,模板题
    POJ-1094 拓扑排序
    POJ-1847 最短路裸题,Floyd, Bellman, Dijkstra, Spfa
    LightOJ-1005 组合数学,组合数水题
    CF #392(2) C 暴力模拟
    Android xUtils3使用
  • 原文地址:https://www.cnblogs.com/fuhj02/p/1908759.html
Copyright © 2011-2022 走看看