Geplante Aufgabe durch Erkennen der Verbindung des USB-Geräts starten

23

Ich weiß, es wurde diskutiert, dass es nicht möglich ist, eine Anwendung von einem USB-Laufwerk aus zu starten, wenn eine Verbindung hergestellt wird . Sicherlich muss ein Ereignis eintreten, wenn das Laufwerk oder ein USB-Gerät angeschlossen wird.

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

gemisigo
quelle

Antworten:

16

Der Thread Task Scheduler: Wie synchronisiere ich meinen USB-Stick 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 (Windows Built-In Scripting) ausgearbeitet, wobei ich Techniken aus dem Scripting Guy Blog hier und hier verwendet habe . Das Skript wird kontinuierlich als Hintergrundprozess ausgeführt, den Sie bei der Systemanmeldung mit dem Taskplaner starten können. Das Skript wird benachrichtigt, wenn ein neues Laufwerk angeschlossen wird und dann etwas unternommen wird (hier konfigurieren Sie das Skript und nicht die Aufgabe). Da es während des Wartens auf das nächste angeschlossene Laufwerk im Wesentlichen angehalten wird, sollten Sie nicht feststellen, dass es viel Ressourcen beansprucht. Hier gehe ich:

1) Starten Sie Powershell ISE, das Sie in Ihrem Startmenü unter Zubehör / Windows Powershell finden. 2) Kopiere und füge folgendes in Powershell ein:

#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 mit dem Namen "Mirror" ist als Z: -Laufwerk eingestellt. Du if ($driveLabel -eq 'MyDiskLabel')könntest es einfach benutzen, wenn dir der Brief egal wäre.

start-process "Z:\sync.bat"

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

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

  • Auslöser: Bei der Anmeldung
  • 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 diese 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 beim Anmelden, ü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 "

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

Der einzige Nachteil ist, dass nichts ausgeführt wird, wenn Sie Ihren Computer mit angeschlossenem Laufwerk starten.

Harrymc
quelle
Ich denke, das wird großartig funktionieren. Lass mich daran basteln und ich
melde
1
Es funktioniert für Laufwerke. Wie kann ich dies ändern, um alle angeschlossenen USB-Geräte und nicht nur Laufwerke zu erkennen?
GiantDuck
EventType 2 erkennt jeden Geräteeingang. Um die Details herauszufinden, müssen Sie sich noch ein wenig mit dem Event befassen. $newEvent.SourceEventArgs.NewEvent
Am einfachsten ist
Schön, nach fast 4 Jahren eine vielversprechende Antwort zu sehen :) Vielen Dank, GiantDuck & harrymc.
Gemisigo
@harrymc Kannst du einen Kontext dafür bereitstellen? Ich habe noch nie Powershell benutzt. Vielen Dank!
GiantDuck
6

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

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

Bildbeschreibung hier eingeben

Dies beantwortet die Frage natürlich nicht vollständig, da es sich nicht um geplante Aufgaben handelt, sondern um dasselbe Ziel, denke ich, ein bestimmtes Programm auszuführen, wenn ein USB-Stick eingesteckt ist.

Snark
quelle
Vielen Dank, ein guter Workaround. Ich habe es versucht, aber obwohl es richtig funktioniert, versuche ich immer noch, mein ursprüngliches Ziel zu erreichen (das heißt, eine nativ verfügbare und kostenlose Lösung zu verwenden). Bisher habe ich herausgefunden, dass ich mit Event ID 2006-Ereignissen von DriverFrameworks-UserMode die Aktion auslösen kann. Es ist immer noch nicht perfekt. Die erforderlichen Informationen finden Sie in den Ereignisdetails. Ich kann sie jedoch nicht nach einem bestimmten USB-Laufwerk filtern. Wenn Sie also ein USB-Laufwerk anschließen, wird der Trigger ausgelöst.
Gemisigo
5

Mit EventVwr sollte es recht einfach sein.

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

  2. Klicken Sie mit der rechten Maustaste auf das Ereignis und klicken Sie auf "Aufgabe an dieses Ereignis anhängen" (relevant nur in Windows Vista oder höher - 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. In diesem Artikel erfahren Sie, wie Sie die Ereignisparameter an das Skript übergeben können . Unter den Ereignissen 20001 und 20003 finden Sie den UNC-Pfad zum neuen Speicher. Mit dem Sysinternals Junction-Dienstprogramm können Sie Links zu den UNC-Pfaden erstellen.

EliadTech
quelle
Ich mag die Idee, aber sie ist nicht detailliert genug. Ich kann es nicht zum Laufen bringen.
GiantDuck
@GiantDuck Für mich sieht es ziemlich direkt aus, worauf möchten Sie mich näher eingehen?
EliadTech
Ich kann die Ereignisse in der Ereignisanzeige nicht finden. (Derzeit unter Win8) Wie lautet der genaue Pfad? Danke!
GiantDuck
Ich schrieb, es ist unter "Anwendung" Protokoll mit den oben genannten Ereignisnummern. Aber ich habe dies auf Win7 getestet, daher sind die Ereignisnummern auf Win8 möglicherweise unterschiedlich. Wie ich bereits sagte, müssen Sie trotzdem einige Tests durchführen, um sicherzustellen, dass es mit jedem Gerät funktioniert, das Sie anschließen.
EliadTech
1
In Win10 wurde in der Anwendungskategorie nichts angezeigt. Ich musste zu System gehen und mich an Event ID 98 anhängen. Für mich ist das in Ordnung, da ich immer nur dieses eine Gerät haben werde, aber andere möglicherweise nicht funktionieren
dbinott
2

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

Vollständige XML der Veranstaltung:

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

Und der benutzerdefinierte 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="{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>

Es sieht so aus, als ob Event 2101 dreimal mit etwas anderen "<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 dies bedeutet, aber hier ist ein Filter für nur einen von ihnen, um mehrere Auslöser zu vermeiden: (Dies wird nur für dieses bestimmte 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 das kaufmännische Und als maskiert werden muss &amp;

Müll
quelle
1

Wie bereits erwähnt, scheint das Systemprotokollereignis 7036 aus dem Service Control Manager das einzige Ereignis zu sein, das zuverlässig mit dem Einstecken eines USB-Laufwerks korreliert. Ich habe dies überprüft, indem ich ein USB-Laufwerk angeschlossen und den folgenden Powershell-Befehl ausgeführt habe, 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 das Ereignis 7036 jedes Mal generiert, wenn der Dienststeuerungs-Manager einen Dienst erfolgreich startet oder beendet. Daher ist eine zusätzliche Filterung erforderlich.

Die in der Benutzeroberfläche der Ereignisanzeige / des Task-Schedulers verfügbare Filterung ist recht einfach und ermöglicht keine Filterung der Ereignisdaten. Sie können nur nach den Metadaten filtern, die in diesem Fall keine Informationen zu den Diensten enthalten Status geändert und in welchen Status es geändert hat. Das steht in "param1" und "param2" der EventData. Der folgende XPath-Filter kann daher verwendet werden, um nur den relevanten Dienststart 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 einer zusätzlichen Logik, um zu überprüfen, ob das USB-Laufwerk, das eingesteckt wurde, das ist, an dem Sie interessiert sind.

Sahmeepee
quelle
0

Ich habe ein besseres Ereignis (IMO) im Ereignisprotokoll unter "Anwendungs- und Dienstprotokolle-Microsoft-Windows-Ntfs_Operational" gefunden. Eventid 4. Es sieht so aus:

Ereignis-ID 4 Das NTFS-Volume wurde erfolgreich bereitgestellt.

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

Daraus können Sie einen geplanten Task-Trigger erstellen und nach Datenträgername und / oder Bezeichnung filtern. Dieses Ereignis wurde auf einer Windows Server 2019-Box gefunden, aber aus irgendeinem Grund wird es auf meinem Windows 10 (1809) -Desktop nicht angezeigt. Kann ein Ereignis nur für Server sein ....

RyanG
quelle