Laufwerksbuchstabe mit Seriennummer in Verbindung bringen

  • Hallo zusammen,

    bin neu hier und habe gleich mal eine Frage :).
    Ich bin momentan an einem Projekt dran bei dem ich die Lokation von Dateien auf externen Platten herausfinden möchte.
    Hierzu muss ich die Seriennummer der externen Platte irgendwie mit dem zu dem Zeitpunkt verwendeten Laufwerksbuchstaben in Verbindung bringen.
    Hintergrund:

    - Der Benutzer wählt beim ersten Start der Software einen Pfad aus, unter welchem eine Datei abgelegt wird (ist immer eine externe Festplatte)
    - Da aber nie sicher gestellt werden kann dass die Externe Festplatte den selben Laufwerksbuchstaben bekommt kann ich mich nicht nur auf einen statischen Pfad verlassen
    - Beispiel: Beim ersten Start der Software wählt der Benutzer das externe Laufwerk aus, welches zu diesem Zeitpunkt den Laufwerksbuchstaben E:\ besitzt
    Das nächste mal wenn er die externe Festplatte anschließt steckt aber auch noch ein USB Stick im Rechner welcher der externen Platte nun aber den Buchstaben E:\
    "geklaut" hat.

    Um dieses Problem anzugehen kam mir die Idee die Seriennummer auszulesen (mit DriveGetSerial). Denn in meinem jugendlichen Leichtsinn dachte ich dass diese irgendwo in der Registry mit dem aktuellen Laufwerksbuchstaben hinterlegt ist. Nun aber stehe ich hier mit der Seriennummer in der einen und einem depressiv gehaltenen "Is doch zum kotzen" Schild in der anderen Hand da^^.

    Hat einer von euch schon einmal ein ähnliches Problem gehabt oder spontan eine Idee wie ich dieses Problem angehen kann?


    Danke schon mal im Voraus fürs Lesen und etwaige Antworten:).


    so long

    DeMon

    Einmal editiert, zuletzt von DeMonToll (8. November 2013 um 11:11)

  • Kurz: Ich verstehe noch nicht wirklich was du genau machen möchtest und wo es jetzt hängt.

    Um dieses Problem anzugehen kam mir die Idee die Seriennummer auszulesen (mit DriveGetSerial). Denn in meinem jugendlichen Leichtsinn dachte ich dass diese irgendwo in der Registry mit dem aktuellen Laufwerksbuchstaben hinterlegt ist.


    Um mit DriveGetSerial die Seriennummer auszulesen, benötigst du einen Pfad mit Laufwerksbuchstaben.
    Bevor du also die Serial hast, hast du schon den Laufwerksbuchstaben den du eigentlich über DriveGetSerial herausfinden möchtest... ?

    Wenn du allerdings feststellen möchtest ob ein Laufwerk mit einer bestimmten Seriennummer angeschlossen ist kannst du einfach mit DriveGetDrive alle externen Laufwerke ermitteln und einzeln mit DriveGetSerial auf die Seriennummer hin überprüfen.

  • Hi und danke für deine Antwort.

    Zitat

    Um mit DriveGetSerial die Seriennummer auszulesen, benötigst du einen Pfad mit Laufwerksbuchstaben.

    Bevor du also die Serial hast, hast du schon den Laufwerksbuchstaben den
    du eigentlich über DriveGetSerial herausfinden möchtest... ?

    Richtig beim ersten mal habe ich einen Pfad inkl. Laufwerksbuchstabe. Da sich dieser Buchstabe aber immer ändern kann, ermittle ich die Seriennummer und speichere diese in einer ini File ab. Wenn nun der Benutzer das Programm dass nächste mal startet soll die Seriennummer aus der ini ausgelesen werden.

    Ab hier hab ich mein Problem. Ich habe eine Seriennummer die ich irgendwann mal ausgelesen habe. Jetzt möchte ich den momentanen Laufwerksbuchstaben herausfinden der zur damals ausgelesenen Seriennummer passt.


    so long

    DeMon

  • Das was AspirinJunkie schon beschrieben hat mal als Code ;)

    [autoit]

    $sDrive = ""
    $sSerial = Iniread("keineAhnung.ini", "keineAhnungSection", "KeineAhnungKey", 0)
    $aDrives = DriveGetDrive("REMOVABLE")
    For $i = 1 To $aDrives[0]
    If DriveGetSerial($aDrives[$i]) = $sSerial Then $sDrive = $aDrives[$i]
    Next

    [/autoit]
    • Offizieller Beitrag

    AutoRun haben doch die meisten ausgeschaltet (Virengefahr).
    Ich würde das von Schnitzel verwenden, aber nicht in einer permanenten Schleife, sondern die Erkennung Windows überlassen und dann den Event registrieren:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global Const $WM_DEVICECHANGE = 0x0219 ; Notifies an application of a change to the hardware configuration of a device or the computer.
    Global Const $DBT_DEVICEARRIVAL = 0x8000 ; A device or piece of media has been inserted and is now available.
    Global Const $DBT_DEVICEREMOVECOMPLETE = 0x8004 ; A device or piece of media has been removed.

    [/autoit] [autoit][/autoit] [autoit]

    ;~ ConsoleWrite(DriveGetSerial('G:') & @CR)
    Global $iSerial = 692753667 ; <- Die vorher ermittelte Seriennummer des gesuchten Laufwerks
    Global $sDriveLetter = ''

    [/autoit] [autoit][/autoit] [autoit]

    $hGui = GUICreate('Automatische Laufwerkserkennung', 380, 200)
    $idSerialDriveFound = GUICtrlCreateDummy()
    $idSerialDriveLetter = GUICtrlCreateLabel('Laufwerksbuchstabe = "-"', 10, 10, 260, 20)
    GUISetState()
    GUIRegisterMsg($WM_DEVICECHANGE, 'MY_WM_DEVICECHANGE')

    [/autoit] [autoit][/autoit] [autoit]

    While True
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $idSerialDriveFound
    $sDriveLetter = _ReadDrives()
    GUICtrlSetData($idSerialDriveLetter, 'Laufwerksbuchstabe = "' & $sDriveLetter & '"')
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func MY_WM_DEVICECHANGE($hWnd, $Msg, $wParam, $lParam)
    #forceref $hWnd, $Msg, $lParam
    Switch $wParam
    Case $DBT_DEVICEARRIVAL
    ConsoleWrite('A device or piece of media has been inserted and is now available.' & @CR)
    GUICtrlSendToDummy($idSerialDriveFound)
    Case $DBT_DEVICEREMOVECOMPLETE
    ConsoleWrite('A device or piece of media has been removed.' & @CR)
    GUICtrlSendToDummy($idSerialDriveFound)
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>MY_WM_DEVICECHANGE

    [/autoit] [autoit][/autoit] [autoit]

    Func _ReadDrives()
    Local $aDrives = DriveGetDrive('REMOVABLE')
    If @error Then Return SetError(1, 0, '-')
    For $i = 1 To $aDrives[0]
    If DriveGetSerial($aDrives[$i]) = $iSerial Then Return SetError(0, 0, StringUpper($aDrives[$i]))
    Next
    Return SetError(2, 0, '-')
    EndFunc ;==>_ReadDrives

    [/autoit]
  • So erst mal Danke für die ganzen Beträge :).
    Habe die letzten Tage damit und mit anderen Problemstellungen rumgespielt.

    Interessanterweise hat sich herausgestellt dass

    [autoit]

    DriveGetDrive("REMOVABLE")

    [/autoit]

    Probleme macht.
    Windows 7 interpretiert externe Festplatten nicht als Wechselmedium sondern als feste Platte im System.
    Ist zwar kein Problem denn per

    [autoit]

    DriveGetDrive("ALL")

    [/autoit]

    findet man dass Gerät, wissen muss man es trotzdem^^.


    Oscar : Danke für deinen Vorschlag, ich muss mir mal den Code separat zu gemüte führen, ist dann doch etwas komplexer ;).
    Und Autorun ist bei uns im Geschäft deaktiviert, wie schon richtig von dir Orakelt wurde^^.


    so long

    DeMon

  • Ich würde das von Schnitzel verwenden, aber nicht in einer permanenten Schleife


    War auch nicht als permanente Schleife gedacht sondern zur einmaligen Ausführung beim Skriptstart ^^
    Ich weiß ja nicht genau was er damit mach will
    Aber mit Erkennung neuer Devices isses natürlich ne feine Sache wenn er das braucht ;)

  • Hallo zusammen,

    bitte entschuldigt meine späte Antwort aber bin in den letzten tagen kaum zu was gekommen^^.
    Wie dem auch sei:
    - Es hat funktioniert, vielen Dank an alle :).


    Thread ist somit gelöst!


    so long

    DeMon