web-dev-qa-db-ja.com

イベントの説明がGet-EventLogにないが、Get-WinEventおよびイベントビューアに存在する

Get-EventLogを使用してPowerShellでクエリを実行すると、イベントログイベントのイベントの説明の多くが表示されませんが、PowershellでGet-WinEventを使用してクエリを実行したり、通常のイベントビューアーのeventvwr.mscで表示したりすると、イベントログイベントが表示されます

Get-EventLogの出力は次のとおりです。

PS U:\> Get-EventLog -LogName System -Source Microsoft-Windows-Kernel-Power

   Index Time          EntryType   Source                 InstanceID Message
   ----- ----          ---------   ------                 ---------- -------
   11985 Apr 02 13:42  Information Microsoft-Windows...          172 The description for Event ID '172' in Source 'Microsoft-Windo...
   11968 Apr 02 13:41  Information Microsoft-Windows...          109 The description for Event ID '109' in Source 'Microsoft-Windo...
   11732 Apr 02 09:41  Information Microsoft-Windows...          172 The description for Event ID '172' in Source 'Microsoft-Windo...
   11714 Apr 02 09:40  Information Microsoft-Windows...          109 The description for Event ID '109' in Source 'Microsoft-Windo...
   10363 Mar 29 14:28  Information Microsoft-Windows...          172 The description for Event ID '172' in Source 'Microsoft-Windo...
   10346 Mar 29 14:28  Information Microsoft-Windows...          109 The description for Event ID '109' in Source 'Microsoft-Windo...

ここに完全なイベントがあります:

PS U:\> Get-EventLog -LogName System -Source Microsoft-Windows-Kernel-Power | select -first 1 | fl


Index              : 11985
EntryType          : Information
InstanceId         : 172
Message            : The description for Event ID '172' in Source 'Microsoft-Windows-Kernel-Power' cannot be found.  The local
                     computer may not have the necessary registry information or message DLL files to display the message, or you
                     may not have permission to access them.  The following information is part of the event:'2', '6'
Category           : (203)
CategoryNumber     : 203
ReplacementStrings : {2, 6}
Source             : Microsoft-Windows-Kernel-Power
TimeGenerated      : 2019-04-02 13:42:01
TimeWritten        : 2019-04-02 13:42:01
UserName           : NT AUTHORITY\SYSTEM

Get-WinEventからの出力は次のとおりです。

PS C:\WINDOWS\system32> Get-WinEvent -LogName System -FilterXPath "<QueryList>
>>   <Query Id='0' Path='System'>
>>     <Select Path='System'>*[System[Provider[@Name='Microsoft-Windows-Kernel-Power']]]</Select>
>>   </Query>
>> </QueryList>"


   ProviderName: Microsoft-Windows-Kernel-Power

TimeCreated                     Id LevelDisplayName Message
-----------                     -- ---------------- -------
2019-04-02 13:42:01            172 Information      Connectivity state in standby: Disconnected, Reason: NIC compliance
2019-04-02 13:41:44            109 Information      The kernel power manager has initiated a shutdown transition....
2019-04-02 09:41:08            172 Information      Connectivity state in standby: Disconnected, Reason: NIC compliance
2019-04-02 09:40:51            109 Information      The kernel power manager has initiated a shutdown transition....
2019-03-29 14:28:26            172 Information      Connectivity state in standby: Disconnected, Reason: NIC compliance
2019-03-29 14:28:09            109 Information      The kernel power manager has initiated a shutdown transition....

Get-WinEventは、「スタンバイ時の接続状態:切断、理由:NICコンプライアンス」というメッセージを問題なくレンダリングできます。

これもメッセージが正しく表示されたイベントビューアの最初のイベントです。

the first returned event viewed in event viewer with complete message

メッセージは、レジストリまたはイベントメッセージのdllファイルが問題である可能性があることを示していますが、私は確認しましたが、そうではありません:

PS U:\> Get-ItemPropertyValue HKLM:\SYSTEM\CurrentControlSet\Services\EventLog\System\Microsoft-Windows-Kernel-Power -name EventMessageFile
C:\WINDOWS\system32\Microsoft-windows-kernel-power-events.dll
PS U:\> test-path C:\WINDOWS\system32\Microsoft-windows-kernel-power-events.dll
True
PS U:\> $handle = [System.IO.File]::OpenRead("C:\WINDOWS\system32\Microsoft-windows-kernel-power-events.dll")
PS U:\> $handle.CanRead
True

これは

  1. ソースはレジストリで設定されています
  2. ファイルが存在します
  3. ファイルを読むことができます

これは、Microsoft-Windows-Kernel-Powerソースに分離されていません。他の多くのイベントソースでも同じことが起こります。しかし、すべてのイベントソースではありません。たとえば、Get-EventLogはMicrosoft-Windows-Winlogonソースメッセージを適切にレンダリングします。

PS U:\> Get-EventLog -LogName System -Source Microsoft-Windows-Winlogon | select -first 1 | ft

   Index Time          EntryType   Source                 InstanceID Message
   ----- ----          ---------   ------                 ---------- -------
   12100 Apr 02 13:58  Information Microsoft-Windows...         7001 User Logon Notification for Customer Experience Improvement P...

すでにマシンを複数回再起動しており、システムファイルチェッカーを実行したところ、問題は報告されませんでした。

バージョンの詳細:

PS U:\> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.17763.316
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.17763.316
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
5
benrifkah

Get-WinEventコマンドレットに置き換えられたGet-EventLogコマンドレットの制限に直面していると思います。公式ドキュメントによると:

EventLog名詞を含むPowerShellコマンドレットは、アプリケーション、システム、セキュリティなどのWindowsクラシックイベントログでのみ機能します。 Windows Vista以降のWindowsバージョンでWindowsイベントログテクノロジーを使用するログを取得するには、Get-WinEventを使用します。

https://docs.Microsoft.com/en-us/powershell/module/Microsoft.powershell.management/get-eventlog?view=powershell-5.1

クラシックイベントログであるため、技術的に影響を受けないはずのシステムイベントログにクエリを実行していますが、これらの種類のイベントログエントリ(Microsoft-Windows-で始まる)はVista以降でのみ表示されるため、これは「仕様による」と確信しています。

なぜGet-WinEventコマンドレットを使用しないのか、正直なところわかりません。

3
Lucky Luke