"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

usb device automatisch entfernen

taz 20.02.2004 - 18:08 6676 3
Posts

taz

Legend

Avatar
Registered: Apr 2000
Location: ärgsten Kaff
Posts: 2233
Vor kurzem (1-4 monate) gabs im ct einen artikel über ein backupscript und danach (glaub in der nächsten ausgabe) noch einen artikel indem ein skript vorgestellt wurde mit dem ein usb device automatisch entfernt wurde und man das nicht immer manuell machen musste. hat jemand das entsprechende ct bzw das skript für mich ?

ZARO

Here to stay
Avatar
Registered: May 2002
Location: Wien 22
Posts: 964
wenn dur mir ausgabe/seite sagst :-)
such mal nach artikeln auf http://www.heise.de/ct

erlgrey

formerly known as der~erl
Registered: Aug 2002
Location: Wien
Posts: 4428
15. Andreas Beier (adb)
Und tschüss per Batch
Praxis,Hotline,Backup per Knopfdruck, DevEject, USB, automatisch abmelden
c't 25/03, Seite 209

<- damit du weisst nach was du suchen musst.

ZARO

Here to stay
Avatar
Registered: May 2002
Location: Wien 22
Posts: 964
ftp://ftp.heise.de/pub/ct/listings/0316-208.zip

Und tschüss per Batch


Ich sichere abends per Batch-Datei (Backup per Knopfdruck, c't 8/03, S. 160) meine Daten auf einen USB-Stick. Das klappt prima, es stört mich nur, dass das Skript den Speicherstöpsel nicht automatisch abmelden kann. Ich könnte sonst den Stick nach getaner Arbeit einfach abziehen.

Das hat uns ebenso gestört. Deshalb haben wir das Tool "DevEject" geschrieben (Geordneter Rückzug, c't 16/03, S. 208). Es kann etwa anhand des Laufwerkbuchstabens oder der USB-Klassenbezeichnung Geräte aus Batch-Dateien heraus abmelden.

Haben Sie Ihrem USB-Stick beispielsweise den Buchstaben B zugewiesen, melden Sie ihn mit

DevEject -EjectDrive:B

ab. Um alle USB-Massenspeicher abzumelden, genügt

DevEject "-EjectName:USB Mass Storage Device"

Fügen Sie den Dev-Eject-Befehl am Ende Ihrer Batch-Datei ein. (adb)

Soft-Link 0325206

---------------
Und originalartikel:

Matthias Withopf
Geordneter Rückzug
Geräte unter Windows automatisch abmelden
Windows erkennt externe Speichermedien wie FireWire-Platten oder USB-Sticks beim Anstecken automatisch. Aber vor dem Abstöpseln sollte man dem Betriebssystem tunlichst Bescheid sagen, sonst droht Datenverlust. Ein kleines Programm automatisiert diesen Vorgang.

USB-Stick rein, Backup der Arbeitsdaten drauf und ab nach Hause - wer dieses Feierabend-Szenario automatisieren möchte, schreibt sich eine Batchdatei, die alles Wichtige auf den Stick kopiert und vielleicht zur Sicherheit noch ein Verify durchführt. Schließlich sollte sie den Stick noch beim Betriebssystem abmelden, insbesondere, wenn für verbesserte Leistung der Schreibcache aktiviert ist. Denn sonst könnte es passieren, dass der Anwender den Stick versehentlich abzieht, bevor alle Daten aus dem Cache weggeschrieben sind, und Datenverlust oder sogar ein zerstörtes Dateisystem wäre die Folge. Mit Bordmitteln kann man immerhin den Dialog "Hardware sicher entfernen" aus einer Batchdatei öffnen:

control hotplug.dll

Dann muss der Anwender aber immer noch das zu entfernende Gerät auswählen und "Beenden", "Ok" und "Schließen" klicken - Mausklicks, die Sie sich auch sparen können. Um das Abmelden von Geräten zu automatisieren, haben wir ein C++-Programm entwickelt, das samt Quelltext zum Download bereitsteht (siehe Soft-Link). Die Lösung ist geeignet für Windows 2000, XP und Server 2003 und lässt sich leicht in eigene Projekte integrieren.



USB-Sticks besser nicht einfach abziehen, sonst droht Datenverlust.
Für das Abmelden ist die Funktion CM_Request_Device_Eject() aus der Standard-Windows-Bibliothek "setupapi.dll" zuständig. Die zugehörige Include-Datei für den "PnP Configuration Manager" ist nicht im Lieferumfang der Windows-Compiler oder im "Platform SDK" enthalten, sondern nur im "Device Driver Development Kit" (DDK) für Windows-Treiberentwickler, erhältlich im Rahmen des MSDN-Abonnements. Alternativ kann man es unter http://www.microsoft.com/whdc/ddk/ordernetddkcd.mspx bestellen. Immerhin stellt Microsoft die DDK-Dokumentation online bereit, die Erläuterung zu obiger Funktion unter [1].

Das C++-Beispielprogramm DevEject enthält die Klasse TDeviceEject und zum Abmelden die Methode Eject(). Um die Abhängigkeit von den DDK-Include-Dateien zu vermeiden, definiert es alles Notwendige selbst. Da unter Windows 9x die benötigte Funktion nicht vorhanden ist, lädt das Programm die DLL erst zur Laufzeit der Klasse und gibt bei unpassendem Betriebssystem immerhin noch eine sinnvolle Fehlermeldung aus. Bei statischem Binden würde das Betriebssystem das Programm gar nicht erst starten.

Auswerfhilfe
DevEject erwartet als Aufrufparameter die Kennung eines oder mehrerer abzumeldender Geräte. Ohne Parameter gibt es eine Liste aller zum Abmelden geeigneten Devices aus. Auch Monitore werden übrigens als auswerfbare Geräte angezeigt, aber keine Angst: Bei unseren Versuchen, einen Bildschirm "auszuwerfen", ist noch kein Monitor vom Tisch gehüpft.



Ein kleiner Trick entlockt dem Gerätemanager zusätzliche Detailinformationen.
Mit dem Parameter "-v" listet DevEject auch die nicht auswerfbaren Geräte auf und rückt sie in einer Art Baumstruktur ein, vergleichbar mit dem Gerätemanager. Um ein Gerät zu identifizieren, vergibt Windows intern Kennungen (DeviceID), die es beispielsweise aus dem Gerätetyp und -hersteller (IDE\DISKMAXTOR...) oder aus PCI-Kennungen (PCI\VEN_8086&DEV_2531...) bildet. Diese DeviceIDs lassen sich ab Windows XP auch im Gerätemanager sichtbar machen, indem man zuvor eine Umgebungsvariable setzt:

set DEVMGR_SHOW_DETAILS=1
devmgmt.msc

Im so geöffneten Gerätemanager enthält das Dialogfeld "Eigenschaften" jedes Eintrags das zusätzliche Register-Steuerelement "Details", in dem verschiedene Kategorien in einem Dropdown-Listenfeld wählbar sind. Die zum Abmelden benötigte ist als "Geräteinstanzkennung" (englisch "Device Instance Id") aufgeführt.

Weitere interessante Kategorien sind beispielsweise unter "Funktionen" zu finden, wo CM_DEVCAP_REMOVABLE anzeigt, dass das Gerät auswerfbar ist. CM_DEVCAP_SURPRISEREMOVALOK bedeutet, dass es tolerabel ist, das Gerät einfach abzuziehen, ohne Datenverlust zu riskieren.

Um ein bestimmtes Gerät abzumelden, gibt man wahlweise seinen Namen, seine Kennung oder seinen Laufwerksbuchstaben an. Beispielsweise meldet

DevEject "-EjectName:USB Mass Storage Device"

alle USB-Massenspeicher ab. Wenn der Name Leerzeichen enthält, muss er wie gezeigt zusammen mit der Option -EjectName in doppelte Anführungszeichen eingeschlossen werden. Eine Kennung (DeviceID) gibt man mit -EjectId an, das Zeichen "*" ist als Wildcard erlaubt. So meldet etwa

DevEject -EjectId:SBP2*

alle FireWire-Geräte ab (CD/DVD und Festplatten).

Falls man den Laufwerksbuchstaben kennt, lässt sich ein Gerät darüber mit der Option "-EjectDrive:x" abmelden. Das klappt allerdings nicht mit allen Geräten, denn uns ist keine Funktion bekannt, die zu einem Laufwerksbuchstaben die zugehörige DeviceID ermittelt. Das Beispielprogramm versucht, die Definition aus der Registry zu lesen, was aber in einigen Fällen scheitert. Dann ist man zum Abmelden auf den Namen oder die Kennung des Geräts angewiesen. Da das Konzept der Laufwerksbuchstaben nur aus Gründen der Kompatibilität zu "alten" Anwendungen notwendig ist, kann es passieren, dass einem Gerät kein Laufwerksbuchstabe zugeordnet ist oder dass es in einem Verzeichnis des Dateisystems (Mount Point) eingehängt ist. Auch dann muss man auf den Namen oder die Kennung ausweichen.

Mit dem "PnP Configuration Manager" lassen sich noch viele weitere nützliche Dinge erledigen, beispielsweise das Trennen eines Notebooks von seiner Docking-Station (mit den Funktionen CM_Is_Dock_Station_Present und CM_Request_Eject_PC) oder das Abfragen von Geräteeinstellungen oder Problemcodes, wenn ein Gerät nicht ordnungsgemäß funktioniert. Diese Codes tauchen auch im Gerätemanager auf und sind im DDK in der Include-Datei "cfg.h" definiert, etwa CM_PROB_NOT_CONFIGURED für den Code 1. Eine Liste der Codes und nützliche Tipps zur Fehlerbehebung sind in Microsofts Knowledge Base im Artikel 245386 zu finden. (bo)

Literatur
[1] DDK-Dokumentation zur verwendeten Systemfunktion: http://msdn.microsoft.com/library/e...gmgrfn_029e.asp

Soft-Link 0316208


--------------------------------------------------------------------------------

Zu diesem Artikel existieren Programmbeispiele
0316_208.zip
0316_208.txt

im zip sind DevEject.exe und source .cpp

mfG
RZ
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz