Планировщик задач Windows XPath для фильтрации событий в час дня

#xpath #windows-task-scheduler

Вопрос:

Я создаю пользовательский фильтр событий для запуска задачи из планировщика задач Windows. Мне нужно выбрать свое событие, только если оно произойдет до x часа дня.

Вот та часть XML-файла событий, которая меня волнует:

 lt;Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"gt;  lt;Systemgt;  lt;Provider Name="acvpnagent" /gt;   lt;EventID Qualifiers="25600"gt;2039lt;/EventIDgt;   lt;TimeCreated SystemTime="2021-11-01T04:24:49.6333217Z" /gt;   lt;Channelgt;Cisco AnyConnect Secure Mobility Clientlt;/Channelgt;   lt;/Systemgt; lt;/Eventgt;  

До сих пор у меня есть следующий XPath, но в нем отсутствует ограничение по времени:

 lt;QueryListgt;  lt;Query Id="0" Path="Cisco AnyConnect Secure Mobility Client"gt;  lt;Select Path="Cisco AnyConnect Secure Mobility Client"gt;*[System[Provider[@Name='acvpnagent'] and (EventID=2039)lt;/Selectgt;  lt;/Querygt; lt;/QueryListgt;  

Можно ли добавить условие для TimeCreated удовлетворения моего ограничения? И я все еще ограничен XPath 1.0 в Windows 10?

Ответ №1:

Это выражение XPath 1.0 будет выбирать Event узлы следующим образом

 //x:Event[./x:System/x:Provider/@Name="acvpnagent" and ./x:System/x:EventID=2039 and number(translate(substring-before(substring-after(./x:System/x:TimeCreated/@SystemTime,"T"),"."),":","")) lt; 110000]  

Этот XPath будет выбирать узлы в соответствии с критериями, приведенными в примере операции

 //x:Event[./x:System/x:Provider/@Name="acvpnagent" and ./x:System/x:EventID=2039]  

В то время как эта часть XPath добавит фильтр по времени суток

 number(translate(substring-before(substring-after(./x:System/x:TimeCreated/@SystemTime,"T"),"."),":","")) lt; 110000  

Обработка дат
Учитывая ISO-8601 дату как 2021-11-01T04:24:49.6333217Z , это вернет часть HH:mm:ss

 substring-before(substring-after(./x:System/x:TimeCreated/@SystemTime,"T"),".")  

Результат: 04:24:49

Давайте уберем точки с запятой:

 translate(substring-before(substring-after(./x:System/x:TimeCreated/@SystemTime,"T"),"."),":","")  

Результат: 042449

Наконец, сделайте это число и сравните с желаемым пределом

 number(translate(substring-before(substring-after(./x:System/x:TimeCreated/@SystemTime,"T"),"."),":","")) lt; 110000  

Учитывая этот пример XML

 lt;rootgt; lt;Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"gt;  lt;Systemgt;  lt;Provider Name="acvpnagent" /gt;   lt;EventID Qualifiers="25600"gt;2039lt;/EventIDgt;   lt;TimeCreated SystemTime="2021-11-01T04:24:49.6333217Z" /gt;   lt;Channelgt;Cisco AnyConnect Secure Mobility Clientlt;/Channelgt;   lt;/Systemgt; lt;/Eventgt; lt;Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"gt;  lt;Systemgt;  lt;Provider Name="acvpnagent" /gt;   lt;EventID Qualifiers="25600"gt;2039lt;/EventIDgt;   lt;TimeCreated SystemTime="2021-11-01T08:24:49.6333217Z" /gt;   lt;Channelgt;Cisco AnyConnect Secure Mobility Clientlt;/Channelgt;   lt;/Systemgt; lt;/Eventgt; lt;Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"gt;  lt;Systemgt;  lt;Provider Name="acvpnagent" /gt;   lt;EventID Qualifiers="25600"gt;2039lt;/EventIDgt;   lt;TimeCreated SystemTime="2021-11-01T11:24:49.6333217Z" /gt;   lt;Channelgt;Cisco AnyConnect Secure Mobility Clientlt;/Channelgt;   lt;/Systemgt; lt;/Eventgt; lt;Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"gt;  lt;Systemgt;  lt;Provider Name="acvpnagent" /gt;   lt;EventID Qualifiers="25600"gt;2039lt;/EventIDgt;   lt;TimeCreated SystemTime="2021-11-01T22:24:49.6333217Z" /gt;   lt;Channelgt;Cisco AnyConnect Secure Mobility Clientlt;/Channelgt;   lt;/Systemgt; lt;/Eventgt; lt;/rootgt;  

Найдите события, соответствующие критериям и произошедшие до 11:00:00, используя этот XPath

 //x:Event[./x:System/x:Provider/@Name="acvpnagent" and ./x:System/x:EventID=2039 and number(translate(substring-before(substring-after(./x:System/x:TimeCreated/@SystemTime,"T"),"."),":","")) lt; 110000]  

Результат:

 echo -e 'setns x=http://schemas.microsoft.com/win/2004/08/events/eventncat //x:Event[./x:System/x:Provider/@Name="acvpnagent" and ./x:System/x:EventID=2039 and number(translate(substring-before(substring-after(./x:System/x:TimeCreated/@SystemTime,"T"),"."),":","")) lt; 110000]' | xmllint --shell tmp.xml  / gt; setns x=http://schemas.microsoft.com/win/2004/08/events/event / gt; cat //x:Event[./x:System/x:Provider/@Name="acvpnagent" and ./x:System/x:EventID=2039 and number(translate(substring-before(substring-after(./x:System/x:TimeCreated/@SystemTime,"T"),"."),":","")) lt; 110000]  ------- lt;Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"gt;  lt;Systemgt;  lt;Provider Name="acvpnagent"/gt;   lt;EventID Qualifiers="25600"gt;2039lt;/EventIDgt;   lt;TimeCreated SystemTime="2021-11-01T04:24:49.6333217Z"/gt;   lt;Channelgt;Cisco AnyConnect Secure Mobility Clientlt;/Channelgt;   lt;/Systemgt; lt;/Eventgt;  ------- lt;Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"gt;  lt;Systemgt;  lt;Provider Name="acvpnagent"/gt;   lt;EventID Qualifiers="25600"gt;2039lt;/EventIDgt;   lt;TimeCreated SystemTime="2021-11-01T08:24:49.6333217Z"/gt;   lt;Channelgt;Cisco AnyConnect Secure Mobility Clientlt;/Channelgt;   lt;/Systemgt; lt;/Eventgt; / gt;  

Если для сравнения используется полная дата, это будет выражение XPath

 //x:Event[./x:System/x:Provider/@Name="acvpnagent" and ./x:System/x:EventID=2039 and number(translate(substring-before(./x:System/x:TimeCreated/@SystemTime,"."),"T:-","")) lt; 20211101110000]  

Примечание 1. выражения начинаются с ./ , чтобы выполнить оценку в текущем контексте узла.
Примечание 2: У меня нет Windows для тестирования, но XPath 1.0 в основном не зависит от языка/ОС, поэтому он должен работать. Оператору потребуется добавить обработку пространства имен в свою реализацию или удалить x: префикс пространства имен из выражений в этом ответе.