Starten der geplanten Aufgabe durch Erkennen der Verbindung des USB-Geräts

47484
gemisigo

Ich weiß, dass es besprochen wurde, dass es in Win7 nicht möglich ist, eine Anwendung von einem USB-Laufwerk nach einer Verbindung zu starten, da Autorun (oder Autoplay ??) Beschränkungen unterliegt. Es ist jedoch möglich, eine geplante Task mit einem Ereignistyp-Trigger zu erstellen . Sicherlich muss ein Ereignis auftreten, wenn das Laufwerk - oder ein USB-Gerät - angeschlossen ist.

Hat jemand die geringste Ahnung, welche Event-ID ich verwenden soll? Oder zumindest welche Art von Veranstaltung? Wo finde ich die Veranstaltung in der Ereignisanzeige?

21

5 Antworten auf die Frage

12
harrymc

Der Thread Taskplaner: Wie synchronisiere ich mein USB-Flashlaufwerk automatisch? hat diese Antwort von einem Benutzer namens Monotone, der PowerShell zusammen mit dem Taskplaner verwendet:

Ich hatte die gleiche Frage wie Sie und habe etwas mit Powershell (in Windows eingebautes Scripting) mit Techniken aus dem Scripting Guy Blog hier und hier ausgearbeitet . Das Skript wird kontinuierlich als Hintergrundprozess ausgeführt, den Sie bei der Systemanmeldung mit Task Scheduler starten können. Das Skript wird benachrichtigt, wenn ein neues Laufwerk angeschlossen wird, und führt dann etwas aus (hier konfigurieren Sie das Skript und nicht die Task). Da es beim Warten auf das nächste gesteckte Laufwerk grundsätzlich pausiert ist, sollten Sie nicht feststellen, dass es viel Ressourcen beansprucht. Hier geh ich hin:

1) Starten Sie Powershell ISE, das Sie in Ihrem Startmenü unter Zubehör / Windows Powershell finden. 2) Kopieren Sie folgendes 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) Sie müssen das obige Skript ändern, um dem Skript mitzuteilen, nach welchem ​​Laufwerk gesucht und was ausgeführt werden soll. Die zwei zu ändernden Zeilen sind:

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

Meine USB-Festplatte namens 'Mirror' ist als Laufwerk Z: festgelegt. Sie könnten es einfach verwenden, if ($driveLabel -eq 'MyDiskLabel')wenn Sie sich nicht für den Brief interessieren.

start-process "Z:\sync.bat" 

Pfad der beliebigen Aufgabe, die Sie ausführen möchten. In meinem Beispiel habe ich eine Batch-Datei auf meinem USB-Laufwerk erstellt, die 3-4 Befehlszeilen für Sicherungsaufgaben startet.

4) Wenn Sie fertig sind, speichern Sie Ihr Skript an einer beliebigen Stelle (Erweiterung .ps1) und erstellen Sie anschließend eine Aufgabe im Taskplaner, damit das Skript im Hintergrund ausgeführt wird. Meines sieht so aus:

  • Auslöser: Beim Anmelden
  • Aktion: Starten Sie ein Programm
  • Programm / Skript: Powershell
  • Argumente hinzufügen: -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"

5) Voilà!

6) Extra Sachen:

Wenn Ihr Skriptfenster ausgeblendet werden soll, verwenden Sie folgende Argumente:

  • Argumente hinzufügen:
    -WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"

Wenn Sie die Skriptnachrichten in eine Protokolldatei ausgeben möchten (die bei jedem Start des Skripts, dh bei der Anmeldung, überschrieben wird), verwenden Sie die folgende Taskaktion:

  • Programm / Skript: cmd
  • Argumente
    /c powershell -WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1" > "D:\Stuff\script hinzufügen : log.txt "

Wenn Sie das laufende verborgene Skript beenden möchten, können Sie den "Powershell" -Prozess im Task-Manager beenden.

Der einzige Nachteil ist, dass nichts läuft, wenn Sie Ihren Computer mit bereits angeschlossenem Laufwerk booten. (Das Skript könnte geändert werden, um zunächst eine erste Überprüfung durchzuführen, aber ich habe genug für heute!)

Ich denke, das wird großartig funktionieren. Lassen Sie mich daran basteln und ich melde mich bei Ihnen GiantDuck vor 9 Jahren 0
Es arbeitet für Laufwerke. Wie kann ich dies ändern, um ** jedes ** USB-Gerät und nicht nur Laufwerke zu erkennen? GiantDuck vor 9 Jahren 1
EventType 2 erkennt die Ankunft eines Geräts. Um die Details zu erhalten, müssen Sie sich etwas mehr in die Veranstaltung einarbeiten. Am einfachsten ist es, die Mitglieder von $ newEvent.SourceEventArgs.NewEvent für die Ereignisse zu drucken, an denen Sie interessiert sind. harrymc vor 9 Jahren 0
Schön, eine vielversprechende Antwort nach fast 4 Jahren zu sehen :) Vielen Dank, GiantDuck & harrymc. gemisigo vor 9 Jahren 0
@ harrymc Kannst du etwas Kontext dazu geben? Ich habe noch nie Powershell benutzt. Vielen Dank! GiantDuck vor 9 Jahren 0
Es gibt eine enorme Menge an Material auf Google - die Abfrage "PowerShell-Tutorial" liefert etwa 863.000 Ergebnisse! Für jede Funktion, die Sie erläutern möchten, suchen Sie einfach nach "Powershell-Funktion". [Powershell ISE] (http://technet.microsoft.com/de-de/library/dd315244.aspx) ist eine Entwicklungsumgebung, in der Skripts einfach erstellt und getestet werden können. PowerShell ist für Windows-Administratoren ein Muss. harrymc vor 9 Jahren 0
Ich verwende jetzt `Win32_DeviceChangeEvent`. Vielen Dank GiantDuck vor 9 Jahren 0
@ harrymc Das Problem ist, dass ich kein Ereignis finde, wenn ich mein USB-Mikrofon einstecke. Daher kann ich diese Lösung nicht verwenden. Gibt es einen freundlicheren Weg, dies mit dem Aufgabenplaner zu tun? Ich könnte die Geräte-ID oder ähnliches verwenden. Herman Toothrot vor 7 Jahren 0
6
Snark

Wie ich bereits in dieser Besprechung erklärt habe (es ging jedoch darum, ein Programm auszuführen, wenn ein USB-Laufwerk entfernt wird), kann USB Safely Remove ein Programm ausführen, obwohl es nicht frei ist, wenn einige Ereignisse über USB-Geräte ausgelöst werden:

Eine weitere USB-Funktion zum sicheren Entfernen, die sie von ähnlicher Software unterscheidet, startet Anwendungen nicht nur nach dem Anschließen eines Geräts, sondern auch vor dem Entfernen. Mit der Autorun-Funktion können Sie vor dem Trennen einer Wechseldatenträger eine Datensicherung einrichten, Total Commander mit dem Inhalt des Pen-Laufwerks ausführen und ein verschlüsseltes TrueCrypt-Laufwerk automatisch aushängen, bevor Sie das USB-Medium trennen usw.

enter image description here

Die Frage ist natürlich nicht vollständig beantwortet, da es nicht um die Verwendung geplanter Aufgaben geht. Das Ziel ist jedoch dasselbe, denke ich, nämlich ein bestimmtes Programm auszuführen, wenn ein USB-Stick angeschlossen ist.

Vielen Dank, ein guter Workaround ist es. Ich habe es ausprobiert, aber obwohl es einwandfrei funktioniert, versuche ich immer noch, mein ursprüngliches Ziel zu erreichen (d. H. Mit einer nativ verfügbaren und kostenlosen Lösung). Bisher habe ich herausgefunden, dass ich mit der Event ID 2006-Ereignisse aus dem DriverFrameworks-UserMode die Aktion auslösen kann. Es ist immer noch nicht perfekt. Die erforderlichen Informationen sind in den Ereignisdetails enthalten. Ich kann sie jedoch nicht nach einem bestimmten USB-Laufwerk filtern. Wenn Sie also ein USB-Laufwerk anschließen, wird der Auslöser ausgelöst. gemisigo vor 13 Jahren 0
5
EliadTech

Die Verwendung von EventVwr sollte ziemlich einfach sein.

  1. Finden Sie das gewünschte Ereignis - Wenn ich ein USB-Massenspeichergerät angeschlossen habe, löste es die folgenden Ereignisse (unter Anwendungskategorie) aus: 20001, 20003, 7036 und einige andere weniger relevante Ereignisse. Stellen Sie sicher, dass Sie diese Ereignisse mit den Ereignissen anderer USB-Geräte testen, um Fehlalarme zu vermeiden.

  2. Klicken Sie mit der rechten Maustaste auf das Ereignis und klicken Sie auf "Aufgabe an dieses Ereignis anhängen" (nur in Windows Vista oder höher relevant - für XP gibt es CLI EventTrigger), wählen Sie "Programm starten" und zeigen Sie auf das Skript, das Sie ausführen möchten.

  3. Um die Ereignisparameter an das Skript zu übergeben, sehen Sie in diesem Artikel nach . Unter den Ereignissen 20001 und 20003 finden Sie den UNC-Pfad zum neuen Speicher. Mit dem Dienstprogramm Sysinternals Junction können Sie Links zu den UNC-Pfaden erstellen.

Ich mag die Idee davon, aber sie ist nicht detailliert genug. Ich kann es nicht zum Laufen bringen. GiantDuck vor 9 Jahren 0
@GiantDuck Für mich sieht es ziemlich unkompliziert aus, auf was soll ich Sie näher eingehen? EliadTech vor 9 Jahren 0
Ich kann besagte Ereignisse nicht in der Ereignisanzeige finden. (Derzeit unter Win8) Wie lautet der genaue Pfad? Vielen Dank! GiantDuck vor 9 Jahren 0
Ich schrieb, es ist unter "Anwendungsprotokoll" mit den oben genannten Ereignisnummern. Aber ich habe das auf Win7 getestet, vielleicht sind die Event-Nummern auf Win8 anders. Wie gesagt, Sie müssen trotzdem ein paar Tests durchführen, um sicherzustellen, dass es mit jedem Gerät funktioniert, das Sie anschließen. EliadTech vor 9 Jahren 0
In Win10 erschien nichts in der Kategorie "Anwendung". Ich musste zu System gehen und an Event ID 98 anhängen. Es ist für mich in Ordnung, weil ich immer nur dieses eine Gerät haben werde, aber andere funktionieren möglicherweise nicht dbinott vor 8 Jahren 1
2
garbb

Ich konnte dies zum Laufen bringen: Ich fand Ereignis 1003 in Anwendungen und Dienstprotokollen, Microsoft-Windows-DriverFrameworks-UserMode für ein in USB angeschlossenes Telefon

Vollständiges XML der Veranstaltung:

- <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"> - <System> <Provider Name="Microsoft-Windows-DriverFrameworks-UserMode" Guid="" />  <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="" xmlns:auto-ns2="http://schemas.microsoft.com/win/2004/08/events" xmlns="http://www.microsoft.com/DriverFrameworks/UserMode/Event"> <HostGuid></HostGuid>  <DeviceInstanceId>USB.VID_04E8&PID_6860&MS_COMP_MTP&SAMSUNG_ANDROID.6&3400EB54&1&0000</DeviceInstanceId>  </UMDFDriverManagerHostCreateStart> </UserData> </Event> 

Und den benutzerdefinierten Ereignisfilter für meine Aufgabe:

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

Ähnlich war es für ein USB-Laufwerk Ereignis 2100, 2101, 2105, 2106
Für ein bestimmtes USB-Laufwerk:

- <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"> - <System> <Provider Name="Microsoft-Windows-DriverFrameworks-UserMode" Guid="" />  <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="" 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> 

Es sieht so aus, als ob das Ereignis 2101 3 mal mit etwas unterschiedlichen "<request>"Tags passiert, wenn ich mein USB-Laufwerk einstecke:

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

Ich habe keine Ahnung, was das bedeutet, aber hier ist ein Filter für nur einen von ihnen, um mehrere Auslöser zu vermeiden: (Dies wird nur für dieses spezielle USB-Laufwerk ausgelöst)

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

Beachten Sie, dass die Et-Zeichen als Escape-Zeichen definiert werden müssen &amp;

1
sahmeepee

Wie bereits erwähnt, scheint das Systemprotokoll-Ereignis 7036 vom Service Control Manager das einzige Ereignis zu sein, das zuverlässig mit dem Einfügen eines USB-Laufwerks korreliert. Ich überprüfte dies, indem ich ein USB-Laufwerk einlegte und den folgenden Powershell-Befehl ausführte, um alle Ereignisprotokolleinträge aus allen Quellen in der letzten Stunde aufzulisten:

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

Leider wird dieses Ereignis 7036 jedes Mal generiert, wenn der Dienststeuerungs-Manager einen Dienst erfolgreich startet oder stoppt. Daher ist eine zusätzliche Filterung erforderlich.

Die in der GUI von Event Viewer / Task Scheduler verfügbare Filterung ist recht einfach und lässt keine Filterung der Ereignisdaten zu. Sie können nur nach Metadaten filtern, die in diesem Fall nichts über den Dienst sagen Status geändert und in welchen Status wurde es geändert. Dies wird in "param1" und "param2" der EventData gespeichert. Der folgende XPath-Filter kann daher verwendet werden, um nur den relevanten Dienst beim Starten zu erfassen:

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

Von dort aus können Sie Ihr Skript ausführen, idealerweise mit zusätzlicher Logik, um zu prüfen, ob das eingesetzte USB-Laufwerk das ist, an dem Sie interessiert sind.