Gemountete USB-Laufwerke mit Lw-Buchstaben und Bezeichnung

    • Offizieller Beitrag

    Hi,
    mit der Funktion _GetMountedUSB_Drives() lassen sich für alle USB-Sticks (und alle als "removable" angemeldeten USB-Festplatten) Laufwerksbuchstabe und Bezeichnung zurückgeben.
    Das steht natürlich nie zusammen in der Registry, sondern kann nur über 3 Abfragen zugeordnet werden ;).

    Spoiler anzeigen
    [autoit]

    ;===============================================================================
    ;
    ; Function Name: _GetMountedUSB_Drives
    ; Description:: Ermittelt aktuell gemountete USB-Laufwerke
    ; Parameter(s): None
    ; Requirement(s): #include <string.au3>
    ; Return Value(s): 2D-Array
    ; Array[0][0] = Anzahl gemounteter USB-Laufwerke
    ; Array[n][0] = Laufwerk - Buchstabe
    ; Array[n][1] = Bezeichnung
    ; Note: Erkennt alle gemounteten USB-Sticks,
    ; USB-Festplatten werden erkannt, wenn sie als "Wechseldatenträger"
    ; im System registriert sind.
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;
    ;===============================================================================
    #include <string.au3>
    Func _GetMountedUSB_Drives()
    Local $aUSB_Drives[1][2]=[[0]]
    $var = DriveGetDrive( "Removable" )
    For $i = 1 To UBound($var) -1
    $reg = RegRead('HKLM\SYSTEM\MountedDevices', '\DosDevices\' & $var[$i])
    $val = ''
    For $k = 1 To StringLen($reg) - 2 Step 2
    $tmp = _HexToString(StringMid($reg, $k, 2))
    If $tmp <> "" Then
    $val = $val & $tmp
    EndIf
    Next
    $prefix = StringSplit($val, '#')
    If StringRight($prefix[3], 2) == 'RM' Then
    $prefix = StringTrimRight($prefix[3], 3)
    For $l= 1 to 100
    $val = RegEnumKey('HKLM\SYSTEM\CurrentControlSet\Enum\USBSTOR', $l)
    If @error <> 0 then ExitLoop
    For $n = 1 To 20
    $sub = RegEnumKey('HKLM\SYSTEM\CurrentControlSet\Enum\USBSTOR\' & $val, $n)
    If @error <> 0 then ExitLoop
    If RegRead('HKLM\SYSTEM\CurrentControlSet\Enum\USBSTOR\' & $val & '\' & $sub, 'ParentIdPrefix') == $prefix Then
    If DriveGetFileSystem($var[$i] & '\') Then
    ReDim $aUSB_Drives[UBound($aUSB_Drives)+1][2]
    $aUSB_Drives[0][0] += 1
    $aUSB_Drives[UBound($aUSB_Drives)-1][0] = StringUpper($var[$i])
    $aUSB_Drives[UBound($aUSB_Drives)-1][1] = _
    RegRead('HKLM\SYSTEM\CurrentControlSet\Enum\USBSTOR\' & $val & '\' & $sub, 'FriendlyName')
    ExitLoop
    EndIf
    EndIf
    Next
    Next
    EndIf
    Next
    Return $aUSB_Drives
    EndFunc ;_GetMountedUSB_Drives

    [/autoit]
  • Geht das nicht auch einfacher?
    Oder sind das andere Bezeichnungen?

    Spoiler anzeigen
    [autoit]

    Func _GetMountedUSB_Drives()
    Local $drives = DriveGetDrive("REMOVABLE")
    Local $return[$drives[0]+1][2]
    For $i = 1 To $drives[0]
    If $drives[$i] = "a:" Or $drives[$i] = "b:" Then
    ReDim $return[UBound($return)-1][2]
    ContinueLoop
    EndIf
    $return[$i][0] = StringUpper($drives[$i])
    $return[$i][1] = DriveGetLabel($drives[$i])
    Next
    $return[0][0] = UBound($return)-1
    _ArrayDisplay($return)
    EndFunc ;_GetMountedUSB_Drives

    [/autoit]
  • Ah, OK
    Habs grad nomal getestet:
    DriveGetLabel: USB DISK
    Deine Func: CnMemory USB Stick
    Aber Label aus der Autorun.inf ist nochmal anders :)

    • Offizieller Beitrag

    Nein, denn DriveGetLabel() bringt keine oder nicht dieselbe Bezeichnung, wie in der Registry abgelegt.
    Bei all meinen Sticks (6: MicroX, PConKey etc.) bekomme ich mit DriveGetLabel() keine Information.

    Um mal Uwe Sieber zu zitieren:

    Zitat


    Ein USB-Stick (in englisch 'flash drive', 'pen drive' oder 'USB disk') ist Laufwerk und Datenträger in einem - deshalb kommt und geht mit dem Stick auch dessen Laufwerks-Buchstabe.

    Was Dein Script ausliest ist IMO die Laufwerksbezeichnung des USB-Sticks. DriveGetLabel gibt hingegen die Datenträgerbezeichnung zurück, wenn denn dem Datenträger eine solche zugewiesen wurde, ansonsten halt ein Leerstring.

    Trotzdem finde ich Dein Script klasse, weil man das ja auch gebrauchen kann. :thumbup: