Запуск запланированной задачи путем обнаружения соединения USB-устройства

Я знаю, что было обсуждено, что запуск приложения из USB-накопителя при подключении невозможно из-за ограничений автозапуска (или автоматического воспроизведения) в Win 7. Но можно создать запланированную задачу с триггером типа события , Разумеется, должно произойти событие, когда подключен диск – или любое устройство USB, если на то пошло.

Кто-нибудь знает, какой идентификатор события я должен использовать? Или, по крайней мере, какой тип события? Где я могу найти событие в средстве просмотра событий?

  • Приложение для группировки окон вместе
  • Диспетчер задач Windows 8.1 Использование памяти
  • Область уведомлений Значок объема застрял
  • Получить пиксели изображения заданного цвета
  • Как вызвать пользователя для запуска как учетные данные при двойном щелчке значка?
  • Как изменить цвет фона окна по умолчанию в Windows 10?
  • Получить пиксели изображения заданного цвета
  • Проводная сеть Windows 7
  • Смонтируйте и демонтируйте жесткий диск через скрипт / программное обеспечение
  • Есть ли способ сделать иконки панели задач больше в Windows 10?
  • Почему мне не хватает места на моем жестком диске в Windows?
  • Отключены ли события USB в Windows 7? (Когда моя мышка была украдена?)
  • 5 Solutions collect form web for “Запуск запланированной задачи путем обнаружения соединения USB-устройства”

    Планировщик задач: как автоматически синхронизировать мой USB-накопитель? Имеет этот ответ пользователь, называемый монотонным, который использует PowerShell вместе с планировщиком задач:

    У меня был такой же вопрос, как и у вас, и выработал что-то с powershell (встроенные скрипты Windows), используя методы из блога Scripting Guy здесь и здесь . Скрипт работает непрерывно как фоновый процесс, который вы можете запустить при входе в систему с планировщиком задач. Сценарий будет уведомляться всякий раз, когда новый диск подключается, а затем что-то делать (здесь вы настраиваете скрипт, а не задачу). Поскольку он в основном приостановлен, ожидая следующего подключенного диска, вы не должны находить, что он занимает много ресурсов. Здесь я иду:

    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 

    3) Вам нужно изменить сценарий выше, чтобы сообщить сценарию, какой диск искать, и что выполнять. Две строки для изменения:

     if ($driveLetter -eq 'Z:' -and $driveLabel -eq 'Mirror') 

    Мой жесткий диск usb с именем «Зеркало» установлен как диск Z:. Вы могли бы просто использовать if ($driveLabel -eq 'MyDiskLabel') если вам не if ($driveLabel -eq 'MyDiskLabel') письмо.

     start-process "Z:\sync.bat" 

    Путь любой задачи, которую вы хотите сделать. В моем примере я создал пакетный файл на моем 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» в диспетчере задач.

    Единственным недостатком является то, что ничто не будет запускаться при загрузке вашего компьютера с уже подключенным диском (сценарий может быть изменен, чтобы сначала выполнить первую проверку, но у меня было достаточно на сегодня!)

    Как я уже объяснил в этом обсуждении (но речь шла о запуске программы при удалении USB-диска), USB Safely Remove , хотя и не бесплатный, может запускать программу, когда запускаются некоторые события о USB-устройствах:

    Другая функция USB Safely Remove, отличающая ее от аналогичного программного обеспечения, запускает любые приложения не только после подключения устройства , но и перед его удалением. Функция автозапуска позволяет настроить резервное копирование данных перед отсоединением съемного жесткого диска, чтобы запустить Total Commander с содержимым ручного накопителя, автоматически отключить зашифрованный диск TrueCrypt до отключения USB-носителя и т. Д.

    Введите описание изображения здесь

    Конечно, это не полностью отвечает на вопрос, так как речь идет не о использовании запланированных задач, но цель та же самая, я думаю, это запуск конкретной программы при подключении USB-накопителя.

    Это должно быть довольно легко с помощью EventVwr.

    1. Найдите нужное событие. Когда я подключил запоминающее устройство USB, он вызвал следующие события (по категории приложений): 20001, 20003, 7036 и несколько других менее релевантных. Убедитесь, что вы проверили эти события на других событиях USB-устройств, чтобы избежать ложных срабатываний.

    2. Щелкните правой кнопкой мыши по событию и нажмите «Прикрепить задачу к этому событию» (относится только к Windows Vista или более поздней версии – для XP есть CLI EventTrigger), выберите «Запустить программу» и укажите ее на сценарий, который вы хотите запустить.

    3. Чтобы перейти к скрипту, параметры события, которые вам нужны, будут рассмотрены в этой статье . В рамках событий 20001 и 20003 вы можете найти путь UNC к новому хранилищу. С помощью утилиты Sysinternals Junction вы можете создавать ссылки на пути UNC.

    Я смог заставить это работать: я нашел событие 1003 в журналах приложений и сервисов, Microsoft-Windows-DriverFrameworks-UserMode для телефона, подключенного к USB

    Полный 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>5CG6070VFK-W7.nikonprecision.com</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> 

    И настраиваемый фильтр событий для моей задачи:

     <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> 

    Аналогично для 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>5CG6070VFK-W7.nikonprecision.com</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> 

    Похоже, что событие 2101 происходит 3 раза с немного разными тегами "<request>" когда я подключаю свой USB-накопитель:

     <Request major="27" minor="20"> <Request major="27" minor="9"> <Request major="27" minor="0"> 

    Я понятия не имею, что это значит, но вот фильтр для одного из них, чтобы избежать нескольких триггеров: (это будет срабатывать только для этого конкретного 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> 

    Обратите внимание, что амперсанды должны быть экранированы как &amp;

    Как отмечали другие, похоже, что системный журнал Event 7036 из диспетчера управления службами является единственным событием, которое надежно коррелирует с вставленным USB-накопителем. Я проверил это, вставив USB-накопитель и выполнив следующую команду powershell, чтобы перечислить все записи журнала событий из всех источников за последний час:

     get-winevent | where {$_.timecreated -ge (get-date) - (new-timespan -hour 1)} 

    К сожалению, событие 7036 генерируется каждый раз, когда диспетчер управления службами запускает или останавливает любую службу, поэтому требуется дополнительная фильтрация.

    Фильтрация, доступная в графическом интерфейсе планировщика событий / планировщика заданий, довольно проста и не позволяет фильтровать данные события – она ​​позволяет фильтровать только метаданные, которые в этом случае не сообщают вам ничего о том, какая служба имеет Изменилось состояние и какое состояние оно изменилось. Это выполняется в параметрах «param1» и «param2» EventData. Таким образом, следующий фильтр XPath может использоваться для захвата только соответствующего запуска службы:

     <QueryList> <Query Id="0" Path="System"> <Select Path="System">*[System[Provider[@Name='Service Control Manager'] and (Level=4 or Level=0) and (band(Keywords,36028797018963968)) and (EventID=7036)]] and *[EventData[ Data[@Name="param1"]="Portable Device Enumerator Service" and Data[@Name="param2"]="running" ] ] </Select> </Query> </QueryList> 

    Оттуда вы можете запустить свой скрипт, в идеале, с некоторой дополнительной логикой, чтобы проверить, что вставленный USB-накопитель – это тот, который вас интересует.

    Давайте будем гением компьютера.