通过检测USB设备连接启动计划任务

gem*_*igo 27 windows scheduled-tasks event-log usb-storage windows-task-scheduler

我知道有人讨论过,由于 Win 7 中自动运行(或自动播放??)的限制,无法在连接时从 USB 驱动器启动应用程序。但是可以创建具有事件类型触发器的计划任务. 当驱动器 - 或任何 USB 设备,就此而言 - 连接时,肯定会发生一个事件。

有没有人知道我应该使用哪个事件 ID?或者至少是什么类型的事件?我在哪里可以在事件查看器中找到该事件?

har*_*ymc 18

线程任务计划程序:如何自动同步我的 USB 闪存驱动器? 一个叫 monotone 的用户给出了这个答案,它使用 PowerShell 和 Task Scheduler :

我和你有同样的问题,并使用 Scripting Guy Blog herehere 中的技术通过 powershell(Windows 内置脚本)解决了一些问题。该脚本作为后台进程持续运行,您可以使用任务调度程序在系统登录时启动该进程。每当插入新驱动器然后执行某些操作(此处配置脚本而不是任务)时,都会通知脚本。由于它在等待下一个插入驱动器时基本上暂停,因此您应该不会发现它占用太多资源。我来啦:

1) 启动 Powershell ISE,它可以在您的开始菜单中的附件/Windows Powershell 下找到。2)将以下内容复制粘贴到Powershell中:

#Requires -version 2.0
Register-WmiEvent -Class win32_VolumeChangeEvent -SourceIdentifier volumeChange
write-host (get-date -format s) " Beginning script..."
do{
$newEvent = Wait-Event -SourceIdentifier volumeChange
$eventType = $newEvent.SourceEventArgs.NewEvent.EventType
$eventTypeName = switch($eventType)
{
1 {"Configuration changed"}
2 {"Device arrival"}
3 {"Device removal"}
4 {"docking"}
}
write-host (get-date -format s) " Event detected = " $eventTypeName
if ($eventType -eq 2)
{
$driveLetter = $newEvent.SourceEventArgs.NewEvent.DriveName
$driveLabel = ([wmi]"Win32_LogicalDisk='$driveLetter'").VolumeName
write-host (get-date -format s) " Drive name = " $driveLetter
write-host (get-date -format s) " Drive label = " $driveLabel
# Execute process if drive matches specified condition(s)
if ($driveLetter -eq 'Z:' -and $driveLabel -eq 'Mirror')
{
write-host (get-date -format s) " Starting task in 3 seconds..."
start-sleep -seconds 3
start-process "Z:\sync.bat"
}
}
Remove-Event -SourceIdentifier volumeChange
} while (1-eq1) #Loop until next event
Unregister-Event -SourceIdentifier volumeChange
Run Code Online (Sandbox Code Playgroud)

3)需要修改上面的脚本,告诉脚本要找什么驱动,要执行什么。要更改的两行是:

if ($driveLetter -eq 'Z:' -and $driveLabel -eq 'Mirror')
Run Code Online (Sandbox Code Playgroud)

我的名为“Mirror”的 USB 硬盘驱动器设置为 Z: 驱动器。if ($driveLabel -eq 'MyDiskLabel')如果你不关心这封信,你可以使用。

start-process "Z:\sync.bat"
Run Code Online (Sandbox Code Playgroud)

你想做的任何任务的路径。在我的示例中,我在我的 USB 驱动器上创建了一个批处理文件,它启动 3-4 个备份任务命令行。

4)完成后,将脚本保存在某处(扩展名.ps1),然后在任务计划程序中创建一个任务,让脚本在后台运行。我的看起来像这样:

  • 触发:登录时
  • 行动:启动一个程序
  • 程序/脚本:powershell
  • 添加参数: -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"

5) 瞧!

6)额外的东西:

如果您希望隐藏脚本窗口,请使用以下参数:

  • 添加参数:
    -WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"

如果要将脚本消息输出到日志文件中(每次脚本启动时都会被覆盖,即在登录时),请使用以下任务操作:

  • 程序/脚本:cmd
  • 添加参数:
    /c powershell -WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1" > "D:\Stuff\script log.txt"

任何时候您想结束正在运行的隐藏脚本,您都可以在任务管理器中结束“Powershell”进程。

唯一的缺点是,当您在已插入驱动器的情况下启动计算机时,什么都不会运行。(虽然最初可以更改脚本以执行第一次检查,但我今天已经受够了!)


gar*_*rbb 8

我能够让它工作:我在应用程序和服务日志中发现事件 1003,对于插入 USB 的手机,Microsoft-Windows-DriverFrameworks-UserMode

事件的完整 xml:

- <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
- <System>
  <Provider Name="Microsoft-Windows-DriverFrameworks-UserMode" Guid="{2E35AAEB-857F-4BEB-A418-2E6C0E54D988}" /> 
  <EventID>1003</EventID> 
  <Version>1</Version> 
  <Level>4</Level> 
  <Task>17</Task> 
  <Opcode>1</Opcode> 
  <Keywords>0x8000000000000000</Keywords> 
  <TimeCreated SystemTime="2016-08-19T01:42:06.292278900Z" /> 
  <EventRecordID>17516</EventRecordID> 
  <Correlation /> 
  <Execution ProcessID="456" ThreadID="2932" /> 
  <Channel>Microsoft-Windows-DriverFrameworks-UserMode/Operational</Channel> 
  <Computer>XXXX</Computer> 
  <Security UserID="S-1-5-18" /> 
  </System>
- <UserData>
- <UMDFDriverManagerHostCreateStart lifetime="{AFEC92AD-6015-4AB4-86AE-F34CEE06A977}" xmlns:auto-ns2="http://schemas.microsoft.com/win/2004/08/events" xmlns="http://www.microsoft.com/DriverFrameworks/UserMode/Event">
  <HostGuid>{193a1820-d9ac-4997-8c55-be817523f6aa}</HostGuid> 
  <DeviceInstanceId>USB.VID_04E8&PID_6860&MS_COMP_MTP&SAMSUNG_ANDROID.6&3400EB54&1&0000</DeviceInstanceId> 
  </UMDFDriverManagerHostCreateStart>
  </UserData>
  </Event>
Run Code Online (Sandbox Code Playgroud)

以及我的任务的自定义事件过滤器:

<QueryList>
  <Query Id="0" Path="Microsoft-Windows-DriverFrameworks-UserMode/Operational">
    <Select Path="Microsoft-Windows-DriverFrameworks-UserMode/Operational">*[System[Provider[@Name='Microsoft-Windows-DriverFrameworks-UserMode'] and EventID=1003]] and *[UserData[UMDFDriverManagerHostCreateStart[DeviceInstanceId="USB.VID_04E8&amp;PID_6860&amp;MS_COMP_MTP&amp;SAMSUNG_ANDROID.6&amp;3400EB54&amp;1&amp;0000"]]]</Select>
  </Query>
</QueryList>
Run Code Online (Sandbox Code Playgroud)

同样,对于 USB 驱动器,事件为 2100、2101、2105、2106
对于特定 USB 驱动器:

- <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
- <System>
  <Provider Name="Microsoft-Windows-DriverFrameworks-UserMode" Guid="{2E35AAEB-857F-4BEB-A418-2E6C0E54D988}" /> 
  <EventID>2101</EventID> 
  <Version>1</Version> 
  <Level>4</Level> 
  <Task>37</Task> 
  <Opcode>2</Opcode> 
  <Keywords>0x8000000000000000</Keywords> 
  <TimeCreated SystemTime="2016-08-19T01:52:37.922289600Z" /> 
  <EventRecordID>17662</EventRecordID> 
  <Correlation /> 
  <Execution ProcessID="10956" ThreadID="11892" /> 
  <Channel>Microsoft-Windows-DriverFrameworks-UserMode/Operational</Channel> 
  <Computer>XXXX</Computer> 
  <Security UserID="S-1-5-19" /> 
  </System>
- <UserData>
- <UMDFHostDeviceRequest instance="WPDBUSENUMROOT\UMB\2&37C186B&0&STORAGE#VOLUME#_??_USBSTOR#DISK&VEN_SANDISK&PROD_SANDISK_CRUZER&REV_8.02#0774230A28933B7E&0#" lifetime="{4493DBFB-81E8-4277-933D-955C4DDDD482}" xmlns:auto-ns2="http://schemas.microsoft.com/win/2004/08/events" xmlns="http://www.microsoft.com/DriverFrameworks/UserMode/Event">
- <Request major="27" minor="20">
  <Argument>0x0</Argument> 
  <Argument>0x141b</Argument> 
  <Argument>0x0</Argument> 
  <Argument>0x0</Argument> 
  </Request>
  <Status>0</Status> 
  </UMDFHostDeviceRequest>
  </UserData>
  </Event>
Run Code Online (Sandbox Code Playgroud)

"<request>"当我插入 USB 驱动器时,事件 2101 似乎发生了 3 次,标签略有不同:

<Request major="27" minor="20">
<Request major="27" minor="9">
<Request major="27" minor="0">
Run Code Online (Sandbox Code Playgroud)

我不知道这意味着什么,但这里有一个仅针对其中一个的过滤器,以避免多次触发:(这只会触发该特定的 USB 驱动器)

<QueryList>
  <Query Id="0" Path="Microsoft-Windows-DriverFrameworks-UserMode/Operational">
    <Select Path="Microsoft-Windows-DriverFrameworks-UserMode/Operational">*[System[Provider[@Name='Microsoft-Windows-DriverFrameworks-UserMode'] and  EventID=2101]] and *[UserData[UMDFHostDeviceRequest[@instance="WPDBUSENUMROOT\UMB\2&amp;37C186B&amp;0&amp;STORAGE#VOLUME#_??_USBSTOR#DISK&amp;VEN_SANDISK&amp;PROD_SANDISK_CRUZER&amp;REV_8.02#0774230A28933B7E&amp;0#" and Request[@major="27" and @minor="20"]]]]</Select>
  </Query>
</QueryList>
Run Code Online (Sandbox Code Playgroud)

请注意,& 符号必须转义为&amp;


Sna*_*ark 6

正如我在本次讨论中已经解释过的(但它是关于在移除 USB 驱动器时运行程序),USB Safely Remove虽然不是免费的,但可以在触发有关 USB 设备的某些事件时运行程序:

另一个区别于类似软件的 USB 安全删除功能是不仅在连接设备之后启动任何应用程序,而且在删除它之前。自动运行功能允许您在断开可移动硬盘驱动器的连接之前设置数据备份,使用笔式驱动器的内容运行 Total Commander,在断开 USB 介质之前自动卸载加密的 TrueCrypt 驱动器等。

在此处输入图片说明

当然,这并不能完全回答问题,因为它不是关于使用计划任务,但我认为目标是相同的,即在插入 U 盘时运行特定程序。


Eli*_*ech 5

使用 EventVwr 应该很容易。

  1. 找到您想要的事件 - 当我插入 USB 大容量存储设备时,它触发了以下事件(在应用程序类别下):20001、20003、7036 和其他一些不太相关的事件。确保针对其他 USB 设备事件测试这些事件以避免误报。

  2. 右键单击事件并单击“将任务附加到此事件”(仅在 Windows Vista 或更高版本中相关 - 对于 XP,有 CLI EventTrigger),选择“启动程序”并将其指向要运行的脚本。

  3. 要将您需要的事件参数传递给脚本,请参阅本文。在事件 20001 和 20003 下,您可以找到新存储的 UNC 路径。使用 Sysinternals Junction 实用程序,您可以创建指向 UNC 路径的链接。

  • 在 Win10 中,应用程序类别中没有任何内容。我必须转到系统并附加到事件 ID 98。这对我来说很好,因为我只会拥有那台设备,但其他设备可能无法使用 (2认同)