none
Get-WinEvent -FilterXPath: как фильтровать по UserData? RRS feed

  • Вопрос

  • Здравствуйте.

    есть такое событие:

    - <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
    - <System>
      <Provider Name="Microsoft-Windows-TerminalServices-LocalSessionManager" Guid="{5D896912-022D-40AA-A3A8-4FA5515C76D7}" /> 
      <EventID>24</EventID> 
      <Version>0</Version> 
      <Level>4</Level> 
      <Task>0</Task> 
      <Opcode>0</Opcode> 
      <Keywords>0x1000000000000000</Keywords> 
      <TimeCreated SystemTime="2016-09-07T11:06:59.387441700Z" /> 
      <EventRecordID>1676</EventRecordID> 
      <Correlation /> 
      <Execution ProcessID="424" ThreadID="4540" /> 
      <Channel>Microsoft-Windows-TerminalServices-LocalSessionManager/Operational</Channel> 
      <Computer>pc.domain.ru</Computer> 
      <Security UserID="S-1-5-18" /> 
      </System>
    - <UserData>
    - <EventXML xmlns:auto-ns3="http://schemas.microsoft.com/win/2004/08/events" xmlns="Event_NS">
      <User>DOMAIN\test-user</User> 
      <SessionID>1</SessionID> 
      <Address>ЛОКАЛЬНЫЕ</Address> 
      </EventXML>
      </UserData>
      </Event>


    меня интересует <EventID>24</EventID> , а именно "отключение сеанса RDP"

    это я нашёл как отлавливать

    Get-WinEvent -FilterHashTable  @{logname = "Microsoft-Windows-TerminalServices-LocalSessionManager/Operational"; id = 24;

    но как отлавливать

    не равно  <Address>ЛОКАЛЬНЫЕ</Address>

    и <SessionID>1</SessionID>  = 1 или 2?

    не могу найти как забраться в - <UserData> часть?

    спасибо


    -=C U=-

    8 сентября 2016 г. 12:07

Ответы

Все ответы

  • Например так:

    $date=(get-date).AddDays(-2)
    
    $event=Get-WinEvent -FilterHashTable  @{logname = "Microsoft-Windows-TerminalServices-LocalSessionManager/Operational"; id = 24;}|where {($_.timecreated -gt $date)}
    foreach ($I in $event)
    
    {
    $mes=$I.message -split "`n"
    $user=$mes[2]
    $Codeseans=$mes[3]
    $adressnetwork=$mes[4]
    if(Ваше условие)
    {
    [array]$filterevent+=$I
    }
    
    
    }
    Переменные можно подогнать как вам нужно, или используйте в условии -like "*loginname*" например.



    • Изменено Daniil Sedov 8 сентября 2016 г. 12:36
    8 сентября 2016 г. 12:34
  • а сразу в фильтр это нельзя запихнуть?

    -=C U=-

    8 сентября 2016 г. 12:41
  • $query = @"
    <QueryList>
      <Query Id="0" Path="Microsoft-Windows-TerminalServices-LocalSessionManager/Operational">
        <Select Path="Microsoft-Windows-TerminalServices-LocalSessionManager/Operational">*[System[(EventID=24)]] and *[UserData[EventXML[(SessionID=2 or SessionID=1) and Address != "ЛОКАЛЬНЫЕ"]]]</Select>
      </Query>
    </QueryList>
    "@
    
    Get-WinEvent -FilterXml $query

    • Помечено в качестве ответа KazunEditor 17 сентября 2016 г. 18:40
    8 сентября 2016 г. 12:45
    Отвечающий
  • Kazun,

    т.е. я неправильно выбрал механизм фильтрации.

    ясно, спасибо!


    -=C U=-

    8 сентября 2016 г. 12:48
  • Kazun,

    т.е. я неправильно выбрал механизм фильтрации.

    ясно, спасибо!


    -=C U=-

    Только -FilterXml позволяет в полной мере делать фильтр, у остальных ограничения. Или использовать самый простой фильтр и уже через Where-Object сделать фильтр.

    Get-WinEvent -FilterHashTable  @{logname = "Microsoft-Windows-TerminalServices-LocalSessionManager/Operational"; id = 24;}| Where {
    	($_.Properties[1] -in 1,2) -and ($_.Properties[2] -ne "Локальные")
    }

    8 сентября 2016 г. 13:02
    Отвечающий
    • Помечено в качестве ответа KazunEditor 17 сентября 2016 г. 18:40
    8 сентября 2016 г. 14:39
    Модератор
  • Может полезным будет Кто и откуда подключался по RDP — скрипты

    Сазонов Илья

    https://isazonov.wordpress.com/

    спасибо, я немного другое нагуглил, это вообще почти то, что надо

    $Events = Get-WinEvent -logname "Microsoft-Windows-TerminalServices-LocalSessionManager/Operational" | where {($_.Id -eq "21" -OR $_.Id -eq "24" -OR $_.Id -eq "25"  -OR $_.Id -eq "23")}
    $Results = Foreach ($Event in $Events) {
      $Result = "" | Select Message,User,TimeCreated
      $Result.TimeCreated = $Event.TimeCreated
      Foreach ($MsgElement in ($Event.Message -split "`n")) {
        $Element = $MsgElement -split ":"
        If ($Element[0] -like "User") {$Result.User = $Element[1].Trim(" ")}
        If ($Element[0] -like "Remote Desktop*") {$Result.Message = $Element[1].Trim(" ")}
      }
      $Result
    } 
    $Results | Select Message,User,TimeCreated | Export-Csv C:\RDS.csv -NoType

    но на локализованной ОС колонки пустые :(

    а на англ всё ок.

    вообще, я пытаюсь из логов надёргать продолжительность RDP сеанса вполне конкретного пользователя на вполне конкретной машинке, но начинают вылезать внезапности типа 0.0.0.0 в IP адресах источника, "ЛОКАЛЬНЫЕ" в логе TerminalServices, код сеанса 1/2/3/??

    в общем как-то печально, особенно на фоне крайнего слабого знания поша.


    -=C U=-

    8 сентября 2016 г. 14:49
  • И да теоретически FilterXPath может фильтровать по UserData, но фактически не работает из-за бага: как раз сегодня описал его на UserVoice https://windowsserver.uservoice.com/forums/301869-powershell/suggestions/15969436-get-winevent-filterhashtable-query-is-wrong

    Update: ошибку нашел в исходном коде и отписал на UserVoice


    Сазонов Илья

    https://isazonov.wordpress.com/


    8 сентября 2016 г. 14:50
    Модератор
  • а на англ всё ок.

    На русском имя журнала другое :-)

    Сазонов Илья

    https://isazonov.wordpress.com/

    8 сентября 2016 г. 14:53
    Модератор
  • а на англ всё ок.

    На русском имя журнала другое :-)

    Сазонов Илья

    https://isazonov.wordpress.com/

    ммм, не понял. как это другое имя?

    это всё тот же

    Microsoft-Windows-TerminalServices-LocalSessionManager/Operational


    -=C U=-

    8 сентября 2016 г. 14:55
  • Руссификации имени нет?

    Сазонов Илья

    https://isazonov.wordpress.com/

    8 сентября 2016 г. 15:10
    Модератор
  •  Руссификации в имени нет. Чтоб не привязываться к локализации:

    $qe = @{LogName = "Microsoft-Windows-TerminalServices-LocalSessionManager/Operational";ID=21,23,24,25}
    $Events = Get-WinEvent -FilterHashtable $qe
    $Results = Foreach ($Event in $Events) {
    	[pscustomobject]@{
    		Message = $Event.Message.split("`n")[0].split(":")[1].Trim()
    		User = $Event.Properties[0].Value
    		TimeCreated = $Event.TimeCreated
    	}
    }


    8 сентября 2016 г. 15:33
    Отвечающий