在PowerShell中使用Windows事件日志

时间:2016-05-05 14:34:55

标签: powershell event-log

我有一个脚本来读取应用程序和系统事件日志的最后30个条目,目前这些脚本只能在我的机器上运行,只输出部分消息(例如,见下文)。

411905 May 05 15:05信息Microsoft-Windows ... 1501已成功处理用户的组策略设置。自上次succ以来没有检测到任何变化...

任何人都可以告诉我如何完成以下工作

  1. 将它用于远程计算机 - 我尝试以\ domain \ computername格式输入计算机名称但是不起作用
  2. 如何显示完整的讯息,而不仅仅是一个部分
  3. 如何使用计算机名称保存文件作为文件名的一部分,例如“mycomputer application log.txt”
  4. 到目前为止我的脚本是这样的

    Get-EventLog -LogName Application -Newest 30  -ComputerName MYCOMPUTER | Out-File -FilePath "D:\Test\Application Event Logs.txt" 
    
    Get-EventLog -LogName System -Newest 30 -ComputerName MYCOMPUTER | Out-File -FilePath "D:\Test\System Event Logs.txt" 
    

    我是脚本新手,并认为这可能是一个有用的脚本,但我无法让它工作。

1 个答案:

答案 0 :(得分:3)

远程计算机

如果您指的是其他域中的计算机,那么我认为您不能单独使用该cmdlet。

相反,您可以使用PowerShell远程处理来运行远程计算机上存在的任何powershell命令。但是您必须在远程计算机上设置远程计算机,并使用SSL或可信主机,并使用显式凭据来确保允许连接:

$credential = Get-Credential # enter credentials for remote machine
$session = New-PSSession -ComputerName REMOTECOMPUTER -Credential $credential
Invoke-Command -Session $session -ScriptBlock {
    Get-EventLog # parameters
}

全文

重要的是要注意Get-WinEvent返回的内容是一个复杂的对象。您在屏幕上显示的内容只是一个视图。将其直接写入文件也只是一个视图。相反,明确地弄清楚你想要什么,构建一个字符串,然后将其写入文件。

首先将cmdlet的结果分配给变量,以便您可以检查它:

$events = Get-WinEvent #params

现在你可以查看结果:

$events | Get-Member  # see what properties are available

那么你可以看到Message是一个属性。

要获取该消息,您可以使用Select-Object,因为您希望将其作为字符串而不是属性,所以-ExpandProperty

$events | Select-Object -ExpandProperty Message | Out-File #etc

这会写出所有消息(但没有其他信息)。

实际上,您可能希望对返回的每个日志条目进行操作,并构建字符串以写入文件:

$events | ForEach-Object {
    # $_ represents the current object
    $msg = $_.Message
    $id = $_.Id
    $timeCreated = $_.TimeCreated

    "A log entry with ID $id was created at $timeCreated, and it says:`r`n`r`n$msg`r`n---------`r`n"
} | Out-File #params

使用计算机名称

假设您事先知道要检查的计算机名称,请将其放入变量中,然后将其嵌入文件名中:

$computer = 'MYCOMPUTER'
Get-WinEvent -ComputerName $computer | ForEach-Object {
    # do stuff like above
} | Out-File -Path "D:\Whatever\$computer Application Log"