web-dev-qa-db-ja.com

PowerShellからの特定のテキストを含むイベントログを表示する方法

私は、Power Shellの特定の文字列を含む、ウィンドウのイベントログの最後の〜日からのすべてのイベントをすばやく表示しようとしています。

イベントを一覧表示するためのPowerShellコマンドを見つけましたが、基本的には特定のテキストに対してそれらを "GREP"したいと思います。

ターゲットはWindows Server 2016 Hyper-Vであるため、Powershellを使用する必要がありますが、最近のイベントを迅速に検索できると非常に便利だと思います PowerShellを備えた任意のマシンで。

利用可能なログを表示するには、次のコマンドを実行します。

PS C:\ Users\Administrator> Get-EventLog -List

  Max(K) Retain OverflowAction        Entries Log
  ------ ------ --------------        ------- ---
  20,480      0 OverwriteAsNeeded       1,113 Application
  20,480      0 OverwriteAsNeeded           0 HardwareEvents
     512      7 OverwriteOlder              0 Internet Explorer
  20,480      0 OverwriteAsNeeded           0 Key Management Service
     512      7 OverwriteOlder          1,539 Microsoft-ServerManagementExperience
  20,480      0 OverwriteAsNeeded      28,667 Security
  20,480      0 OverwriteAsNeeded       4,857 System
  15,360      0 OverwriteAsNeeded       3,654 Windows PowerShell

この例では、ターゲットログはApplicationと呼ばれます

過去24時間のログを次のコマンドでコンソールに出力できます。

Get-EventLog -LogName system -after (Get-Date).AddDays(-1)

Select-String ですが、どの行にも一致しませんでした。

5
Jon

これが私がやったことです。テキストのいくつかのイベントプロパティの値を検索し、それらをコンソールに表示します。

$search = "hyper"
Get-EventLog -LogName system -after (Get-Date).AddDays(-1) | Where-Object { $_.Category.ToLower().Contains($search.ToLower()) -or $_.Message.ToLower().Contains($search.ToLower()) -or $_.Source.ToLower().Contains($search.ToLower())} | Format-Table -AutoSize -Wrap

出力例:

   Index Time          EntryType   Source                 InstanceID Message
   ----- ----          ---------   ------                 ---------- -------
    4751 Aug 10 09:13  Information Microsoft-Windows...           23 NIC /DEVICE/{FD82EC81-DC0D-4655-B606-0AA9AF08E6CC} (Friendly Name: Microsoft Hyper-V Network Adapter) is now operational.
    4750 Aug 10 09:13  Information Microsoft-Windows...           11 The description for Event ID '11' in Source 'Microsoft-Windows-Hyper-V-Netvsc' cannot be found.  The local computer may not have the necessary registr...
    4749 Aug 10 09:13  Information Microsoft-Windows...           24 NIC /DEVICE/{FD82EC81-DC0D-4655-B606-0AA9AF08E6CC} (Friendly Name: Microsoft Hyper-V Network Adapter) is no longer operational.

私はpowershellを初めて使用するので、最善の方法ではないかもしれませんが、動作します。それが誰か他の人の時間を節約することを願っています。

4
Jon

これでうまくいきました。

注意点。このアプローチを採用して、少し単純化することもできます...

この方法では、渡されたすべてのプロパティで文字列値を検索し、一致を返します。大文字と小文字を区別したり、プロパティごとに検索文字列を個別に指定したりする必要はありません。

$Search = 'hyper'
(Get-EventLog -LogName system -after (Get-Date).AddDays(-1) | 
Select-Object -Property Category,Index,TimeGenerated,
EntryType,Source,InstanceID,Message) -match $Search | Format-Table -AutoSize

Category Index TimeGenerated        EntryType Source                             InstanceId Message
-------- ----- -------------        --------- ------                             ---------- -------
(0)      19637 10-Aug-18 17:06:16 Information Microsoft-Windows-Hyper-V-VmSwitch        233 The operation '8' ...
(0)      19636 10-Aug-18 17:06:16 Information Microsoft-Windows-Hyper-V-VmSwitch        234 NIC D6727298-4E...
(0)      19635 10-Aug-18 17:05:39 Information Microsoft-Windows-Hyper-V-VmSwitch        233 The operation ...
(0)      19634 10-Aug-18 17:05:39 Information Microsoft-Windows-Hyper-V-VmSwitch        234 NIC 75A04E6E-1...
(1019)   19621 10-Aug-18 12:33:17 Information Microsoft-Windows-Hyper-V-VmSwitch 
2
postanote

これにより、特定の期間に特定の文字列のすべてのログが検索されます。イベントビューアでは実行できません。一部のログには管理者アクセスが必要です。

Get-WinEvent -ListLog * | 
  foreach { get-winevent @{logname=$_.logname; starttime='2:45 pm' } -ea 0 } |
  where message -match 'whatever'

すべてのログ名をget-wineventに直接パイプすることはできません。 windows apiには256個のログ名の制限があります。これはおそらく、すべてのログを含むビューを作成するためのイベントビューアーの制限を説明します。

get-winevent -ListLog * | get-winevent  # powershell 7

Get-WinEvent: Log count (445) is exceeded Windows Event Log API limit (256). Adjust filter to return less log names.
0
js2010