Technische Infos
Hier ein paar Hintergrundinformationen - was mir gerade so eingefallen ist. Manches findet sich auch an anderer Stelle in dieser Hilfe.
Windows-Dienst
USBDLM ist ein Windows-Dienst. Windows-Dienste werden als solche in die Registry eingetragen und vom "Service Control Manager" gestartet und angehalten.
Dienste laufen meist im Kontext "LocalSystem" und habe dort weitgehende Privilegien. USBDLM ist ein Win32-Dienst, also kein Kernel-Dienst. Als Kernel-Dienst könnte man ihn mit dem Start-Typ "LocalSystem" versehen - so wäre sichergestellt, dass er vor dem Nutzer-Login fertig geladen ist. Win32-Diensten ist das nicht vergönnt - hier ist "Automatisch" der frühestmögliche Start. Damit ist es möglich, dass der Nutzer eingeloggt wird, bevor USBDLM startet, siehe auch "USBDLM-Dienst startet zu spät" unter Probleme.
Balloontips
Unter Windows 2000 konnte man als Dienst noch problemlos Fenster auf dem Desktop des Nutzers anzeigen - alles was man ein Dienst brauchte war das "interactive" Flag.
Unter Windows XP klappt das nur für den ersten angemeldeten Nutzer, denn nur dieser läuft in der selben Windows-Session wie die Dienste.
Seit Vista ist Microsoft konsequent: Auch der erste Nutzer arbeitet in einer eigenen Session und Dienste mit dem "interactive" Flag werden mit einer Warnung im System-Log bestraft.
Unter Windows XP installiert sich USBDLM mit "interactive" Flag. Läuft der Nutzer in Session0 werden die Balloontips direkt durch den USBDLM-Dienst angezeigt, sonst startet USBDLM sich für einen Balloon-Tip selbst nochmal im Kontext des aktiven Nutzers.
Wer im direkten Anzeigen des Balloontips ein Sicherheitsrisiko sieht, kann in der Computer-Verwaltung unter Dienste bei USBDLM die Option "Datenaustausch zwischen Dienst und Desktop zulassen" deaktivieren.
Die USBLDM.MSI hat seit V4.6 kein "interacitve" Flag mehr.
Wenn USBDLM sich für einen Balloon-Tip selbst nochmal im Kontext des aktiven Nutzers startet, übergibt es die Daten für den Balloon-Tip per Kommandozeile.
Das kann man auch für eigene Balloontips nutzen, z.B. für einen Balloontip wenn ein BitLocker-Laufwerk angeschlossen wird, das Betriebssystem das aber nicht verarbeiten kann:
[OnArrival]
DeviceType=BitLocker
open="%usbdlmpath%\usbdlm.exe" -balloon -time=20000 -title="%FriendlyName%" -text1="Auf BitLocker-verschlüsseltes Laufwerk kann nicht zugegriffen werden" -icon=301
Die Balloontips sind keine Windows-Balloontips sondern handgemacht. Hauptgrund ist die begrenzte Textlänge der Windows-Balloons unter Windows XP, was z.B. bei mehreren NTFS-Mountpunkten ein Problem ist. Außerdem konnte man bis XP noch kein eigenes Icon festlegen, man braucht kein Tray-Icon und die Taskleiste poppt beim Anzeigen nicht hoch.
Die verfügbaren Icon-Nummer sind:
110 ein Laufwerk
112 zwei Laufwerke
113 ein CDROM-Laufwerk
114 ein USB-Laufwerk
115 ein Netz-Laufwerk
116 ein entferntes Netz-Laufwerk
117 eine SD-Karte
300 ein Info-Zeichen
301 ein Ausrufezeichen
Message-Boxen
Die USBDLM_usr.exe kann eine Message-Box anzeigen, z.B. so:
[OnUnsafeRemoval]
open="%USBDLMPATH%\USBDLM_usr.exe" -msgbox -type:0 -icon:0x30 -title:Warnung -text:%BusType%-Gerät %FriendlyName% wurde unsicher entfernt. Schäm Dich!
Type, icon und Rückgabewert (Errorlevel) entsprechen denen der Windows-API-Funtion MessageBox.
Type bezieht sich auf die angezeigten Schaltflächen wie z.B. MB_OK (0..6), icon auf das anzuzeigende Symbol wie z.B. MB_ICONERROR (0x10, 0x20, 0x30 oder 0x40).
TrueCrypt, Netz- und Subst-Laufwerke
TrueCrypt-Volumes sind keine "vollwertigen" Volumes, so kommt z.B. beim Mounten eines TrueCrypt-Volumes keine Benachrichtigung wie bei "richtigen" Laufwerken. Ebenso verhält es sich mit Netz- und Subst-Laufwerken.
Was bleibt ist eine schon bei Windows 3.0 vorhandene Benachrichtigung über neue Laufwerke bzw. eingelegte CDs, die auch bei Windows 7/8 noch an alle Fenster verschickt wird.
USBDLM hat da als Dienst schlechte Karten, wenn der Nutzer in einer anderen Session läuft, was seit Vista immer der Fall ist. Unter XP läuft der Nutzer in einer anderen Session wenn er nicht der erste gleichzeitig lokal angemeldete ist.
Hier braucht es ein Hilfsprogramm, das im Kontext des Nutzers mit einem unsichtbaren Fenster läuft und eben jene Benachrichtigung "nach unten" an den Dienst meldet. Genau das ist die USBDLM_usr.exe. Die wird geladen, wenn
- ExternalMountEvents=1
- es gibt ein [OnArrival] mit DeviceType=TrueCryptVolume
- es gibt ein [OnArrival] mit DeviceType=SubstDrive
- es gibt ein [OnArrival] mit BusType=remote
- [BalloonTips] ShowTrueCrypt=1
- [BalloonTips] ShowVirtual=1
- USBDLM Win32 unter Vista/Win7 x64 mit NoMediaNoLetter=1
Mit dem letzten Punkt wird ein Windows-Bug in der WoW64-Schicht umschifft, der wohl nicht mehr behoben wird - Windows 7 hat ihn auch noch. Mit der x64-Version von USBDLM hat sich das aber erledigt.
Seit Vista kommt noch die User Account Control (UAC) ins Spiel - hier ist der Nutzer-Kontext aufgeteilt in einen eingeschränkten und einen nicht eingeschränkten. Um Benachrichtigungen für beide zu empfangen, braucht es die USBDLM_usr zweimal. Die zweite Instanz wird geladen, wenn
- ein [OnArrival] mit DeviceType=SubstDrive mit elevated=1
- ein [OnArrival] mit BusType=remote mit elevated=1
- [BalloonTips] ShowTrueCrypt=2 oder ShowVirtual=2
Die Automatik kann man auch überstimmen:
[Settings]
LoadUsbdlm_Usr=0
- 0: nicht laden
- 1: laden wie benötigt (default)
- 2: immer laden (bei aktiver UAC für den eingeschränkten Nutzer)
- 3: immer laden (bei aktiver UAC für den eingeschränkten und den 'elevated' Nutzer)