AutoRun beim und nach dem Entfernen
Analog zur AutoRun-Funktion kann USBDLM beim "Vorbereiten zum sicheren Entfernen" sowie nach dem Entfernen eines Laufwerks eine Kommandozeile ausführen.
Um wirksam zu werden, muss das betreffende Gerät neu angeschlossen oder der USBDLM-Dienst neu gestartet werden.
1. Beim Vorbereiten zum sicheren Entfernen
Wird ein USB-Laufwerk über "Hardware sicher entfernen" abgemeldet, hat USBDLM noch Gelegenheit, auf diese Anfrage zu reagieren, während das Laufwerk noch verfügbar ist.
Zu lange sollte das Ausführen des Kommandos nicht dauern, die maximale Dauer die USBDLM zugesteht beträgt 10 Sekunden. Ist der gestartete Prozess dann noch nicht beendet, wird die Anfrage zum "Sicheren Entfernen" durch USBDLM zurückgewiesen, Windows meldet dann "USBDLM verhindert das Entfernen".
XP würde bis zu 30, Vista und Win7 bis zu 15 Sekunden warten.
Beispiele
Kopieren der Datei c:\text.txt in das Verzeichnis \backup auf dem zu entfernenden Laufwerk (die 10 ist wie immer eine beliebige Zahl von 1 bis 99):
[OnRemovalRequest]
open="%windir%\System32\cmd.exe" /c copy "C:\test.txt" %drive%\backup
Das Gleiche, aber nur wenn Laufwerk X: "sicher entfernt" wird
[OnRemovalRequest]
Letter=X
open="%windir%\System32\cmd.exe" /c copy "C:\test.txt" %drive%\backup
Wie oben, aber nur wenn die Datei \backup\test.txt bereits auf dem Laufwerk vorhanden ist
[OnRemovalRequest]
FileExists=%drive%\backup\test.txt
open="%windir%\System32\cmd.exe" /c copy "C:\test.txt" %drive%\backup
Ein TrueCrypt-Laufwerk auf T: unmounten, wenn die Datei geheim.tc auf dem zu entfernenden Laufwerk vorhanden ist:
[OnRemovalRequest]
FileExists=%drive%\geheim.tc
open="%ProgramFiles%\TrueCrypt\TrueCrypt.exe" /q /d T
Leider muss man den Laufwerksbuchstaben des TrueCrypt-Laufwerks kennen. Anhand des TrueCrypt-Containers (also Partition oder Datei) unmounten wäre technisch kein Problem - leider ist das bei TrueCrypt nicht vorgesehen.
Bei langwierigen Operationen ist es besser, eine Batch-Datei zu schreiben, die alles Nötige erledigt und abschließend das Laufwerk zum sicheren Entfernen vorbereitet - dafür gibt's mein Kommandozeilentool RemoveDrive:
http://www.uwe-sieber.de/drivetools.html#removedrive
Um ein laufendes Programm zu schließen, das auf das zu entfernende Laufwerk zugreifet, kann man das ab XP verfügbare Kommando tskill nutzen.
Beispiel zum Beenden eines Prozesses, der auf das Laufwerk zugreift und etwas warten, bis das erledigt ist:
[OnRemovalRequest]
Letter=X
open=tskill MeinProzess
afterdelay=2000
Einen Prozess abzuschießen ist aber nicht nett - der freundliche Weg ist, eine WM_CLOSE-Nachricht an das betreffende Anwendungs-Fenster zu senden.
USBDLM kann das betreffende Fenster anhand dessen Texts (Titelzeile) und (optional) dessen Fenster-Klasse finden.
Falls die zu schließende Anwendung nach Schließen des Fensters noch etwas Zeit braucht, kann USBDLM bis zu vier Sekunden warten.
Beispiel: Beim Versuch, Laufwerk X: abzumelden den Taschenrechner beenden und sicherheitshalber eine Sekunde warten:
[OnRemovalRequest]
Letter=X
CloseWindowText=Calc
CloseWindowClass=SciCalc
afterdelay=1000
Wildcards können verwendet werden, falls die Titelzeile des Fensters variabel ist:
[OnRemovalRequest]
Letter=X
CloseWindowText=* - Notepad
CloseWindowClass=Notepad
afterdelay=2000
Die Fensterklasse kann z.B. mit meinem Tool WinInfo ermittelt werden:
http://www.uwe-sieber.de/files/wininfo.zip
2. Beim Fehlschlagen des Vorbereitens zum sicheren Entfernen
Wenn noch auf das zu entfernende Laufwerk zugegriffen wird, schlägt das "sichere Entfernen" fehl. Man kann dann z.B. eine gelöschte Freigabe wiederherstellen:
[OnRemovalFailed]
Letter=U
open=net share Stick_U=U:\
system=1
Mit system=1 wird es im Kontext "LocalSystem" ausgeführt, so dass es die benötigten Rechte hat, auch wenn der Nutzer kein Admin ist. Zu sehen ist dann nichts, da "LocalSystem" einen eigenen Desktop hat.
3. Nach dem Entfernen
Beispiel: Laufwerk A: wurde entfernt, ein anderes Laufwerk soll auf den frei gewordenen Buchstaben gemountet werden:
[OnRemoval]
Letter=A
open=mountvol A: \\?\Volume{433619ea-c6ea-11d9-a3b2-806d6172696f}\
system=1
MountVol ist ein Kommandozeilentool das ab Windows 2000 verfügbar ist.
Ab V5.2.5 gibt es ausserdem OnSafeRemoval und OnUnsafeRemoval:
[OnUnsafeRemoval]
open="%WinDir%\System32\mplay32.exe" /play /close "%WinDir%\Media\chord.wav"
windowstyle=hidden
mplay32.exe gab es nur bis XP, ab Vista brauch man zusätzliche Software, ein VB-Script oder die Powershell um eine WAV-Datei abzuspielen ohne mit einem offenen Player zu enden.
Man kann auch die USBDLM_usr.exe nutzen, um eine Message-Box anzuzeigen:
[OnUnsafeRemoval]
open="%USBDLMPATH%\USBDLM_usr.exe" -msgbox -type:0 -icon:48 -title:Warnung -text:%BusType%-Gerät '%FriendlyName%' wurde brutal entrissen
Einschränkung
Alle beschriebenen Ereignisse beim Entfernen werden nur für Laufwerke ausgelöst, die mindestens 5 Sekunden lang angeschlossen waren.