Dieser Artikel gilt für aktuelle Versionen von Windows 10 ab Version 1709. Lt. eines Kommentars von drundanibel funktioniert die Anleitung auch mit Windows 11.
Vorherige Versionen von Windows 10 (<1709) werden mit diesem Ereignisfilter nicht funktionieren!
Anleitung für frühere Versionen.
Für so manche Aufgabe, die man am PC zu erledigen hat, kann es sinnvoll sein, wenn ein Task mittels USB Ereignis-Trigger automatisch gestartet wird, sobald ein bestimmtes Gerät angeschlossen wird. Ich verwende diese Methode hauptsächlich um Backup-Aufgaben zu automatisieren. Sie ist USB-Geräte-spezifisch: Das heißt der Task wird nur dann gestartet, wenn genau das eine von mir definierte USB-Gerät angesteckt wird. Dies wird durch einen USB Ereignis-Trigger mit manuell erstelltem Ereignisfilter erreicht.
Natürlich gibt es für diesen Anwendungsfall einige Tools und Anleitungen im Netz, jedoch möchte ich keine App installieren müssen und keine der Anleitungen mittels Windows 10 Bordmittel hat bei mir funktioniert. Deswegen musste ich mir das ganze genauer anschauen. Vielleicht wird ja dem ein oder anderen dadurch ein bisschen Zeit erspart…
Viel Spaß beim Nachbauen!
Schritt 1: Euer USB-Gerät eindeutig identifizieren:
Startet die Ereignisanzeige und klickt euch durch, bis ihr hier angekommen seid:
Anwendungs- und Dienstprotokolle
Microsoft
Windows
DriverFrameworks-UserMode
Betriebsbereit
Danach klickt ihr auf „Protokoll aktivieren“:
Wenn ihr das erledigt habt, könnt ihr euren USB-Stick anstecken und [F5] drücken sobald er von Windows erkannt wurde, damit die Einträge in der Ereignisanzeige aktualisiert werden.
Nun noch das Event 2006 suchen und den Wert bei „InstanceId“ wegkopieren. Er beginnt (glaube ich) immer mit „SWD\…“
Schritt 2: Aufgabe für das ermittelte USB-Gerät anlegen:
Hier der funktionierende USB Ereignis-Trigger, der triggert, wenn ein von euch definierter USB-Stick angesteckt wird (Windows 10, ab Version 1709):
1 2 3 4 5 6 7 |
<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=2006]] and *[UserData[UMDFHostAddDeviceEnd[InstanceId='HIER_EUER_INSTANCE_WERT']]] </Select> </Query> </QueryList> |
Wo „HIER_EUER_INSTANCE_WERT“ steht fügt ihr den Wert ein, den ihr im Event 2006 unter „instance“ gefunden und wegkopiert habt.
Wichtig dabei ist, dass ihr den Wert zuvor HTML-kodiert und erst dann einfügt.
Einen online HTML-Encoder hab ich hier gefunden: https://opinionatedgeek.com/Codecs/HtmlEncoder
(Danach sollten alle „&“ in „&“ umgewandelt worden sein…)
Ich nehme an ihr wisst, wie man eine Aufgabe erstellt, sonst hilft Google hier bestimmt weiter…
Einfach als Trigger „Bei einem Ereignis“ auswählen. Danach auf „Benutzerdefiniert“ und „Neuer Ereignisfilter“ klicken. Reiter „XML“ auswählen und den Hacken bei „Manuell bearbeiten“ setzen:
Zu guter Letzt den angepassten Code einfügen, alles bestätigen, und sich beim ständigen Ein- und Ausstecken der USB-Geräte freuen… 😉
Nachtrag: kurze Erläuterungen für die Erstellung eines spezifischen Ereignisfilters
Rechte Maustaste auf den Eintrag in der Ereignisanzeige, dann auf Kopieren und Details als Text kopieren.
Irgendwo reinkopieren:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
Protokollname: Microsoft-Windows-DriverFrameworks-UserMode/Operational Quelle: Microsoft-Windows-DriverFrameworks-UserMode Datum: 19.01.2018 11:04:05 Ereignis-ID: 2006 Aufgabenkategorie:Treiber werden geladen, um ein neu erkanntes Gerät zu steuern. Ebene: Ausführlich Schlüsselwörter: Benutzer: Lokaler Dienst Computer: DESKTOP-L0612J8 Beschreibung: Der UMDF-Host hat den Treiber erfolgreich auf Ebene "0" geladen. Ereignis-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>2006</EventID> <Version>1</Version> <Level>5</Level> <Task>33</Task> <Opcode>2</Opcode> <Keywords>0x8000000000000000</Keywords> <TimeCreated SystemTime="2018-01-19T10:04:05.710763700Z" /> <EventRecordID>22</EventRecordID> <Correlation /> <Execution ProcessID="12968" ThreadID="6704" /> <Channel>Microsoft-Windows-DriverFrameworks-UserMode/Operational</Channel> <Computer>DESKTOP-L0612J8</Computer> <Security UserID="S-1-5-19" /> </System> <UserData> <UMDFHostAddDeviceEnd xmlns="http://www.microsoft.com/DriverFrameworks/UserMode/Event"> <LifetimeId>{F80C7C92-2E0B-442E-9882-43452C8CE1EF}</LifetimeId> <InstanceId>SWD\WPDBUSENUM\_??_USBSTOR#DISK&VEN_GENERAL&PROD_USB_FLASH_DISK&REV_1.00#0510370000000A2C&0#{53F56307-B6BF-11D0-94F2-00A0C91EFB8B}</InstanceId> <Level>0</Level> <FinalStatus>0</FinalStatus> </UMDFHostAddDeviceEnd> </UserData> </Event> |
Hier nochmal der Code für den Ereignis-Filter:
1 |
*[System[Provider[@Name='Microsoft-Windows-DriverFrameworks-UserMode'] and EventID=2006]] and *[UserData[UMDFHostAddDeviceEnd[InstanceId='SWD\WPDBUSENUM\_??_USBSTOR#DISK&VEN_GENERAL&PROD_USB_FLASH_DISK&REV_1.00#0510370000000A2C&0#{53F56307-B6BF-11D0-94F2-00A0C91EFB8B}']]] |
Vergleiche die beiden Abschnitte und verstehe die Syntax… 😉
Hier eine detaillierte Anleitung by Microsoft…
Hallo, das klappt ganz wunderbar … Vielen Dank! Was mir noch fehlt, ist das der Trigger nicht feuert, wenn das USB-Gerät beim Windows-Start bereits angeschlossen ist. Gibt es dazu vielleicht auch eine Idee? Besten Gruß, Thomas
Hi Thomas,
schön, dass es funktioniert.
Die einzige Lösung, die mir für deine Anforderung auf die Schnelle einfällt ist ein Script, welches eruiert wann der PC zuletzt gebootet wurde und dann bspw. erst triggert, wenn 5 min. seit dem letzten Start vergangen sind.
Hier findest du einige Lösungen um die Bootzeit zu ermitteln: (z.B.: wmic os get lastbootuptime)
https://superuser.com/questions/523726/how-can-i-find-out-when-windows-was-last-restarted
lg, David
Dafür braucht man dann allerdings kein Skript: Es gibt die Option „Verzögern für:“ unter „Erweiterte Einstellungen“. 30 Sekunden reichen völlig, dann klappt es … Danke für den Tip & den Schubs in die richtige Richtung!
Vielen Dank.
Klappt gut!
Uwe
Kann es sein, dass das bei 1803 nicht mehr funktioniert? Ich habe hier eine 1803 Installation, das wird nichts protokolliert, wenn ein USB Stick angeschlossen wird, obwohl die Protokollierung aktiv ist. Das Protokoll ist auch nicht leer, nur eben die typischen 20xx Codes beim Einstecken eines USB Sticks fehlen.
Puh, schon wieder Änderungen durch Windows Update?Das schau ich mir dann an, wenn die PCs, bei denen ein USB-Trigger eingerichtet ist, nicht mehr sichern… sollte ich etwas bemerken, werde ich natürlich den Post updaten.Hey Conf_t! 😉
Also bei mir funktioniert es auch mit der 1803-er Version wie hier beschrieben.
Das einzige, was ich nach dem Update machen musste, war die erneute Aktivierung des „DriverFrameworks-UserMode“ Protokolls.
lg
Hi David,
ich habe diesen Mechanismus bei vielen PC´s benutzt, bis es mir zu aufwendig wurde, nach jedem Win-Upgrade die Gerätekennung zu erneuern und den Driverframework-Usermode neu zu aktivieren (dafür habe ich inzwischen einen Registry-Eintrag gefunden). Für die wechselnde Gerätekennung habe ich auch eine Umgehungslösung. Nun aber mein Problem:
Auf zwei Rechnern mit Win10 (1803 bzw 1809) bekomme ich trotz aktivierter Logfunktion keine Einträge im Driverframework-Usermode-Protokoll.
Die Datei Microsoft-Windows-DriverFrameworks-UserMode%4Operational.evtx bleibt unverändert.
Ich habe auch mit dem Processmonitor (Sysinternals) nicht herausgefunden, welcher Prozess in die Datei schreibt (oder eben nicht). WUDFHost.exe ist es offenbar nicht. Hast Du eine Idee?
LG Peter
Hi Peter,
klingt irgendwie nach einem Fehler in einer Windows-Systemdatei. Vielleicht versuchst du mal die betroffenene PCs mittels dism zu reparieren und wenn alles nichts hilft musst du sie wohl oder übel mal neu aufsetzen.
lg, David
Vielen Dank – nutze 2004 und funktioniert noch
Danke fürs Feedback!
lg
Hi – und DANKE für die detaillierte Anleitung. Es klappt nur, wenn das Protokoll aktiviert ist. Wie kann ich verhindernt, dass das Protokoll zu groß wird? Gibt’s dafür eine Routine?
Schon gefunden! Eigenschaften -> max. Protokollgröße
Sry Ted
Funktioniert einwandfrei, vielen Dank!
Habe es erst mit dem älteren Artikel versucht und bin nach erstem Scheitern dann auf diesen hier gestoßen.
VG
Freut mich, dass es geklappt hat!
LG
Kann es sein das es unter 11 nicht geht habe in der Aufgabenplanung keinen Eintrag DriverFrameworks-UserMode. Genau genommen nicht mal Anwendungs- und Dienstprotokolle
Sorry, ich hab noch kein Windows 11. Sobald es installiert ist, werde ich den Artikel anpassen.
@Simon: Dir sind die Schritte der obigen Anleitung durcheinandergeraten. Genau lesen: Die Navigation zum Punkt DriverFrameworks-UserMode soll in der Ereignisanzeige durchgeführt werden, nicht in der Aufgabenplanung. Ich habe die Anleitung heute unter Windows 11 exakt wie beschrieben befolgen können. Und es funktioniert auf Anhieb perfekt, ich bin begeistert!
@David: Vielen Dank, sehr nützlich!
Freut mich, dass es geklappt hat und danke für die Info bez. Windows 11.
Somit funktioniert das Procedere auch mit Windows 11 und ich kann den Blog-Titel dahingehend anpassen.
Danke für die sehr gute Anleitung.
Ich habe jedoch das Problem, dass ich einen hardwareverschlüsselten USB-Stick verwende.
Das heißt, dass das USB-Device erkannt wird und dann schon die Aufgabe ausgeführt wird, obwohl der Speicher noch nicht verfügbar ist.
Hat hier jemand einen Rat für mich?
Ich würde das scripten. Entweder du baust eine einfache Verzögerung ein, die mindestens so lange ist, wie es dauert, bis der Speicher mit der Verschlüsselung bereit ist, oder du prüfst intervall-mäßig, ob das Laufwerk bereits vorhanden ist. (Z.B. mit powershell und Test-Path L:) Alle Infos dazu findest du mittels google.