Моя краткосрочная цель — собрать идентификаторы событий 40 и 42 с провайдером Microsoft-Windows-TerminalServices-LocalSessionManager
из журнала с именем Microsoft-Windows-TerminalServices-**LocalSessionManager/Operational
, а затем отсортировать их на основе сеанса/идентификатора сеанса. Хотя я мог бы попытаться проанализировать свойство сообщения, я пытаюсь использовать метод EventLogRecord GetPropertyValues, который принимает System.Diagnostics.Eventing.Reader.EventLogPropertySelector
. Кроме того, идентификатор сеанса показывает первый помеченный Session для сообщения о событии 40 и показывает второй помеченный SessionID для сообщения о событии 41.
Name | MemberType | Definition |
---|---|---|
GetPropertyValues | Method | System.Collections.Generic.IList[System.Object] |
Я видел, что в 2018 году Peter-Core и Mathias R. Jessen ответили, как это сделать. Следуя их примеру, я посмотрел на шаблон события поставщика событий.
(Get-WinEvent -ListProvider Microsoft-Windows-TerminalServices-LocalSessionManager).Events|Where-object{@(40,42) -contains $_.ID}
Id : 40
Version : 0
LogLink : System.Diagnostics.Eventing.Reader.EventLogLink
Level : System.Diagnostics.Eventing.Reader.EventLevel
Opcode : System.Diagnostics.Eventing.Reader.EventOpcode
Task : System.Diagnostics.Eventing.Reader.EventTask
Keywords : {}
Template : <template xmlns="http://schemas.microsoft.com/win/2004/08/events">
<data name="Session" inType="win:UInt32" outType="xs:unsignedInt"/>
<data name="Reason" inType="win:UInt32" outType="xs:unsignedInt"/>
</template>
Description : Session %1 has been disconnected, reason code %2
Id : 42
Version : 0
LogLink : System.Diagnostics.Eventing.Reader.EventLogLink
Level : System.Diagnostics.Eventing.Reader.EventLevel
Opcode : System.Diagnostics.Eventing.Reader.EventOpcode
Task : System.Diagnostics.Eventing.Reader.EventTask
Keywords : {}
Template : <template xmlns="http://schemas.microsoft.com/win/2004/08/events">
<data name="User" inType="win:UnicodeString" outType="xs:string"/>
<data name="SessionID" inType="win:UInt32" outType="xs:unsignedInt"/>
</template>
Description : End session arbitration:
User: %1
Session ID: %2
В качестве теста я создал следующее, чтобы попытаться получить идентификатор сеанса из идентификатора события 42:
$strComputerName='PMV-SC01'
<# For those wanting to build xmlFilters try something like the following as it allow you to create them more dynamically
$xmlFilterBase=[xml]'<QueryList><Query Id="0"></Query></QueryList>'
## in a loop ##
$xmlSelect=$xmlFilter.CreateElement("Select")
$xmlSelect.SetAttribute("Path","$Logname")
$xmlSelect.set_InnerText("*[System[$($ProviderName)TimeCreated[@SystemTime>='$StartTime' and @SystemTime<='$EndTime']]]")
$xmlFilter.QueryList.Query.AppendChild($xmlSelect)|Out-Null
$xmlSelect=$Null
## end loop ##
#>
#I used the filter below to simplify the testing.
$xmlFilter=@"
<QueryList><Query Id="0" Path="Microsoft-Windows-TerminalServices-LocalSessionManager/Operational"><Select Path="Microsoft-Windows-TerminalServices-LocalSessionManager/Operational">*[System[TimeCreated[@SystemTime>='2021-06-28T22:00:00.000Z' and @SystemTime<='2021-06-28T23:00:00.000Z']]]</Select></Query></QueryList>
"@
$WinEvents=Get-WinEvent -ComputerName $strComputerName -FilterXml $xmlFilter -Oldest|Where-object{$_.Id -eq 42}
$WinEvents.count
# output is 10
$SelectorStrings= [String[]]@(
'Event/EventData/Data[@name="SessionID"]'
)
$PropertySelector= [System.Diagnostics.Eventing.Reader.EventLogPropertySelector]::new($SelectorStrings)
$WinEvents|ForEach-Object{$TheSessionIds=@();$TheSessionIds+=$_.GetPropertyValues($PropertySelector)}
$TheSessionIds.count
#output is 1
# All of the follow also return nothing:
$WinEvents[1].GetPropertyValues($PropertySelector)
$WinEvents.GetPropertyValues($PropertySelector)
$1WinEvent=$WinEvents[0]
$1WinEvent.GetPropertyValues($PropertySelector)
Сообщение об ошибке отсутствует. Метод GetPropertyValues() просто ничего не возвращает. Версия PowerShell: 5.1.14393.2457
Windows | Edition | Version | OS Build |
---|---|---|---|
Windows | Server 2016 Standard | 1607 | 14393.2457 |
(Get-WindowsVersion credit
а>)
Моя долгосрочная цель — создать что-то вроде следующего вывода. Запрос в этом посте — помочь получить значения из метода GetPropertyValues. Я также хотел бы использовать этот метод в других проектах.
SessionID | User | TimeCreated | ID | Code |
---|---|---|---|---|
12 | MYDOMAIN\User.Name | 2021-06-28 07:35:54.4321 | 42 | |
12 | 2021-06-28 15:35:54.4321 | 40 | 0 | |
13 | MYDOMAIN\Other.User | 2021-06-28 11:12:44.1234 | 42 | |
13 | 2021-06-28 13:01:12.5678 | 40 | 0 |
Get-WinEvent
, фильтр xml должен использовать время UTC, так как время, хранящееся в событиях, также отображается в формате UTC. - person Michael Fisher   schedule 30.06.2021