![]() |
Dateihandles auf einem bestimmten Laufwerk beenden
Hallo,
Ich habe folgendes Problem: Steck ich ein USB-Speicher ein wird es als Laufwerk erkannt. Auf dem stick ist nun eine Datei die ich öffne (Kann Textdatei oder sonstiges sein.) Wenn ich nun mein USB-Stick über Hardware entfernen entfernen möchte funktioniert das nicht da ja ein Handle geöffnet ist. Nun wäre das in diesem Fall kein Problem einfach die Datei zu schließen und das zu wiederholen. Problematisch wirds erst dann wenn ein externes Programm ein Handle geöffnet hat und und dann abstürzt. Das Handle wird nicht freigelassen. Somit kann ich mein USB-Stick nicht über Hardware entfernen ansteuern. Gibt es in so einem Fall eine Möglichkeit zu sagen. Kill alle Handles auf das Laufwerk u: MfG Kasoft |
Re: Dateihandles auf einem bestimmten Laufwerk beenden
Ähem ... nimm mal statt Handle einen Pointer, nur so zur Veranschaulichung.
So. Dein Programm hat also einen Puffer von, sagen wir mal 64kB und dann kommt ein Programm (eine DLL) von mir und gibt den Speicher auf den dein Pointer zeigt frei. Danach hat dein Programm viel Spaß damit auf den ungültigen (weil freigegebenen) Speicher zuzugreifen. Im übertragenen Sinne willst du genau das mit dem externen Programm bei dir machen, nur daß es keine Pointer sondern eben Handles als Referenzen auf Objekte sind. Du siehst also, daß dies ziemlich unsinnig ist - insbesondere daher, weil keine Seite auf ein Ungültigwerden der Handles vorbereitet ist, wie dies zB bei Netzlaufwerken der Fall wäre. Da hilft nur USB-Stick rausziehen - ein abruptes Schließen aller Handles in fremden Programmen würde nichts anderes bewirken und ebenfalls (potentiell) zu Datenverlust führen. |
Re: Dateihandles auf einem bestimmten Laufwerk beenden
Das ein Datenverlust entstehen kann ist mir klar. Das würde ich in kauf nehmen (sogar müssen).
Für die Anwendung wäre es sogar von großer Bedeutung das genau das passiert. Ich gehe mal von einer anderen Seite die Sache an: Ein Programm soll verbieten das USB-Sticks angeschlossen werden. Alle anderen USB-Geräte (wie Maus, Tastatur Drucker) sollen trotzdem weiter funktioren. Bis zu diesem Punkt ist das kein Problem. USB-Speicher werden innerhalb weniger ms nachdem er initialisiert ist wieder sauber entfernt. Auch Festplatten werden korrekt innerhalb ein paar ms entfernt. Jetzt gibt es aber diese MultiCardReader mit dem man z.B. 4 verschiedene Laufwerke bekommt indem man sie einstöpselt. 4 Laufwerke brauchen auch einiges an Zeit in der sie gemountet werden. Diese Zeit beträgt ca 5 Sekunden. In diesen 5 Sekunden werden die einzelnen Laufwerke hintereinander gemountet. Sprich nach der 1. Sekunde ist Laufwerk 1 da nach der 2. Laufwerk 2 usw. Jetzt ist es mir nicht möglich dieses mounten vorher abzubrechen sondern muss warten bis alle sauber gemountet sind um dann sofort wieder auszuwerfen. In dieser Zeit kann der Benutzer aber auf die schon gemounteten Laufwerke zugreifen. Und genau das darf nicht geschehen. Wenn in dieser Zeit es der Benutzer schafft eine einfache Textdatei zu öffnen bekomme ich keine Priorität um die Laufwerke abzumelden sondern muss warten bis die Textdatei beendet wird. Hier will ich jetzt eingreifen. Dafür gibts verschiedene Möglichkeiten wie zum Beispiel das gemountete Laufwerk sofort nach dem Mounten zu sperren und dann wenn alles fertig ist wieder auszuwerfen. Hieran bin ich gescheitert weil ich von Windows keine Rückmeldung bekomme welche Laufwerke wohin gemapped sind. Daher habe ich es eigentlich als einfacher erachtet alle Handles auf das Laufwerk zu "killen" (wie kann man das anders nennen...) Datenverlust darf sein. Dieses Problem gab es mal bei scandisk (oder checkdisk??). Der hat dann einfach alle Handles abgeschossen die Zugriff auf das zu prüfende Laufwerk hatten. Wenn ich die Quelle wiederfinde werde ich sie mal posten. MfG Kasoft |
Re: Dateihandles auf einem bestimmten Laufwerk beenden
Aha ;) ... jetzt kommen wir ja auch zu Potte. Schonmal dran gedacht, die ACLs auf dem Gerät zu setzen? Ich meine bei einer Tastatur oder Maus werden sicher nicht so viele Berechtigungen notwendig sein wie bei einem USB-Massenspeicher.
Noch eine Frage. Es klingt ganz nach Admin-Aufgaben. Die Mäuse sind bereits vorher eingestöpselt? Dann kannst du nämlich eventuell auch die entsprechenden Registrykeys schützen, wo die Daten zu den neuen Geräten abgelegt werden. Ist eben immer die Frage, was gemacht werden soll. |
Re: Dateihandles auf einem bestimmten Laufwerk beenden
Start => Einstellungen => Systemsteuerung => Verwaltung => Lokale Sicherheitsrichtlinien => Lokale Richtlinien => Zuweisen von Benutzerrechten => Laden und Entfernen von Gerätetreibern.
Wenn du die Rechte rausnimmst, dürften auch keine USB Wechselfestplattentreiber mehr geladen werden :) |
Re: Dateihandles auf einem bestimmten Laufwerk beenden
Zitat:
@Kasoft: Ich vermute mal, du läßt dich per Window-Message über neue Geräte informieren? Also mit RegisterDeviceNotification() registrieren und dann als Fenster oder Service reagieren (zB auf DBT_DEVICEARRIVAL)? Wenn es ein Service ist, könnte u.U. ein FSCTL_DISMOUNT_VOLUME reichen. Getestet habe ich es aber nicht - keine Zeit für sowas aktuell. |
Re: Dateihandles auf einem bestimmten Laufwerk beenden
Sind Maus und Tastaturtreiber nicht sowieso geladen?
|
Re: Dateihandles auf einem bestimmten Laufwerk beenden
Moin Kasoft,
Du müsstest nur die Rechte auf %SYSTEMROOT%\INF\USBSTOR.INF und USBSTOR.PNF für den normalen Benutzer entfernen, dann sollte man keinen Massenspeicher mehr mounten können, andere USB-Geräte funktionieren hingegen noch problemlos, da diese die USBSTOR.* nicht benötigen. |
Re: Dateihandles auf einem bestimmten Laufwerk beenden
Zitat:
|
Re: Dateihandles auf einem bestimmten Laufwerk beenden
Moin Assarbad,
gute Frage :gruebel: Schau doch mal nach, ob Du im Gerätemanager das (entfernte) Gerät noch finden kannst (ausgeblendete einblenden nicht vergessen ;-)). |
Re: Dateihandles auf einem bestimmten Laufwerk beenden
Dieses workaround mit usbstor kommt von Microsoft und ist nur begrenzt geeignet. Bei mir in der Firma sind nahezu alle Personen lokale Admins oder eben Poweruser (Hauptnutzer heißt das glaub ich). Damit könnten die sich immer Rechte geben und diese Dateien einfach reinkopieren. Desweiteren ist es nicht so das die User keine Treiber mehr installieren dürfen sondern sie dürfen kein Massenspeicher an die Rechner anschließen. Und genau das läuft ja soweit. Massenspeicher werden erkannt und automatisch wieder ausgeworfen. Sperren wäre auch möglich. Sogar PCMCIA Karten werden sauber erkannt und ausgeschmissen. Aber das Problem mit den Handles konnte ich irgendwie nicht lösen. Später soll noch eine low-level Signatur auf einige registrierte Sticks die erlaubt werden. Aber das ist Zukunftsmusik und wird noch erst implementiert.
@Assarbad FSCTL_DISMOUNT_VOLUME funktioniert leider nicht. Schon einige male ausprobiert und das Projekt wäre schier daran gescheitert. FSCTL_LOCK_VOLUME funktioniert aber die unmounten Version sehe ich als sicherer an weil in dem Fall auch noch Sichergestellt wird das man es Softwareseitig nicht mehr mounten kann. Nur physikalisches ausstecken / einstecken lässt in dem Fall den Speicher aktivieren. MfG Kasoft |
Re: Dateihandles auf einem bestimmten Laufwerk beenden
Moin Kasoft,
ich weiss ja nicht um wieviele Rechner es geht, und was für welche das sind, aber es gibt auch im BIOS mal die Möglichkeit USB-Devices im allgemeinen zuzulassen, Massenspeicher jedoch nicht. Wenn die Anwender lokale Admins sind, dürften sie i.d.R. auch keine Probleme haben Dein Programm auszuhebeln. |
Re: Dateihandles auf einem bestimmten Laufwerk beenden
Guten morgen Christian,
Auch dieses Problem wurde bedacht. Es geht um ca. 40k PCs die alle verschiedene BIOSe haben. Also sowas kommt auf keinen Fall in Frage. Ansich wäre gerade dieses Programm aushebelbar wenn nicht gleichzeitig noch ein anderes Service-Tool laufen würde das andauernd den Status des USB Programms prüft. Mal davon abgesehen hab ich mal gelesen das man wichtige System-Dienste vom selbst geschriebenen Dienst abhängig machen kann. Somit würde sich für die größte Anzahl der Anwender diese Hürde vergrößern. MfG Kasoft |
Re: Dateihandles auf einem bestimmten Laufwerk beenden
Zitat:
Zitat:
Zitat:
Zitat:
Kleiner Tip: auf Sysinternals gibt es das coole Tool LOADORD! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:28 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz