Настраиваемые представления журналов Windows

Через журналы 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>
 

Похожие материалы по этой теме на сайте

Содержимое
Выключение компьютеров в домене по списку
Монолитный скрипт выключения компьютеров в домене по списку:
@ECHO OFF
SET "BEGIN_MARKER=:ENDFILE1"
SET "END_MARKER=:ENDFILE2"
Логофф сессий отключенных пользователей на терминальном сервере

Убить все отключенные сессии:

@ECHO OFF
FOR /F "USEBACKQ TOKENS=2 DELIMS= " %%a IN (`quser^|findstr /b /v "^>"^|findstr /i /v " ID "^|findstr /v /i "rdp-tcp"`) DO logoff %%~a
EXIT 0
Интерпретатор CMD - вывод переменных со спецсимволами на экран и в файл

Известная, но слабоосвещенная тема - обработка в коммандном интерпретаторе CMD данных со спецсимволами.
В большинстве ситуаций она вполне решаема...
Плюс к этому периодически возникают задачи вывода в файл без перевода строки....

Скрипты для CMD

Скрипты выполняемые интерпретатором CMD.EXE - стандартной консольной оболочкой для Win2000/WinXP/Vista/Seven/Win8/Win2000 Server/Win2003/Win2008.

Страховое копирование по списку

Относительно простой вариант резервного копирования по списку файлов/папок с учетом типа резервной копии и количества хранимых копий по типам. Классические типы: дневная-недельная-месячная-годовая копии. Кодировка скрипта CP866....

Преобразование файлов 1CClientBankExchange в табличную форму

Лично мне периодически приходилось сталкиваться с обработкой данных не в табличной форме, а в "именованном формате" то есть когда каждый параметр пишется на отдельной строке в виде Параметр=Значение параметра причем файл...

Чтение данных из реестра в переменную окружения

Продвинутый кросплатформенный модуль для встраивания в скрипты, позволяющий в удобной форме получать данные из реестра для дальнейшего использования(как всегда - кодировка скрипта CP866):

Перевод столбца в строку

Преобразование столбца в строку с заданными разделителями и обрамлением. Кодировка скрипта CP866.
Символ двойной кавычки при этом не удастся использовать как разделитель или обрамление.