J'avais la même question que vous et j'ai travaillé sur quelque chose avec PowerShell (scripts intégrés Windows) en utilisant les techniques du Scripting Guy Blog ici et ici . Le script s'exécute en continu en tant que processus d'arrière-plan, que vous pouvez démarrer à l'ouverture de session système avec le planificateur de tâches. Le script sera notifié chaque fois qu'un nouveau lecteur est branché et fera quelque chose (ici vous configurez le script plutôt que la tâche). Comme il est essentiellement suspendu pendant l'attente du prochain lecteur branché, vous ne devriez pas trouver qu'il prend beaucoup de ressources. J'y vais:
1) Démarrez Powershell ISE, qui se trouve dans votre menu Démarrer sous Accessoires / Windows Powershell. 2) Copiez et collez les éléments suivants 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 le lecteur Z :. Vous pouvez simplement l'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 ma clé 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 allez créer une tâche dans le Planificateur de tâches pour que votre script s'exécute en arrière-plan. Le mien ressemble à ceci:
- Déclencheur: à la connexion
- Action: démarrer un programme
- Programme / script: PowerShell
- Ajoutez des arguments:
-ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"
5) Voilà!
6) Des trucs supplémentaires:
Si vous souhaitez que votre fenêtre de script soit masquée, utilisez ces arguments:
- Ajoutez des arguments:
-WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"
Si vous souhaitez générer les messages de script dans un fichier journal (qui est écrasé à chaque démarrage du script, c'est-à-dire à la connexion), utilisez l'action de tâche 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 terminer le 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 pourrait être modifié pour effectuer une première vérification au départ, mais j'en ai assez pour aujourd'hui!)
$newEvent.SourceEventArgs.NewEvent
événements qui vous intéressent.Comme je l'ai déjà expliqué dans cette discussion (mais il s'agissait d'exécuter un programme lorsqu'un lecteur USB est retiré), USB Safely Remove , bien qu'il ne soit pas gratuit, peut exécuter un programme lorsque certains événements concernant des périphériques USB sont déclenchés:
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 est d'exécuter un programme spécifique lorsqu'une clé USB est branchée.
la source
Cela devrait être assez simple en utilisant EventVwr.
Trouvez l'événement que vous voulez - Lorsque j'ai branché un périphérique de stockage de masse USB, il a déclenché les événements suivants (sous la catégorie d'application): 20001, 20003, 7036 et quelques autres moins pertinents. Assurez-vous de tester ces événements par rapport à 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 la 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 que vous souhaitez exécuter.
Pour passer 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.
la source
J'ai pu faire fonctionner cela: 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
Xml complet de l'événement:
Et le filtre d'événement personnalisé pour ma tâche:
De même pour un lecteur USB, c'était l'événement 2100, 2101, 2105, 2106
Pour un lecteur USB spécifique:
Il semble que l'événement 2101 se produise 3 fois avec des
"<request>"
balises légèrement différentes lorsque je branche mon lecteur USB:Je n'ai aucune idée de ce que cela signifie, mais voici un filtre pour un seul d'entre eux pour éviter plusieurs déclencheurs: (cela ne se déclenchera que pour ce lecteur USB spécifique)
Notez que les esperluettes doivent être échappées comme
&
la source
Comme d'autres l'ont mentionné, il semble que l'événement du journal système 7036 du Gestionnaire de contrôle des services est le seul événement qui soit en corrélation fiable avec un lecteur USB inséré. 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:
Malheureusement, cet événement 7036 est généré à chaque fois que le Gestionnaire de contrôle des services démarre ou arrête un service, un filtrage supplémentaire est donc nécessaire.
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 sur les métadonnées qui, dans ce cas, ne vous disent rien sur le service qui a état changé et dans quel état il a changé. Cela se trouve dans "param1" et "param2" de EventData. Le filtre XPath suivant peut donc être utilisé pour capturer uniquement le démarrage du service concerné:
De là, vous pouvez exécuter votre script, idéalement avec une logique supplémentaire en place pour vérifier que la clé USB qui a été insérée est celle qui vous intéresse.
la source
J'ai trouvé un meilleur événement (IMO) dans le journal des événements situé sous Journaux des applications et des services-Microsoft-Windows-Ntfs_Operational. Eventid 4. Il ressemble à ceci:
ID d'événement 4 Le volume NTFS a été correctement monté.
À partir de cela, vous pouvez créer un déclencheur de tâche planifié et filtrer par nom de volume et / ou étiquette. Cet événement a été trouvé sur une boîte Windows Server 2019, mais pour une raison quelconque, je ne le vois pas sur mon bureau Windows 10 (1809). Peut être un événement serveur uniquement ....
la source