Как подписаться на событие через Get-WinEvent в PowerShell? - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь прослушать конкретную запись c в журнале событий windows, которая означает, что компьютер подключился к Inte rnet:

LogName: Microsoft-Windows-NetworkProfile/Operational
Event ID: 10000

Я обнаружил какой-то код из существующего SO вопрос и попытался адаптировать его для моей цели. Проблема в том, что я могу найти свое событие, используя Get-WinEvent вместо предложенного (устаревшего) Get-EventLog.

* 1015 Событие *, похоже, не существует для записей WinEvent. Есть ли другое событие, на которое я могу «подписаться», чтобы прослушивать новые записи для моего события? Или мне стоит попробовать какой-нибудь другой метод?


$networklog = Get-WinEvent -LogName 'Microsoft-Windows-NetworkProfile/Operational'

Register-ObjectEvent -InputObject $networklog -SourceIdentifier NewEventLogEntry -EventName EntryWritten -Action {

    $entry = $event.SourceEventArgs.Entry

    if($entry.EventID -eq 10000) {
        # check_url($url)
        Write-Host "Connected"
    }
    else { 
        Write-Host "Something else"
    }
}

Моя конечная цель состоит в том, чтобы простой скрипт работал постоянно, вызывая функцию, как только станет доступно соединение с определенным c URL. Мы будем очень благодарны за любые другие предложения по достижению этого, поскольку я чувствую, что нахожусь довольно глубоко, так как раньше не касался Powershell.

1 Ответ

0 голосов
/ 10 июля 2020

Для упомянутого командлета вы можете получить информацию, выполнив следующие действия.

Протестировано на

(Get-CimInstance -ClassName Win32_OperatingSystem).Version
# Results
<#
10.0.19041
#>

Это работает при получении информации

(Get-WinEvent -LogName 'Microsoft-Windows-NetworkProfile/Operational').Count
# Results
<#
2054
#>


Get-WinEvent -LogName 'Microsoft-Windows-NetworkProfile/Operational' | 
Select-Object -First 3 | 
Format-Table -AutoSize
# Results
<#
   ProviderName: Microsoft-Windows-NetworkProfile

TimeCreated           Id LevelDisplayName Message
-----------           -- ---------------- -------
09-Jul-20 08:54:25  4004 Information      Network State Change Fired...
09-Jul-20 08:54:22  4004 Information      Network State Change Fired...
09-Jul-20 08:54:18 20002 Information      NSI Set Category Result...
#>

Вы вы можете получить только те свойства, которые присутствуют, тогда вам нужно будет запросить текст в свойстве

(Get-WinEvent -LogName 'Microsoft-Windows-NetworkProfile/Operational' | 
Select-Object -First 1) |
Sort-Object -Property Name |
Get-Member
# Results
<#
   TypeName: System.Diagnostics.Eventing.Reader.EventLogRecord

Name                 MemberType   Definition                                                                                                                       
----                 ----------   ----------                                                                                                                       
...                                                                                                                
Message              NoteProperty string Message=Network State Change Fired...                                                                                     
...                                                                                                      
Id                   Property     int Id {get;}                                                                                                                    
Keywords             Property     System.Nullable[long] Keywords {get;}                                                                                            
KeywordsDisplayNames Property     System.Collections.Generic.IEnumerable[string] KeywordsDisplayNames {get;}                                                       
Level                Property     System.Nullable[byte] Level {get;}                                                                                               
LevelDisplayName     Property     string LevelDisplayName {get;}                                                                                                   
LogName              Property     string LogName {get;}                                                                                                            
MachineName          Property     string MachineName {get;}                                                                                                        
...                                                                                               
ProcessId            Property     System.Nullable[int] ProcessId {get;}                                                                                            
Properties           Property     System.Collections.Generic.IList[System.Diagnostics.Eventing.Reader.EventProperty] Properties {get;}                             
...                                                                                         
ProviderName         Property     string ProviderName {get;}                                                                                                       
...                                                                                          
RecordId             Property     System.Nullable[long] RecordId {get;}                                                                                            
RelatedActivityId    Property     System.Nullable[guid] RelatedActivityId {get;}                                                                                   
Task                 Property     System.Nullable[int] Task {get;}                                                                                                 
TaskDisplayName      Property     string TaskDisplayName {get;}                                                                                                    
ThreadId             Property     System.Nullable[int] ThreadId {get;}                                                                                             
TimeCreated          Property     System.Nullable[datetime] TimeCreated {get;}                                                                                     
...
#>

Журналы событий хранят детали в свойстве Message, и вы можете выбрать оттуда.

(Get-WinEvent -LogName 'Microsoft-Windows-NetworkProfile/Operational').Message | 
Select-Object -First 1
# Results
<#
Network State Change Fired
    New Internet Connection Profile: false
    Connection Cost Changed: false
    Domain Connectivity Level Changed: false
    Network Connectivity Level Changed: false
    Host Name Changed: true
    Wwan Registration State Changed: false
    Tethering Operational State Changed: false
    Tethering Client Count Changed: false
#>

Вы можно использовать таблицу ha sh для фильтрации по вашему идентификатору

Get-WinEvent -FilterHashTable @{ 
    LogName   = 'Microsoft-Windows-NetworkProfile/Operational'
    ID        = 10000 
}

# Results
<#
TimeCreated                      Id LevelDisplayName Message                                                                                                       
-----------                      -- ---------------- -------                                                                                                       
09-Jul-20 08:54:18            10000 Information      Network Connected...                                                                                          
09-Jul-20 08:54:14            10000 Information      Network Connected...                                                                                          
09-Jul-20 08:54:08            10000 Information      Network Connected... 
...
#>

Затем нужно преобразовать это сообщение в выбранный вами формат. Или просто запросите все сообщение как есть

(Get-WinEvent -FilterHashTable @{ 
    LogName   = 'Microsoft-Windows-NetworkProfile/Operational'
    ID        = 10000 
}).Message

Или

(Get-WinEvent -FilterHashTable @{ 
    LogName   = 'Microsoft-Windows-NetworkProfile/Operational'
    ID        = 10000 
}) | Select-Object -ExpandProperty Message

См. Также:

Обновление

Как указывает LeeDaily, вам может быть лучше просто установить это в TaskScheduler. Если вы выполнили прямую настройку фильтра в EventViewer, вы получите что-то вроде этого.

<QueryList>
  <Query Id="0" Path="Microsoft-Windows-NetworkProfile/Operational">
    <Select Path="Microsoft-Windows-NetworkProfile/Operational">*[System[(Level=1  or Level=2 or Level=3 or Level=4 or Level=0 or Level=5) and (EventID=10000)]]</Select>
  </Query>
</QueryList>

Итак, вы можете увидеть ограничение того, что вы можете вернуть, а затем, в частности, сказать, что если вы хотите большего, вы придется копаться в значении свойства сообщения. Более подробно ознакомьтесь с информацией XML в предоставленной ссылке, где, когда вы это делаете, вы получаете код, подобный приведенному ниже, со всеми возможными выходами.

# Collect the filtered events          
$Events = Get-WinEvent -FilterHashTable @{
    LogName   = 'Microsoft-Windows-NetworkProfile/Operational'
    ID        = 10000 
} -MaxEvents 1            
            
# Parse out the event message data            
ForEach ($Event in $Events) 
{            
    # Convert the event to XML            
    $eventXML = [xml]$Event.ToXml()  
              
    # Iterate through each one of the XML message properties            
    For ($i=0; $i -lt $eventXML.Event.EventData.Data.Count; $i++) 
    {            
        # Append these as object properties            
        $AddMemberSplat = @{
            InputObject = $Event 
            MemberType  = 'NoteProperty'
            Force       = $true
            Name        = $eventXML.Event.EventData.Data[$i].Name 
            Value       = $eventXML.Event.EventData.Data[$i].'#text'
        }
        Add-Member @AddMemberSplat           
    }            
}            
            
# View the results   
$Events | Select-Object * | Format-List 
...