Powershell Get-EventLog hangs on RemoteComputer



以下内容在本地计算机上运行良好,但是当我输入-ComputerName"myRemoteName"时,它挂起并且即使在大约5分钟后也不会返回任何内容;但是程序似乎仍在运行。

它是否试图通过"线路"返回大量数据包?理论上,在过去的 10 小时内,远程计算机上应该有不到 2 个错误。

$getEventLog = Get-EventLog -log application -ComputerName "myRemoteName" -after ((get-date).addMinutes($minutes*-1)) -EntryType Error 
Write-Host Get-Eventlog completed 
# list of events to exclude (based on text found in the message)
$getEventLogFiltered = $getEventLog | Where-Object {$_.Message -notlike 'Monitis*' -and $_.Message -notlike '*MQQueueDepthMonitor.exe*' -and $_.Message -notlike '*The local computer may not have the necessary registry*' }
#to only select certain columns, use Select-Object -Property and list the property/columns                                     
$getEventLogColumns =   $getEventLogFiltered    | Select-Object -Property TimeGenerated,Source,Message,EntryType,MachineName,EventID
$tableFragment = $getEventLogColumns | ConvertTo-Html -fragment
Write-Host "HTML-Table Built"

之后的代码会构建一封电子邮件并发送它...

我看过其他建议切换到Get-WinEvents的帖子,但我认为这需要我一两个小时来重写(由于我缺乏Powershell的经验);我上面的内容在本地计算机上运行良好。

Updates 03/04/2014 13:40 CT: 
   Running with $minutes = 120 ran 14.5 minutes. 
   Running with $minutes = 1   ran 12.5 minutes. 

结论是,改变$minutes的范围似乎并没有真正影响响应时间;两者都很慢。

参数设计不是很好之后,它会打印它应该打印的所有记录,但是当它达到设定的日期时,它仍然会扫描直到日志文件的末尾,尽管事实上没有什么可打印的(至少看起来是这样)。我使用Where对象过滤器和.CompareTo()方法来打印设置日期之后的日志(在我的情况下是当前日期的前一天)。

#Sets yesterday date (script will get all records after that date)
$YDate = (Get-Date).AddDays(-1)
#Gets all event logs from Security log where event id represents successful logon and records where generated after prepared date (current date - 24 hours)
$YestardayLogons = Get-EventLog -ComputerName $ServerName -LogName Security | 
    WHERE { ($_.EventId -eq '528') -and ($_.TimeGenerated.CompareTo($YDate) -eq '1') }

看来我错了,即使使用 Where-Object 过滤器,它仍然像 -after 参数一样扫描(我只是在不同的、新构建的机器上进行测试,这就是为什么它完成得如此之快)。

然而,其他研究表明,中断函数可能很有用,所以我所做的是:

Get-EventLog -ComputerName $ServerName -LogName Security | WHERE { ($_.EventID -eq '528')} | ForEach-Object {
  $_
  if ($_.TimeGenerated.CompareTo($YDate) -lt 1) { Break}
}

打印所有事件日志,当它命中早于(在我的情况下为 24 小时)的事件日志时,中断将启动并停止获取事件日志 cmdlet。
这不是最漂亮的解决方案,但到目前为止似乎工作正常。

相关内容

  • 没有找到相关文章

最新更新