Многие описания событий для событий журнала отсутствуют, когда я запрашиваю их в PowerShell с помощью Get-EventLog, но они присутствуют, когда я запрашиваю их в 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 может без проблем отобразить сообщение «Состояние подключения в режиме ожидания: отключено, причина: соответствие сетевой карте».
Вот первое событие в средстве просмотра событий, сообщение которого также отображается правильно:
Сообщение предполагает, что 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
Это показывает, что
Это не изолированно от источника 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
Я считаю, что вы столкнулись с ограничением командлета Get-EventLog, которое было заменено командлетом Get-WinEvent. Согласно официальной документации:
Командлеты PowerShell, содержащие существительное EventLog, работают только с классическими журналами событий Windows, такими как Application, System или Security. Чтобы получить журналы, использующие технологию журнала событий Windows в Windows Vista и более поздних версиях Windows, используйте Get-WinEvent.
Хотя вы запрашиваете журнал системных событий, на который это технически не должно влиять, поскольку это классический журнал событий, этот тип записей журнала событий (которые начинаются с Microsoft-Windows-
) только начали появляться в Vista и позже, так что я почти уверен, что это «задумано».
Честно говоря, я не уверен, почему вы просто не используете Get-WinEvent
вместо этого командлет, поскольку он действительно работает.