Avvio dell'attività pianificata rilevando la connessione del dispositivo USB


24

So che è stato discusso che non è possibile avviare un'applicazione da un'unità USB al momento della connessione a causa delle limitazioni di esecuzione automatica (o autoplay ??) in Win 7. Ma è possibile creare un'attività pianificata con un trigger di tipo evento . Sicuramente ci deve essere un evento che si verifica quando l'unità - o qualsiasi dispositivo USB, per quella materia - è collegata.

Qualcuno ha la minima idea di quale ID evento dovrei usare? O almeno che tipo di evento? Dove posso trovare l'evento nel Visualizzatore eventi?

Risposte:


17

Il thread Utilità di pianificazione: come sincronizzare automaticamente la mia unità flash USB? ha questa risposta da un utente chiamato monotono, che utilizza PowerShell insieme all'Utilità di pianificazione:

Ho avuto la tua stessa domanda e ho elaborato qualcosa con PowerShell (scripting incorporato di Windows) usando le tecniche del Blog di Scripting Guy qui e qui . Lo script viene eseguito continuamente come processo in background, che è possibile avviare all'accesso del sistema con l'utilità di pianificazione. Lo script verrà avvisato ogni volta che viene inserita una nuova unità e quindi esegue un'operazione (qui si configura lo script anziché l'attività). Dal momento che è sostanzialmente in pausa durante l'attesa per il prossimo disco collegato, non dovresti trovare che occupa molte risorse. Eccomi:

1) Avviare Powershell ISE, che si trova nel menu Start in Accessori / Windows Powershell. 2) Copia incolla quanto segue in 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) È necessario modificare lo script sopra per dire allo script quale unità cercare e cosa eseguire. Le due righe da modificare sono:

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

Il mio disco rigido USB chiamato 'Mirror' è impostato come Z: drive. Potresti usare solo if ($driveLabel -eq 'MyDiskLabel')se non ti interessasse la lettera.

start-process "Z:\sync.bat"

Percorso di qualunque compito tu voglia fare. Nel mio esempio, ho creato un file batch sulla mia unità USB che avvia 3-4 righe di comando delle attività di backup.

4) Al termine, salva lo script da qualche parte (estensione .ps1), quindi crea un'attività in Utilità di pianificazione per eseguire lo script in background. Il mio assomiglia a questo:

  • Trigger: all'accesso
  • Azione: avviare un programma
  • Programma / script: powershell
  • Aggiungi argomenti: -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"

5) Voilà!

6) Materiale extra:

Se vuoi che la finestra dello script sia nascosta, usa questi argomenti:

  • Aggiungi argomenti:
    -WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"

Se si desidera generare i messaggi di script in un file di registro (che viene sovrascritto ogni volta che lo script viene avviato, ovvero all'accesso), utilizzare la seguente azione:

  • Programma / script: cmd
  • Aggiungi argomenti:
    /c powershell -WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1" > "D:\Stuff\script log.txt "

Ogni volta che si desidera terminare l'esecuzione dello script nascosto, è possibile terminare il processo "Powershell" in Task Manager.

L'unico aspetto negativo è che non verrà eseguito nulla all'avvio del computer con l'unità già collegata. (Lo script potrebbe essere modificato per eseguire inizialmente un primo controllo, ma per oggi ne ho abbastanza!)


Penso che funzionerà alla grande. Fammi armeggiare e tornerò da te
GiantDuck,

1
Funziona per le unità. Come posso modificarlo per rilevare qualsiasi dispositivo USB inserito e non solo unità?
GiantDuck,

EventType 2 rileverà qualsiasi arrivo del dispositivo. Ottenere i dettagli richiederà ulteriori approfondimenti sull'evento. La cosa più semplice potrebbe essere la stampa dei membri degli $newEvent.SourceEventArgs.NewEventeventi a cui sei interessato.
harrymc,

È bello vedere una promettente risposta dopo quasi 4 anni :) Grazie mille, GiantDuck e harrymc.
Gemisigo,

@harrymc Puoi fornire un contesto per questo? Non ho mai usato PowerShell prima. Grazie!
GiantDuck,

6

Come ho già spiegato in questa discussione (ma si trattava di eseguire un programma quando viene rimossa un'unità USB), USB Safely Remove , anche se non gratuito, può eseguire un programma quando vengono attivati ​​alcuni eventi sui dispositivi USB:

Un'altra funzione di rimozione sicura USB che lo distingue da un software simile sta avviando qualsiasi applicazione non solo dopo aver collegato un dispositivo , ma anche prima di rimuoverlo. La funzione di esecuzione automatica consente di impostare il backup dei dati prima di scollegare un disco rigido rimovibile, eseguire Total Commander con i contenuti della pen-drive, smontare automaticamente un'unità TrueCrypt crittografata prima di scollegare il supporto USB, ecc.

inserisci qui la descrizione dell'immagine

Naturalmente, questo non risponde completamente alla domanda, poiché non si tratta di utilizzare attività pianificate, ma l'obiettivo è lo stesso, penso, che è quello di eseguire un programma specifico quando viene inserita una chiavetta USB.


Grazie mille, una buona soluzione, lo è. L'ho provato, ma nonostante funzioni correttamente, sto ancora cercando di raggiungere il mio obiettivo originale (ovvero, utilizzando una soluzione nativa disponibile e gratuita). Finora ho capito che usando eventi Event ID 2006 da DriverFrameworks-UserMode posso innescare l'azione. Tuttavia non è ancora perfetto. Le informazioni necessarie sono disponibili nei dettagli dell'evento ma non riesco a filtrarle per una specifica unità USB, quindi collegare qualsiasi unità USB causerà l'attivazione del trigger.
gemisigo,

5

Dovrebbe essere abbastanza facile usare EventVwr.

  1. Trova l'evento desiderato: quando ho collegato un dispositivo di archiviazione di massa USB, sono stati attivati ​​i seguenti eventi (nella categoria dell'applicazione): 20001, 20003, 7036 e alcuni altri meno rilevanti. Assicurati di testare quegli eventi contro altri eventi di dispositivi USB per evitare falsi positivi.

  2. fai clic con il pulsante destro del mouse sull'evento e fai clic su "Allega attività a questo evento" (rilevante solo in Windows Vista o versioni successive - per XP c'è CLI EventTrigger), scegli "Avvia un programma" e puntalo sullo script che desideri eseguire.

  3. Per passare allo script i parametri dell'evento è necessario dare un'occhiata a questo articolo . Sotto gli eventi 20001 e 20003 è possibile trovare il percorso UNC per la nuova memoria. Utilizzando l'utilità Sysinternals Junction è possibile creare un collegamento ai percorsi UNC.


Mi piace l'idea, ma non è abbastanza dettagliata; Non riesco a farlo funzionare.
GiantDuck,

@GiantDuck Per me sembra piuttosto semplice, su cosa vorresti che elaborassi?
EliadTech,

Non riesco a trovare gli eventi detti nel Visualizzatore eventi. (Su Win8 al momento) Qual è il percorso esatto? Grazie!
GiantDuck,

Ho scritto, è nel registro 'applicazione' con i numeri degli eventi sopra menzionati. Ma l'ho provato su Win7, quindi forse su Win8 i numeri degli eventi sono diversi. Come ho detto, dovrai comunque eseguire alcuni test per assicurarti che funzioni con qualsiasi dispositivo che stai collegando.
EliadTech,

1
In Win10 non è apparso nulla nella categoria Applicazione. Ho dovuto andare al sistema e collegarmi all'ID evento 98. Va bene per me perché avrò sempre quel dispositivo, ma altri potrebbero non funzionare
dbinott

2

Sono stato in grado di farlo funzionare: ho trovato l'evento 1003 nei registri di applicazioni e servizi, Microsoft-Windows-DriverFrameworks-UserMode per un telefono collegato a USB

XML completo dell'evento:

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

E il filtro eventi personalizzato per la mia attività:

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

Allo stesso modo per un'unità USB era l'evento 2100, 2101, 2105, 2106
Per un'unità USB specifica:

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

Sembra che l'evento 2101 si verifichi 3 volte con "<request>"tag leggermente diversi quando si collega l'unità USB:

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

Non ho idea di cosa significhi, ma ecco un filtro per uno solo di essi per evitare più trigger: (questo si attiverà solo per questa specifica unità 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>

Si noti che le e commerciali devono essere salvate come &amp;


1

Come altri hanno già detto, sembra che l'evento del registro di sistema 7036 di Service Control Manager sia l'unico evento correlato in modo affidabile all'inserimento di un'unità USB. L'ho verificato inserendo un'unità USB ed eseguendo il seguente comando powershell per elencare tutte le voci del registro eventi da tutte le fonti nell'ultima ora:

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

Sfortunatamente, l'evento 7036 viene generato ogni volta che Gestione controllo servizi avvia o arresta correttamente qualsiasi servizio, pertanto è necessario un filtro aggiuntivo.

Il filtro disponibile nella GUI del Visualizzatore eventi / Utilità di pianificazione è abbastanza semplice e non consente alcun filtro sui dati dell'evento - ti consente solo di filtrare i metadati che in questo caso non ti dicono nulla su quale servizio ha stato cambiato e in quale stato è cambiato. Che si tiene in "param1" e "param2" di EventData. Il seguente filtro XPath può quindi essere utilizzato per acquisire solo il servizio rilevante all'avvio:

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

Da lì puoi eseguire il tuo script, idealmente con qualche logica aggiuntiva in atto per verificare che l'unità USB che è stata inserita sia quella a cui sei interessato.


0

Ho trovato un evento (IMO) migliore dal registro eventi situato in Registri applicazioni e servizi-Microsoft-Windows-Ntfs_Operazionale. Eventid 4. Sembra così:

ID evento 4 Il volume NTFS è stato montato correttamente.

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

Da ciò è possibile creare un trigger di attività pianificato e filtrare per nome volume o etichetta. Questo evento è stato trovato su una scatola di Windows Server 2019, tuttavia per qualche motivo non lo vedo sul mio desktop di Windows 10 (1809). Potrebbe essere un evento solo server ....

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.