如何在 Windows 10 中每次打开应用程序时自动运行批处理文件?

如何在 Windows 10 中每次打开应用程序时自动运行批处理文件?

我希望每次在 Windows 10 上打开特定应用程序(例如 notepad.exe)时自动执行 .bat 文件。以下是我目前所做的:

  1. 我配置了本地安全策略来记录应用程序的启动和停止(审计进程跟踪 -> 成功)。每次进程启动或结束时,都会在安全事件日志中生成一个条目。

  2. 我设置了一个计划任务,以在“发生事件时”触发。下面是我正在使用的事件过滤器的 XML 代码:

    <QueryList>
      <Query Id="0" Path="Security">
        <Select Path="Security">
          *[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] and Task =
          13312 and (band(Keywords,9007199254740992)) and (EventID=4688)]] and
          *[EventData[Data[@Name='ProcessName'] and
          (Data='C:\Windows\System32\notepad.exe')]]
        </Select>
      </Query>
    </QueryList>
    
  3. 在计划任务的操作选项卡中,我将其配置为运行所需的.bat 文件。

但是,计划任务仅在我第一次打开记事本时触发。我需要它在每次启动 notepad.exe 时运行。我该如何才能在每次运行 notepad.exe 时触发该任务?

答案1

我能够通过特定的计划任务设置和稍微修改的查询来实现这一点。

设置

可能导致您遇到的后续执行问题的计划任务设置是如果任务已在运行,则适用以下规则在任务的“设置”选项卡中。默认设置为“不启动新实例”,.bat如果前一个实例尚未退出,这可能会阻止您的文件运行。如果您的.bat文件运行时间较长,您可能需要将此设置更改为“并行运行新实例”或“停止现有实例”。

筛选

<QueryList>
  <Query Id="0" Path="Security">
    <Select Path="Security">
      *[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] and (EventID=4688)] and
        EventData[Data[@Name='NewProcessName'] = 'C:\Windows\system32\notepad.exe']]
    </Select>
  </Query>
</QueryList>

我让选择器匹配Data元素,其中同一Data实例的Name属性设置为 ,ProcessName其自己的文本值也设置为C:\Windows\system32\notepad.exe,而不是允许不同的Data元素满足属性和值匹配,以避免误报。为了简洁起见,我删除了一些其他选择器,但它们不应该影响正确性。总的来说,这似乎不会导致您询问的后续执行问题,但这个查询是我在我的计算机上测试的。

不幸的是,事件日志 XPath 1.0 查询没有lower-case()contains()substring()ends-with()函数,因此绝对路径notepad.exe并不像应该的那样容易在所有情况下匹配。对于安装目录中有版本号的 UWP/AppX 版本的记事本,这变得更加棘手。需要更多灵活性的解决方案在具有自定义逻辑的单独后台进程中使用事件日志记录。

导出的任务 XML

<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <RegistrationInfo>
    <Date>2024-04-24T23:37:11.8710167</Date>
    <Author>AEGIR\Ben</Author>
    <URI>\Ben\On Notepad Launched</URI>
  </RegistrationInfo>
  <Triggers>
    <EventTrigger>
      <Enabled>true</Enabled>
      <Subscription>&lt;QueryList&gt;&lt;Query Id="0" Path="Security"&gt;&lt;Select Path="Security"&gt;*[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] and (EventID=4688)] and EventData[Data[@Name='NewProcessName'] = 'C:\Windows\system32\notepad.exe']]&lt;/Select&gt;&lt;/Query&gt;&lt;/QueryList&gt;</Subscription>
    </EventTrigger>
  </Triggers>
  <Principals>
    <Principal id="Author">
      <UserId>S-1-5-21-1767694704-3563880056-2304008930-1001</UserId>
      <LogonType>InteractiveToken</LogonType>
      <RunLevel>LeastPrivilege</RunLevel>
    </Principal>
  </Principals>
  <Settings>
    <MultipleInstancesPolicy>StopExisting</MultipleInstancesPolicy>
    <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
    <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
    <AllowHardTerminate>true</AllowHardTerminate>
    <StartWhenAvailable>false</StartWhenAvailable>
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
    <IdleSettings>
      <StopOnIdleEnd>true</StopOnIdleEnd>
      <RestartOnIdle>false</RestartOnIdle>
    </IdleSettings>
    <AllowStartOnDemand>true</AllowStartOnDemand>
    <Enabled>true</Enabled>
    <Hidden>false</Hidden>
    <RunOnlyIfIdle>false</RunOnlyIfIdle>
    <WakeToRun>false</WakeToRun>
    <ExecutionTimeLimit>PT72H</ExecutionTimeLimit>
    <Priority>7</Priority>
  </Settings>
  <Actions Context="Author">
    <Exec>
      <Command>winver.exe</Command>
    </Exec>
  </Actions>
</Task>

相关内容