Hallo!
Für einen u.U. öffentlich zugänglichen Computer soll ich ein Zusatzprogramm entwickeln, dass bestimmte USB-Geräte sperrt. Wichtig dabei ist, dass -im Gegensatz zu bereits bestehenden Lösungen- auch Tastatur und Maus gesperrt werden müssen. Der PC ist ein reines Anzeigesystem und die Steuerung erfolgt zur Wartung mit VNC über das Netzwerk.
Die USB-Ports werden zwar ansich nicht von dem PC gebraucht, so dass man sie im Bios deaktivieren könnte, aber ggf. muss man bei einem Systemfehler mal schnell an das System ran.
Ideal wäre, wenn
jedes USB-Gerät eine
GUID (wie MAC-Adressen bei Netzwerkkarten) hätte: also nicht eine für die komplette Klasse "Mäuse und Zeigegeräte". Dann könnte man
eine bestimmte Maus und
eine bestimmte Tastatur freischalten. Der Rest wird blockiert.
Zunächst würde mich auch soetwas langen wie:
Neues USB-Geräte wird angesteckt --> Mein Programm wirft es automatisch wieder aus, es sei denn ...
Mittels der Suchfunktion habe ich auch schon viele theoretisch sinnvolle Codeschnipsel gefunden. Ich kann diese aber leider nicht so kombinieren, dass sie alles das können, was ich brauche.
1) SwissDelphiCenter
http://www.swissdelphicenter.ch/de/showcode.php?id=2211 : ...entdecken, ob ein USB Device angeschlossen oder abgezogen wird
--> Netter Code, aber wie kann ich die Geräte wieder auswerfen oder deaktivieren?
2)
Jedi VCL JvHidControllerClass von Robert Marquardt
--> Sehr Umfangreich mit Beispielen, aber der Auswerfen-Befehl "Checkout" bewirkt keine Änderungen, ausserdem (wie der Klassenname besagt) funktioniert die Klasse nur für HIDs und nicht für alle USB Geräte.
3)
http://www.yeahware.com/ , Demo-Source Enable oder Eject
http://www.yeahware.com/download/eject.zip
--> Listet zwar viel Hardware (auch Nicht-USB), aber leider sind da meine USB-Drucker etc. nicht dabei. Deshalb gehe ich von aus, dass die Liste wohl nicht ganz komplett ist. Der Code ist schlecht/gar nicht dokumentiert. Die Eject/Disable Funktion ist so komisch an den TTreeview angepasst, in dem die Hardware steht, dass ich das leider nicht soweit ableiten kann , dass ich die Eject/Disable Funktion z.B. mit einer hDevInfo von 1) oder 2) aufrufen könnte.
Eigentliche Fragen:
Q1) Gibt es für jedes einzelne USB-Gerät auf der Welt eine
GUID wie bei den Netzwerkkarten die MAC-Adresse?
Q2) Wie kann ich eine bestimmte Hardware auswerfen/deaktivieren, z.B. mit einer hDevInfo?
Mit dem folgenden kann ich leider nichts anfangen:
Delphi-Quellcode:
function CM_Request_Device_Eject(dnDevInst: DWord; out pVetoType: TPNPVetoType;
pszVetoName: PChar; ulNameLength: ULong; ulFlags: ULong): DWord; stdcall;
external SetupApiModuleName name 'CM_Request_Device_EjectA';