Feeds:
Записи
Комментарии

Archive for Апрель 2016

Задача: Сформировать запрос в котором больше 25 условий

Для формирования запросов мы можем использовать 3 параметра:

  • -FilterXPath <String>
  • -FilterXml <XmlDocument>
  • -FilterHashtable <Hashtable[]>

    Подробную справку по параметрам у Get-WinEventhttps://technet.microsoft.com/en-us/library/hh849682.aspx .

    Предположим, что нам надо получить EventID с 4620 по 4660.

    1.  -FilterHashtable <Hashtable[]>

    Ограничимся двумя параметрами — LogName=<String[]> и — ID=<Int32[]>.

    image

    Получаем ошибку. Опытным путем проверим, сколько максимально возможно  = 23 условия.

    image

    Видим, что если больше 23 условий, то получаем ошибку.

    2. -FilterXPath <String>

    image

    Получаем ошибку. Опытным путем проверим, сколько максимально возможно  = 23 условия.

    image

     

    !!! Название полей регистрозависим EventId (правильный вариант EventID) – выдаст ошибку.

    FilterHashtable и FilterXpath — не поддерживают выше 23 выражений в одном запросе, как и несколько запросов разом.

     

    3. -FilterXml <XmlDocument>

    image

    Аналогичное ограничение для одной записи в 23 условия.

     

    Теперь обратимся к официальной документации и поищем ответ там.

    С этим нам поможет полезная статья Consuming Eventshttps://msdn.microsoft.com/en-us/library/windows/desktop/dd996910%28v=vs.85%29.aspx .

    You can use the XPath expressions directly when calling the EvtQuery or EvtSubscribe functions or you can use a structured XML query that contains the XPath expression. For simple queries that query events from a single source, using an XPath expression is fine. If the XPath expression is a compound expression that contains more than 20 expressions or you are querying for events from multiple sources, then you must use a structured XML query. For details on the elements of a structured XML query, see Query Schema.

    Если используется более 20 условий, используйте формат – XML. Так же есть указание на WinApi функцию EvtQuery , которая и используется в конечном итоге для получения событий.

    Обратившись к справке по EvtQuery, обнаружим интересный параметр, который принимает функция:

    Query [in]
        A query that specifies the types of events that you want to retrieve. You can specify an XPath 1.0 query or structured XML query. If your XPath contains more than 20 expressions, use a structured XML query. To receive all events, set this parameter to NULL or "*".

     

    Как устроен командлет Get-WinEvent?

    Данный командлет основан на использовании  .Net класса System.Diagnostics.Eventing.Reader.EventLogReader. Компания Microsoft открыла часть платформы .Net и мы можем посмотреть устройство этого класса.

    Перейдя по ссылке можно посмотреть исходный код, где мы находим метод, который называется, как и WinApi функция – EvtQuery:

    [System.Security.SecurityCritical]
        public static EventLogHandle EvtQuery(
            EventLogHandle session,
            string path,
            string query,
            int flags) {
        if (s_platformNotSupported)
            throw new System.PlatformNotSupportedException();
        EventLogHandle handle = UnsafeNativeMethods.EvtQuery(session, path, query, flags);
        int win32Error = Marshal.GetLastWin32Error();
        if (handle.IsInvalid)
            EventLogException.Throw(win32Error);
        return handle;
    }

    Определение функции происходит в данном классе UnsafeNativeMethods.cs:

    [DllImport(WEVTAPI, CallingConvention = CallingConvention.Winapi, SetLastError = true)]
       [SecurityCritical]
        internal static extern EventLogHandle EvtQuery(
            EventLogHandle session,
            [MarshalAs(UnmanagedType.LPWStr)]string path,
            [MarshalAs(UnmanagedType.LPWStr)]string query,
        int flags);

     

    Теперь осталось дело за малым сформировать XML запрос, который содержит в одном подзапросе меньше 23 условий. Пример такого запроса можно увидеть в EventLog –> Administrative Events –> Properties –> Edit Filter.

    <QueryList>
      <Query Id="0" Path="Application">
        <Select Path="Application">*[System[(Level=1  or Level=2 or Level=3)]]</Select>
        <Select Path="Security">*[System[(Level=1  or Level=2 or Level=3)]]</Select>
        <Select Path="System">*[System[(Level=1  or Level=2 or Level=3)]]</Select>
        <Select Path="HardwareEvents">*[System[(Level=1  or Level=2 or Level=3)]]</Select>
        <Select Path="Internet Explorer">*[System[(Level=1  or Level=2 or Level=3)]]</Select>

    image

    Запрос отработал, как требуется. Отсюда вывод, если запрос содержит много условий, несколько источников – выбор FilterXml.

  • FilterHashTable/FilterXPath

    FilterXML

    Больше 23 условий
    bad

    good
    Несколько источников bad
    good

    Q&A:

    1. Какой инструмент использовать для формирования XPath/XML запросов?

    https://blogs.msdn.microsoft.com/powershell/2011/04/14/using-get-winevent-filterxml-to-process-windows-events/

    Очень удобный инструмент для тестирования и формирования запросов, встроенное средство Event Viewer ( запуск — eventvwr.msc . Show-Eventlog).

    image

     

    Вкладка XML:

    image

     

    2. В Event Viewer можно в фильтре указать диапазон?

    Да, можно. Посмотрим на запрос:

    <QueryList>
      <Query Id="0" Path="Security">
        <Select Path="Security">*[System[(Level=1 ) and ( (EventID &gt;= 4620 and EventID &lt;= 4660) ) and TimeCreated[timediff(@SystemTime) &lt;= 3600000]]]</Select>
      </Query>
    </QueryList>

     

    EventID >= 4620 and EventID <= 4660 – Да, запрос отработает, но работает он гораздо медленнее. Поэтому, если время для Вас не критично, то используйте вместо громоздких выражений.

    3. При использвании Get-WiEvent в ОC отличных от английского языка, поле Message у событий пустое?

    Да, такое поведения иногда присутствует не только у данного командлета. Для этого нам поможет простая функция Using-Culture .

    Using-Culture en-us {
        Get-WinEvent -FilterXml $xml -MaxEvent 1
    }

    4. Ограничения XPath v1?

    XPath 1.0 limitations

    Windows Event Log supports a subset of XPath 1.0. The primary restriction is that only XML elements that represent events can be selected by an event selector. An XPath query that does not select an event is not valid. All valid selector paths start with * or "Event". All location paths operate on the event nodes and are composed of a series of steps. Each step is a structure of three parts: the axis, node test, and predicate. For more information about these parts and about XPath 1.0, see XML Path Language (XPath). Windows Event Log places the following restrictions on the expression:

    • Axis: Only the Child (default) and Attribute (and its shorthand "@") axis are supported.
    • Node Tests: Only node names and NCName tests are supported. The "*" character, which selects any character, is supported.
    • Predicates: Any valid XPath expression is acceptable if the location paths conform to the following restrictions:
      • Standard operators OR, AND, =, !=, <=, <, >=, >, and parentheses are supported.
      • Generating a string value for a node name is not supported.
      • Evaluation in reverse order is not supported.
      • Node sets are not supported.
      • Namespace scoping is not supported.
      • Namespace, processing, and comment nodes are not supported.
      • Context size is not supported.
      • Variable bindings are not supported.
      • The position function, and its shorthand array reference, is supported (on leaf nodes only).
      • The Band function is supported. The function performs a bitwise AND for two integer number arguments. If the result of the bitwise AND is nonzero, the function evaluates to true; otherwise, the function evaluates to false.
      • The timediff function is supported. The function computes the difference between the second argument and the first argument. One of the arguments must be a literal number. The arguments must use FILETIME representation. The result is the number of milliseconds between the two times. The result is positive if the second argument represents a later time; otherwise, it is negative. When the second argument is not provided, the current system time is used.

    5. Можно ли читать напрямую из файла?

    Если пользователь обладает правами на чтение файл из папки %SystemRoot%\System32\Winevt\Logs\*.evtx , но не рекомендуется.

    Get-WinEvent -Path C:\Windows\System32\Winevt\Logs\Application.evtx

    6. В каких единицах указывается время?

    Время в запросах используется в миллисекундах. Для получения можно использовать New-TimeSpan.

    image

    7. Почему в XML запросе требуется экранирование символов в отличие от XPath?

    В XPath запросах используются =, !=, <=, <, >=, >. Но в XML надо следовать некоторым правилам.

    NOTE:  When an XPath expression occurs in an XML document, any < and <= operators must be quoted according to XML 1.0 rules by using, for example, &lt; and &lt;=. In the following example the value of the test attribute is an XPath expression: <xsl:if test="@value &lt; 10">…</xsl:if>

    Для преобразования, можно использовать несколько методов:

    PS > [System.Web.HttpUtility]::HtmlEncode("<=")
    &lt;=

    < -> &lt;
    > -> &gt;
    " -> &quot;
    ‘ -> &apos;
    & -> &amp;

    PS > [System.Security.SecurityElement]::Escape("<=")
    &lt;=

    Реклама

    Read Full Post »