![]() |
Schreibschutz eines Wechselmediums auslesen
Hallöchen sehr geehrte Delphi-Praxis-Community,
ich bin dabei, den Schreibschutz, also die WriteProtection, eines Mediums zu ermitteln (insbesondere eines USB-Sticks). Ich nutze den WMI Delphi Code Creator um folgenden Code zu erzeugen:
Delphi-Quellcode:
Das Problem: Es wird eine Exception mit folgendem Inhalt ausgelöst:
//-----------------------------------------------------------------------------------------------------
// This code was generated by the Wmi Delphi Code Creator (WDCC) Version 1.8.5.0 // http://code.google.com/p/wmi-delphi-code-creator/ // Blog http://theroadtodelphi.wordpress.com/wmi-delphi-code-creator/ // Author Rodrigo Ruz V. (RRUZ) Copyright (C) 2011-2014 //----------------------------------------------------------------------------------------------------- // // LIABILITY DISCLAIMER // THIS GENERATED CODE IS DISTRIBUTED "AS IS". NO WARRANTY OF ANY KIND IS EXPRESSED OR IMPLIED. // YOU USE IT AT YOUR OWN RISK. THE AUTHOR NOT WILL BE LIABLE FOR DATA LOSS, // DAMAGES AND LOSS OF PROFITS OR ANY OTHER KIND OF LOSS WHILE USING OR MISUSING THIS CODE. // //---------------------------------------------------------------------------------------------------- program GetWMI_Info; {$APPTYPE CONSOLE} uses SysUtils, ActiveX, ComObj, Variants; // Die Klasse "Win32_PhysicaMedia" stellt sämtliche Typen der Dokumentation oder // Speichergeräte, wie z. B. Bänder, CDs usw., dar. procedure GetWin32_PhysicalMediaInfo; const WbemUser =''; WbemPassword =''; WbemComputer ='localhost'; wbemFlagForwardOnly = $00000020; var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObjectSet: OLEVariant; FWbemObject : OLEVariant; oEnum : IEnumvariant; iValue : LongWord; begin; FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword); FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_PhysicalMedia','WQL',wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; while oEnum.Next(1, FWbemObject, iValue) = 0 do begin Writeln(Format('WriteProtectOn %s',[String(FWbemObject.WriteProtectOn)]));// Boolean Writeln(''); FWbemObject:=Unassigned; end; end; begin try CoInitialize(nil); try GetWin32_PhysicalMediaInfo; finally CoUninitialize; end; except on E:EOleException do Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode])); on E:Exception do Writeln(E.Classname, ':', E.Message); end; Writeln('Press Enter to exit'); Readln; end. EVariantTypeCastError: Variante des Typs (NULL) konnte nicht in Typ (String) konvertiert werden. Ist es gar nicht möglich, die Eigenschaft auszulesen? Dem Anschein nach kann nichts ausgelesen werden. Ich bin über jede hilfreiche Antwort dankbar. :) MfG -- Truther |
AW: Schreibschutz eines Wechselmediums auslesen
Theoretisch könnte es so funktionieren:
Delphi-Quellcode:
aber möglicherweise wird das in neueren WINDOWS-Versionen nicht angewendet, weil es andere Schreibschutzgründe gibt.
...
while oEnum.Next(1, FWbemObject, iValue) = 0 do begin if (FWbemObject.WriteProtectOn=false) then Writeln('WriteProtectOn OFF') else Writeln('WriteProtectOn ON'); ... |
AW: Schreibschutz eines Wechselmediums auslesen
Was ist denn das konkrete Problem am Datenträgerschreibschutz?
1. Auf dem betreffenden Laufwerk eine Textdatei erzeugen und nach einem Application.ProcessMessages überprüfen, ob es die Textdatei gibt? 2. Auf dem betreffenden Laufwerk einen bestimmten Wert in einer INI-Datei speichern und nach einem Application.ProcessMessages überprüfen, ob das Auslesen des Wertes mit dem geschriebenen Wert übereinstimmt? 3. Fehlende Schreibrechte um Laufwerk C: (neuer als XP auf C:\) zu überprüfen? Womöglich kapiere ich das Problen aber überhaupt nicht :-( Nicht von mir: ![]() MfG |
AW: Schreibschutz eines Wechselmediums auslesen
Mögliche Ursachen:
* es gibt dieses Attribut bei dem getesteten Medium nicht * dein Programm hat nicht die nötigen Rechte sowas auszulesen * ... Zitat:
Die genannten Dateizugriffe liefern sofort eine Rückmeldung, wenn nicht geschrieben werden konnte. (Exception oder Result+Fehlercode) Und selbst wenn man danach unabhängig nochmal nachsieht, ob die Datei da ist, dann hat ein ProcessMessages keinerlei Einfluß darauf. Ach ja: Das Medium ist nicht schreibgeschützt, aber über die Rechte hab ich deinem Programm verboten da reinzuschreiben. Was nun? |
AW: Schreibschutz eines Wechselmediums auslesen
@himitsu:
Alles zur Schnecke machen ist recht einfach. Fällt Dir auch was Funtionierendes ein, was von Win2000 bis 8.1 und unter Wine läuft? Ab Delphi5 oder Delphi7. Oder ab Deinem Delphi? Für's A*loch-Karteziehen brauche ich keine Hilfe aus der DP/von Dir :oops: MfG Bea: "Speichere" doch mal direkt auf einem DVD-Brenner ohne ProcessMessages. |
AW: Schreibschutz eines Wechselmediums auslesen
:oops: Das war garnicht so böse gemeint.
War mehr als Hinweis, daß, selbst wenn du dieses Problem hier irgendwie aufwändig zum Laufen bekommst, es dir am Ende eventuell doch nichts hilft, da es noch viele andere Dinge gibt, welche dein Vorhaben scheitern lassen könnten. > Probleme beim Treiber, das Restesystem usw. Ich hatte mal einen USB-Stick mit Schreibschutzschalter, den hat kein Programm erkannt, da der Zustand des Schalters nicht softwareseiteig rausgegeben wurde. Es knallte dann einfach nur beim Schreibversuch, so als wenn man in einen defekten Sektor schreiben will. Was genau willst du denn eigentlich erreichen? ![]() |
AW: Schreibschutz eines Wechselmediums auslesen
Zitat:
Gruß K-H Ich hab ![]() Zitat:
|
AW: Schreibschutz eines Wechselmediums auslesen
Zitat:
z.B. GetLastError -> ERROR_ACCESS_DENIED, ERROR_WRITE_PROTECT, ERROR_NOT_ENOUGH_MEMORY, ERROR_DISK_FULL usw. |
AW: Schreibschutz eines Wechselmediums auslesen
@himitsu:
Also ICH möchte nicht mit dem "WMI Delphi Code Creator" herumbasteln, wenn's nur um den Schreibschutz eines Datenträgers geht. Der TE ist da aber eventuell anderer Meinung? @p80286: Nö. Hast nix verpasst. Eher ich zwischen Delphi5 und XE7 :? @himitsu: Ich mein's auch nicht immer böse :wink: MfG |
AW: Schreibschutz eines Wechselmediums auslesen
@hathor Danke, jetzt wird keine Exception mehr ausgelöst. ;) Jedoch ist der Wert False, wenn ich den Stick mit dem Schreibschutz-Schalter einstecke und das Programm ausführe. Das Problem hatte himitsu ja schon angesprochen. Es ist wohl nur von der Hardware-Seite schreibgeschützt, kann jedoch von der Software-Seite ausgelesen werden.
Woher weiß dann Windows, ob der Datenträger beschreibbar ist? Allein im Kontext-Menü fallen doch Schreib-Aktionen (Löschen, Ausschneiden) weg. Das wird doch wohl nicht alles über Exceptions laufen, oder? Die Lösung mit GetVolumeInformation und FILE_READ_ONLY_VOLUME ist die, die mir geholfen hat. :D Hier ist der Code, um diese Eigenschaft auszulesen:
Delphi-Quellcode:
Hier der Code, den ich als Vorlage genommen habe:
function IsDriveWriteProtected(Drive: Char): Boolean;
const FILE_READ_ONLY_VOLUME = $00080000; var Drive_Flags: DWORD; begin if GetVolumeInformation(PChar(Drive + ':\'), nil, 0, nil, DWORD(nil^), Drive_Flags, nil, 0) then begin Result := ((Drive_Flags and FILE_READ_ONLY_VOLUME) = FILE_READ_ONLY_VOLUME) end; end; ![]() Ich danke euch allen, für eure Beiträge. :D MfG -- Truther |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:41 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 by Thomas Breitkreuz