Je sais qu'il a été discuté du fait qu'il n'est pas possible de démarrer une application à partir d'un lecteur USB lors d'une connexion en raison de limitations d'autorun (ou autoplay ??) dans Win 7. Mais il est possible de créer une tâche planifiée ayant un déclencheur de type d'événement . Il doit sûrement y avoir un événement lorsque le lecteur - ou tout autre périphérique USB, est connecté.
Quelqu'un a-t-il la moindre idée de l'ID d'événement à utiliser? Ou du moins quel type d'événement? Où puis-je trouver l'événement dans l'observateur d'événements?
Le planificateur de tâches : comment synchroniser automatiquement ma clé USB? reçoit cette réponse d'un utilisateur appelé monotone, qui utilise PowerShell avec le planificateur de tâches:
J'avais la même question que vous et j'ai mis au point quelque chose avec powershell (script intégré à Windows) en utilisant les techniques du Scripting Guy Blog ici et ici . Le script s'exécute en continu en tant que processus en arrière-plan, que vous pouvez démarrer à la connexion système avec le planificateur de tâches. Le script sera averti chaque fois qu'un nouveau lecteur est branché, puis fait quelque chose (ici, vous configurez le script plutôt que la tâche). Comme il est essentiellement en pause pendant l'attente du prochain disque branché, vous ne devriez pas trouver qu'il nécessite beaucoup de ressources. J'y vais:
1) Lancez Powershell ISE, qui se trouve dans votre menu Démarrer sous Accessoires/Windows Powershell. 2) Copier coller ce qui suit dans 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) Vous devez modifier le script ci-dessus pour indiquer au script quel lecteur rechercher et quoi exécuter. Les deux lignes à modifier sont:
if ($driveLetter -eq 'Z:' -and $driveLabel -eq 'Mirror')
Mon disque dur USB nommé "Mirror" est défini comme lecteur Z:. Vous pouvez simplement utiliser
if ($driveLabel -eq 'MyDiskLabel')
si vous ne vous souciez pas de la lettre.start-process "Z:\sync.bat"
Chemin de la tâche que vous voulez faire. Dans mon exemple, j'ai créé un fichier de commandes sur mon lecteur USB qui démarre 3-4 lignes de commande de tâches de sauvegarde.
4) Lorsque vous avez terminé, enregistrez votre script quelque part (extension
.ps1
), puis créez une tâche dans le Planificateur de tâches pour que votre script soit exécuté en arrière-plan. Le mien ressemble à ceci:
- Déclencheur: à la connexion
- Action: démarrer un programme
- Programme/script: Powershell
- Ajouter des arguments:
-ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"
5) Voilà!
6) trucs supplémentaires:
Si vous souhaitez que votre fenêtre de script soit masquée, utilisez ces arguments:
- Ajouter des arguments:
-WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"
Si vous souhaitez exporter les messages du script dans un fichier journal (qui est écrasé à chaque démarrage du script, c'est-à-dire lors de la connexion), utilisez l'action suivante:
- Programme/script: cmd
- Ajouter des arguments:
/c powershell -WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1" > "D:\Stuff\script
log.txt "Chaque fois que vous souhaitez mettre fin au script masqué en cours d'exécution, vous pouvez mettre fin au processus "Powershell" dans le Gestionnaire des tâches.
Le seul inconvénient est que rien ne fonctionnera lorsque vous démarrez votre ordinateur avec le lecteur déjà branché. (Le script peut être modifié pour effectuer une première vérification au départ, mais j'en ai assez pour aujourd'hui!)
Comme je l'ai déjà expliqué sur cette discussion (mais il s'agissait d'exécuter un programme lorsqu'un périphérique USB est supprimé), USB Safely Remove , bien que n'étant pas libre, peut exécuter un programme lorsque certains événements concernant les périphériques USB sont déclenchés:
Une autre fonctionnalité USB Safely Remove qui le distingue des logiciels similaires consiste à démarrer toutes les applications non seulement après la connexion d'un périphérique , mais également avant de le supprimer. La fonction d'exécution automatique vous permet de configurer la sauvegarde des données avant de déconnecter un disque dur amovible, d'exécuter Total Commander avec le contenu du lecteur de stylo, de démonter automatiquement un lecteur TrueCrypt crypté avant de déconnecter le support USB, etc.
Bien sûr, cela ne répond pas complètement à la question, car il ne s'agit pas d'utiliser des tâches planifiées, mais l'objectif est le même, je pense, qui consiste à exécuter un programme spécifique lorsqu'une clé USB est connectée.
Cela devrait être assez facile avec EventVwr.
Recherchez l'événement que vous souhaitez - Lorsque j'ai branché un périphérique de stockage de masse USB, il a déclenché les événements suivants (sous catégorie d'application): 20001, 20003, 7036 et quelques autres moins pertinents. Assurez-vous de tester ces événements avec d'autres événements de périphériques USB pour éviter les faux positifs.
faites un clic droit sur l'événement et cliquez sur "Attacher une tâche à cet événement" (pertinent uniquement dans Windows Vista ou supérieur - pour XP il y a CLI EventTrigger), choisissez "Démarrer un programme" et pointez-le sur le script souhaité. courir.
Pour transmettre au script les paramètres d’événement dont vous avez besoin, consultez cet article . Sous les événements 20001 et 20003, vous pouvez trouver le chemin UNC vers le nouveau stockage. À l'aide de l'utilitaire Sysinternals Junction, vous pouvez créer des liens vers les chemins UNC.
J'ai réussi à faire en sorte que cela fonctionne: j'ai trouvé l'événement 1003 dans les journaux des applications et des services, Microsoft-Windows-DriverFrameworks-UserMode pour un téléphone branché sur USB.
Full xml de l'événement:
- <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>
Et le filtre d'événements personnalisé pour ma tâche:
<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&PID_6860&MS_COMP_MTP&SAMSUNG_Android.6&3400EB54&1&0000"]]]</Select>
</Query>
</QueryList>
De même pour une clé USB c'était l'événement 2100, 2101, 2105, 2106
Pour un lecteur USB spécifique:
- <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>
Il semble que l'événement 2101 se produise 3 fois avec des balises "<request>"
légèrement différentes lorsque je connecte mon lecteur USB:
<Request major="27" minor="20">
<Request major="27" minor="9">
<Request major="27" minor="0">
Je n'ai aucune idée de ce que cela signifie, mais voici un filtre pour un seul d'entre eux afin d'éviter plusieurs déclencheurs: (cela ne se déclenchera que pour ce lecteur USB spécifique)
<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&37C186B&0&STORAGE#VOLUME#_??_USBSTOR#DISK&VEN_SANDISK&PROD_SANDISK_CRUZER&REV_8.02#0774230A28933B7E&0#" and Request[@major="27" and @minor="20"]]]]</Select>
</Query>
</QueryList>
Notez que les esperluettes doivent être échappées en tant que &
Comme d'autres l'ont mentionné, il semble que l'événement de journal système 7036 de Service Control Manager soit le seul événement à corréler de manière fiable avec une clé USB insérée. J'ai vérifié cela en insérant un lecteur USB et en exécutant la commande powershell suivante pour répertorier toutes les entrées du journal des événements de toutes les sources au cours de la dernière heure:
get-winevent | where {$_.timecreated -ge (get-date) - (new-timespan -hour 1)}
Malheureusement, cet événement 7036 est généré chaque fois que Service Control Manager démarre ou arrête un service, vous devez donc effectuer un filtrage supplémentaire.
Le filtrage disponible dans l'interface graphique de l'Observateur d'événements/Planificateur de tâches est assez basique et ne permet aucun filtrage sur les données d'événement. Il vous permet uniquement de filtrer les métadonnées qui, dans ce cas, ne vous disent rien du service fourni. a changé d'état et dans quel état il a changé. Cela se tient dans "param1" et "param2" de EventData. Le filtre XPath suivant peut donc être utilisé pour ne capturer que le service correspondant au démarrage:
<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>
À partir de là, vous pouvez exécuter votre script, idéalement avec une logique supplémentaire en place pour vérifier que le lecteur USB inséré est bien celui qui vous intéresse.
J'ai trouvé un meilleur événement (IMO) dans le journal des événements situé sous Applications et journaux de service - Microsoft-Windows-Ntfs_Operational. Eventid 4. Cela ressemble à ceci:
ID d'événement 4 Le volume NTFS a été monté avec succès.
Volume GUID: {55bf0ee3-d507-4031-a60a-22e5892ebf37}
Volume Name: E:
Volume Label: AirGapDrive A
Device Name: \Device\HarddiskVolume51
À partir de là, vous pouvez créer un déclencheur de tâche planifiée et filtrer par nom de volume et/ou libellé. Cet événement a été détecté sur un serveur Windows Server 2019. Toutefois, pour une raison quelconque, je ne le vois pas sur mon bureau Windows 10 (1809). Peut-être un événement réservé au serveur ....