4

以下はローカル コンピューターで正常に実行されますが、-ComputerName "myRemoteName" を入力するとハングし、約 5 分経過しても何も返されません。しかし、プログラムはまだ実行されているようです。

「ワイヤ」を介して大量のデータパケットを返そうとしていますか? 理論的には、リモート コンピューターで過去 2 時間に 10 件未満のエラーが発生しているはずです。

$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 への切り替えを提案する他の投稿を見たことがありますが、書き直すのに 1 時間か 2 時間かかると思います (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 の範囲を変更しても、実際には応答時間には影響がないようです。どちらも遅いです。

4

2 に答える 2

3

パラメータがあまり適切に設計されていない場合、想定されるすべてのレコードを印刷しますが、設定された日付に達すると、印刷するものが何もないという事実にもかかわらず、ログ ファイルの最後までスキャンします (少なくともそのように見えます) 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') }
于 2015-03-31T08:28:02.753 に答える
2

Where-Object フィルターを使用しても、 -after パラメータの場合のようにスキャンします (別のビルドしたばかりのマシンでテストしたところ、これが非常に迅速に終了した理由です)。

ただし、追加の調査では、ブレーク機能が役立つ可能性があることが示されたので、私がしたことは次のとおりです。

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

すべてのイベント ログを出力し、(私の場合は 24 時間) より古いイベント ログにヒットすると、ブレークが開始され、get-eventlog コマンドレットが停止します。
これは最もきれいな解決策ではありませんが、これまでのところうまく機能しているようです。

于 2015-04-01T14:52:11.330 に答える