求助:设置程序结束时触发任务,但当前事件查询导致程序启动与结束均触发任务
求助:设置程序结束时触发任务,但当前事件查询导致程序启动与结束均触发任务
问题描述
我最近在配置Windows任务计划的事件触发器时碰到了个头疼的问题:我本来只想让C:\Program Files (x86)\GOG Galaxy\GalaxyClient.exe程序结束时才触发后续任务,但现在写的查询语句,不管程序启动还是退出都会触发任务,完全不符合预期。
我当前用的查询代码是这样的:
<QueryList> <Query Id="0" Path="Security"> <Select Path="Security"> *[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] and Task = 13313 and (band(Keywords,9007199254740992)) and (EventID=4689)]] and *[EventData[( Data='C:\Program Files (x86)\GOG Galaxy\GalaxyClient.exe' )]] </Select> </Query> </QueryList>
我查过资料,EventID 4689对应的是进程终止事件,Task 13313也是进程终止相关的分类,按道理应该只捕捉程序结束的事件才对,但实际运行起来,程序启动的时候任务也会跟着触发,实在搞不懂哪里出了问题。
解决方案
问题出在你的EventData过滤逻辑上!你当前的写法Data='xxx'会匹配任意Data元素的值等于该路径,而程序启动时(比如EventID 4688进程创建事件)的ProcessName也会是这个路径,如果你的查询范围没卡准,就会误触发这类启动相关的事件。
你需要修改EventData的过滤条件,明确指定匹配ProcessName这个特定的Data字段,这样就能精准定位到进程终止事件里的目标程序了。修改后的查询代码如下:
<QueryList> <Query Id="0" Path="Security"> <Select Path="Security"> *[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] and Task = 13313 and (band(Keywords,9007199254740992)) and (EventID=4689)]] and *[EventData[Data[@Name='ProcessName']='C:\Program Files (x86)\GOG Galaxy\GalaxyClient.exe']] </Select> </Query> </QueryList>
如果想要更严谨,还可以额外增加对正常终止状态的过滤(TerminationStatus值为0x0表示正常终止),进一步缩小触发范围:
<QueryList> <Query Id="0" Path="Security"> <Select Path="Security"> *[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] and Task = 13313 and (band(Keywords,9007199254740992)) and (EventID=4689)]] and *[EventData[ Data[@Name='ProcessName']='C:\Program Files (x86)\GOG Galaxy\GalaxyClient.exe' and Data[@Name='TerminationStatus']='0x0' ]] </Select> </Query> </QueryList>
这样修改后,触发器就只会在目标程序结束时触发任务了。
备注:内容来源于stack exchange,提问作者Vas 888
相关产品推荐
相关产品推荐

