Через журналы Windows можно помотреть много чего интересного.
Но есть нюанс - самое интересное обычно сидит в расширенных атрибутах и фильтр по ним через GUI создать невозможно.
Правда мелкомягкие давно еще
]]>позаботились]]> о механизме работы с расширенными атрибутами методами XPath 1.0.
Возможности XPath 1.0 убогие, но это не отменяет возможность самому создать/подкорректировать запрос к XML,
что существенно облегчает рутинные задачи администрирования.
Первым делом, как опытный коротышка, я полез в поисковики ознакомиться как это делают люди ;)
Но засада - большинство людей отписавшихся на эту тему копипастят единственную
(верную для частного случая, но далеко не полную!) статью и с этим в общей ситуации каши не сваришь...
Я лично против копипасты ничего не имею - но ... только если это работает в моей конкретной ситуации.
Не работает так как предназначено для другого случая.
Итак задача - научиться создавать фильтры по значениям расширенных атрибутов из любого раздела и любого уровня вложенности.
Сразу оговорюсь - XPath 1.0 в инкарнации мелкомягких чтука крайне убогая так что никаких подстрок, лайков и так далее..
Доступные операнды это: OR, AND, =, !=, <=, <, >=, >
Расмотрим возможности на базе типовой задачи: мониторинг IP подключенных пользователей на терминальном сервере.
Для этих целей есть замечательное событие в не менее замечательном журнале расположенном по пути:
"Журналы приложений и служб" -
"Microsoft" -
"Windows" -
"Microsoft-Windows-TerminalServices-LocalSessionManager" -
"Operational"
Событие 21
При помощи средств GUI легко делается настраиваемое представление для этого события:
<QueryList><Query Id="0" Path="Microsoft-Windows-TerminalServices-LocalSessionManager/Operational">
<Select Path="Microsoft-Windows-TerminalServices-LocalSessionManager/Operational">
*[System[(EventID=21)]]</Select>
</Query> </QueryList>
Так стало чуть удобнее, но лично мне хотелось бы фильтровать конретного пользователя/пользователей...
Для этих целей рассмотрим "Подробности" в "Режим XML"
- <System>
<Provider Name="Microsoft-Windows-TerminalServices-LocalSessionManager" Guid="{00000000-0000-0000-0000-000000000000}" />
<EventID>21</EventID>
<Version>0</Version>
<Level>4</Level>
<Task>0</Task>
<Opcode>0</Opcode>
<Keywords>0x1000000000000000</Keywords>
<TimeCreated SystemTime="2024-07-14T06:28:16.014065700Z" />
<EventRecordID>0000000</EventRecordID>
<Correlation ActivityID="{00000000-0000-0000-0000-000000000000}" />
<Execution ProcessID="000" ThreadID="00000" />
<Channel>Microsoft-Windows-TerminalServices-LocalSessionManager/Operational</Channel>
<Computer>MYSERVER.inn.mydomain.ru</Computer>
<Security UserID="S-0-0-00" />
</System>
- <UserData>
- <EventXML xmlns="Event_NS">
<User>MYDOMAIN\user11</User>
<SessionID>0</SessionID>
<Address>192.168.0.11</Address>
</EventXML>
</UserData>
</Event>
Нужная нам инфа сидит в <Event> - <UserData> - <EventXML> - <User>.
Итак - корень любого журнала всегда <Event>.
Текущим активным узлом практически всегда будет <Event> - <System>.
Именно поэтому попытка поиска <User> без явного указания подкорневого узла <UserData> обречена на провал.
Теперь три базовых паравила составления запросов:
- есть два равноправных метода указания пути в XML - через бэкслеш или через скобки
- любой операнд пути должен начинаться или c корня "Event" или c подстановочного символа "*"
- подстановочный символ "*" можно также использовать внутри пути
Итак переходим к созданию:
"Настраиваемые представления" -
Правая кнопка Мыши -
"Создать настраиваемое представление" -
Вкладка "XML" -
Поставить внизу галочку на "Изменить запрос вручную" -
Вввести понятное имя представления
-- Полная запись через обратный слеш
<QueryList><Query Id="0" Path="Microsoft-Windows-TerminalServices-LocalSessionManager/Operational">
<Select Path="Microsoft-Windows-TerminalServices-LocalSessionManager/Operational">
Event/System/EventID=21 and Event/UserData/EventXML/User='MYDOMAIN\user11'
</Select></Query></QueryList>
-- Оптимальная запись через обратный слеш
<QueryList><Query Id="0" Path="Microsoft-Windows-TerminalServices-LocalSessionManager/Operational">
<Select Path="Microsoft-Windows-TerminalServices-LocalSessionManager/Operational">
*/System/EventID=21 and */UserData/*/User='MYDOMAIN\user11'
</Select></Query></QueryList>
-- Полная запись через скобки
<QueryList><Query Id="0" Path="Microsoft-Windows-TerminalServices-LocalSessionManager/Operational">
<Select Path="Microsoft-Windows-TerminalServices-LocalSessionManager/Operational">
Event[System[(EventID=21)]] and Event[UserData[EventXML[(User='MYDOMAIN\user11')]]]
</Select></Query></QueryList>
-- Оптимальная запись через скобки
<QueryList><Query Id="0" Path="Microsoft-Windows-TerminalServices-LocalSessionManager/Operational">
<Select Path="Microsoft-Windows-TerminalServices-LocalSessionManager/Operational">
*[System[(EventID=21)]] and *[UserData[*[(User='MYDOMAIN\user11')]]]
</Select></Query></QueryList>
Комментарии