Початок планового завдання з виявлення підключення USB-пристрою


24

Я знаю, що обговорювалося, що неможливо запустити додаток з USB-накопичувача при з'єднанні через обмеження автозапуска (або автовідтворення ??) у програмі Win 7. Але можливо створити заплановану задачу, що має тригер типу події . Безумовно, має відбутися подія, яка відбувається під час підключення накопичувача - або будь-якого USB-пристрою.

Хтось має найменшу ідею, який ідентифікатор події я повинен використовувати? Або хоча б який тип події? Де можна знайти подію у глядача?

Відповіді:


17

Планувальник завдань потоку : Як автоматично синхронізувати флешку USB? відповідає така відповідь користувачем, який називається монотонним, який використовує PowerShell разом із Планувальником завдань:

У мене виникло те саме питання, що і у вас, і я розробив щось із силовою оболонкою (вбудований в сценарій вікон), використовуючи методики із блогу Scripting Guy Blog тут і тут . Сценарій працює безперервно як фоновий процес, який можна запустити при вході в систему з планувальником завдань. Сценарій буде повідомлено щоразу, коли підключено новий диск, а потім зробіть щось (тут ви налаштуєте сценарій, а не завдання). Оскільки воно в основному призупинено під час очікування наступного підключеного накопичувача, ви не повинні знаходити, що він забирає багато ресурсів. Тут я йду:

1) Запустіть ISE Powershell, який можна знайти у вашому меню запуску в розділі Аксесуари / 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')якщо вам не було байдуже лист.

start-process "Z:\sync.bat"

Шлях будь-якого завдання, яке ви хочете виконати. У своєму прикладі я створив пакетний файл на своєму накопичувачі USB, який запускає 3-4 командних рядка завдань резервного копіювання.

4) Коли ви закінчите, збережіть сценарій кудись (розширення .ps1), а потім перейдіть до створення завдання в Планувальнику завдань, щоб ваш сценарій запускався у фоновому режимі. Моє виглядає так:

  • Тригер: Увійти в систему
  • Дія: запуск програми
  • Програма / сценарій: повноваження
  • Додати аргументи: -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" в диспетчері завдань.

Єдиним недоліком є ​​те, що при завантаженні комп'ютера з уже підключеним накопичувачем нічого не запуститься. (Сценарій міг би бути змінений для першої перевірки спочатку, але мені цього вистачало на сьогодні!)


Я думаю, що це буде чудово. Дозвольте поцікавитися цим, і я повернуся до вас
GiantDuck

1
Це працює для накопичувачів. Як я можу змінити це, щоб виявити будь- який вставлений USB-пристрій, а не лише диски?
GiantDuck

EventType 2 виявить будь-який прихід пристрою. Ознайомлення з деталями потребує ще деякого заглиблення у подію. Найпростішим може бути друк членів $newEvent.SourceEventArgs.NewEventдля тих подій, які вас цікавлять.
harrymc

Приємно бачити багатообіцяючу відповідь через майже 4 роки :) Дуже дякую, GiantDuck & harrymc.
gemisigo

@harrymc Чи можете ви надати певний контекст для цього? Я ніколи раніше не використовував powerhell. Спасибі!
GiantDuck

6

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

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

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

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


Дуже дякую, хороший спосіб вирішення. Я спробував це, але, незважаючи на те, що він працює належним чином, я все ще намагаюся досягти своєї первісної мети (тобто, використовуючи доступне та безкоштовне рішення). Поки я зрозумів, що за допомогою подій ID ID 2006 від DriverFrameworks-UserMode я можу викликати дію. Це все ще не ідеально. Необхідна інформація доступна в деталях події, але я не можу відфільтрувати її для конкретного USB-накопичувача, тому підключення будь-якого USB-накопичувача призведе до запуску тригера.
gemisigo

5

Використовувати EventVwr це повинно бути досить просто.

  1. Знайдіть потрібну подію - Коли я підключив USB-накопичувач масового зберігання, він викликав такі події (під категорією додатків): 20001, 20003, 7036 та кілька інших менш релевантних. Переконайтесь, що ви протестуєте ці події на інших подіях USB-пристроїв, щоб уникнути помилкових позитивних результатів.

  2. клацніть правою кнопкою миші на події та натисніть "Приєднати завдання до цієї події" (актуально лише для Windows Vista або вище - для XP є CLI EventTrigger), виберіть "Запустити програму" та вкажіть її на сценарій, який потрібно запустити.

  3. Щоб перейти до сценарію потрібні вам параметри, ознайомтеся з цією статтею . За подіями 20001 та 20003 ви можете знайти шлях UNC до нового сховища. За допомогою утиліти Sysinternals Junction ви можете створити посилання на контури UNC.


Мені подобається ідея цього, але вона недостатньо детальна; Я не можу змусити його працювати.
GiantDuck

@GiantDuck Для мене це виглядає досить прямолінійно, на чому ви б хотіли, щоб я розробив це?
EliadTech

Я не можу знайти зазначені події в переглядачі подій. (На даний момент Win8) Який точний шлях? Дякую!
GiantDuck

Я написав, що це в журналі "додаток" із зазначеними вище номерами подій. Але я перевірив це на Win7, тому, можливо, на Win8 кількість подій відрізняється. Як я вже говорив, вам доведеться все-таки пройти тестування, щоб переконатися, що він буде працювати з будь-яким пристроєм, який ви підключаєте.
EliadTech

1
У програмі Win10 нічого не з’явилось у категорії «Application» Мені довелося перейти до системи та приєднатись до ідентифікатора події 98. Мені це добре, тому що я
матиму

2

Мені вдалося змусити цю роботу: я знайшов події 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;


1

Як уже згадували інші, схоже, що системний журнал Event 7036 від диспетчера управління сервісом - єдина подія, яка надійно співвідноситься із вставленим USB-накопичувачем. Я перевірив це, вставивши USB-накопичувач і запустивши наступну команду powerhell, щоб перерахувати всі записи журналу подій з усіх джерел за останню годину:

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-накопичувач - той, який вас цікавить.


0

Я знайшов кращу подію (IMO) з журналу подій, що знаходиться в розділі Програми та журнали сервісів-Microsoft-Windows-Ntfs_Operational. Eventid 4. Це виглядає приблизно так:

Ідентифікатор події 4 Обсяг NTFS успішно встановлений.

       Volume GUID: {55bf0ee3-d507-4031-a60a-22e5892ebf37}
       Volume Name: E:
       Volume Label: AirGapDrive A
       Device Name: \Device\HarddiskVolume51

З цього ви можете створити запланований тригер завдання та фільтрувати за назвою тома та міткою. Ця подія була знайдена у вікні Windows Server 2019, однак я чомусь не бачу її на робочому столі Windows 10 (1809). Може бути лише серверною подією ....

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.