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.
$newEvent.SourceEventArgs.NewEvent
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:
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.
quelle
Mit EventVwr sollte es recht einfach sein.
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.
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.
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.
quelle
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:
Und der benutzerdefinierte Ereignisfilter für meine Aufgabe:
Ähnlich war es für ein USB-Laufwerk Ereignis 2100, 2101, 2105, 2106
Für ein bestimmtes USB-Laufwerk:
Es sieht so aus, als ob Event 2101 dreimal mit etwas anderen
"<request>"
Tags passiert, wenn ich mein USB-Laufwerk einstecke: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.)
Beachten Sie, dass das kaufmännische Und als maskiert werden muss
&
quelle
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:
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:
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.
quelle
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.
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 ....
quelle