Klassifikation eines "removable device"

  • Hallo liebe AUTOIT-Gemeinde,

    weiß jemand, ob man über den Laufwerksbuchstaben genauer herausbekommen kann, um welche Art von Device es sich handelt?

    Mittels "DeviceType" bekommt man zwar heraus, ob es sich um ein "removable device" handelt, nicht aber, um welche Art Gerät. Ich würde gerne herausfinden, ob es sich um ein "Memory Stick", eine "USB-Festplatte", ein "Chipkarten-Lesegerät" oder ein anderes USB-Gerät wie Handy, Digitalkamera, ... handelt. Geht sowas und wie?

    Danke,

    Ghostbuster.-

    Einmal editiert, zuletzt von ghostbuster (1. Juli 2009 um 11:10)

  • ich meine mal gehört zu haben das das was in der registry ändert wenn man nen usb stick oder ähnliches am pc einsteckt
    aba sicher bin ich mir nich mehr.. sry wenns nich stimmt:P


    greetz syne

  • Du kannst ja auch am Speicherplatz des Gerätes orientieren. Denn ein USB Stick hat "Immer" unter 40 GB und icg glaub kaum, das es Externe Laufewerke mit nur 40 GB gibt.

    Interessanter pragmatischer Ansatz, der wahrscheinlich in mehr als 90% der Fälle paßt. Danke für diesen Tipp. Trotzdem interessiert mich erst mal, ob man überhaupt und wenn ja woran man erkennen kann, ob ich es mit beispielsweise einem USB-Stick oder einem USB-Chipkartenlesegerät zu tun habe.

    Mit WMI habe ich mich schon bissl auseinandergesetzt. Darüber bekomme ich wohl raus, dass es sich beispielsweise um ein "USB Flash Disk USB Device" handelt. Hier stellt sich die Frage, ob das eine Standardbezeichung ist und welche anderen Standardbezeichnungen existieren. Was wäre beispielsweise die Bezeichnung für ein Chipkartenlesegerät? Man kann ja schlecht alle in Frage kommenden Geräte ausprobieren.

    Grüße Ghostbuster

  • ich glaube du meinst das hier ,hier mit kannst du alle laufwerke festplatten,etc. herausfinden denk dran du kriegst es in arrays zurück

    [autoit]


    $var = DriveGetDrive( "all" )
    If NOT @error Then
    MsgBox(4096,"", "Es wurden " & $var[0] & " Laufwerke gefunden")
    For $i = 1 to $var[0]
    MsgBox(4096,"Laufwerk " & $i, $var[$i])
    Next
    EndIf

    [/autoit][autoit][/autoit][autoit][/autoit]
  • Hallo Sithlord95,

    Danke für die Unterstützung, aber DriveGetDrive() meinte ich leider nicht. Diese Funktion ist okay, liefert aber nicht das zurück, wonach ich suche. Diese Funktion sagt lediglich, welche "drive devices" es gibt, welchen generellen Typ die haben, z.B. REMOVABLE, und ob das betreffende Device "ready" ist. Detailliert wird aber nur die CD/DVD erkannt. Alle anderen "removable devices" sind vom Typ REMOVABLE, gleichgültig ob es sich um einen Memory Stick, ein Chipkarten-Lesegerät, eine USB-Festplatte oder vielleicht sogar um eine Digitalkamera handelt.

    Vielleicht kommt man ja um die Benutzung von WMI nicht herum. Hab dazu hier im Forum auch bereits eine Funktion gefunden: _GetUSBDrives(). Hab leider vergessen, von wem die war - meine Verehrung. Die Funktion braucht leider Ewigkeiten auf meinem Dual Core Rechner, bis alle Devices gescannt und klassifiziert sind. Das Ergebnis ist allerdings schon ziemlich das, wonach ich suche ...

    Laufwerk = J:
    Laufwerktyp = USB Flash Disk USB Device
    LaufwerkID = "@USBSTOR\DISK&VEN_USB&PROD_FLASH_DISK&REV_1100\8&1A317ED6&0"

    Laufwerk = G:
    Laufwerktyp = Single Flash Reader USB Device
    uLaufwerkID = "@USBSTOR\DISK&VEN_SINGLE&PROD_FLASH_READER&REV_1.00\058F63356336&0"

    ... denn hier kann man sehen, dass als Laufwerk J beispielsweise ein USB-Stick "gemountet" ist und als Laufwerk G ein Kartenlesegerät.

    Ich bräuchte es eher umgekehrt, nämlich für einen gegebenen Laufwerksbuchstaben, den Laufwerkstyp wie oben zu ermitteln. Klar, das kann man um die Funktion herum schon bauen, aber die extreme Laufzeit schreckt schon ab.

    Ich frage mich nun, ob diese Werte vielleicht auch in die Registry eingetragen werden, so dass ein schneller und direkter Zugriff dieselben Ergebnisse liefern kann? Oder scannt der Windows-Gerätemanager jedesmal alle USB-Devices?

    Grüße

    Ghostbuster

  • Wie Wärs damit:

    [autoit]


    $var = DriveGetType( "c:\" )
    MsgBox(4096, "Laufwerkstyp:", $var)

    [/autoit]
    • Offizieller Beitrag

    @Current, hast Du den ersten Beitrag mal genau gelesen?

    • Offizieller Beitrag

    Ich hatte mal eine Funktion geschrieben, wo man nach Eingabe des Laufwerksbuchstabens einige Informationen (als Array) bekommt:

    Spoiler anzeigen
    [autoit]


    ; Anfang Beispiel
    #include<Array.au3> ; wird nur für _ArrayDisplay benötigt
    $sDrive = 'c:'
    $Ret = _GetDriveInfo($sDrive)
    If IsArray($Ret) Then
    _ArrayDisplay($Ret, 'Informationen über Laufwerk "' & $sDrive & '"')
    Else
    MsgBox(0, 'Fehler', $Ret)
    EndIf
    ; Ende Beispiel

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

    ;===============================================================================
    ; Function Name: _GetDriveInfo($sDrive)
    ; Description:: Erweiterte Informationen zu einer Festplatte/USB-Stick
    ; Parameter(s): $sDrive = Laufwerksbuchstabe
    ; Requirement(s): ---
    ; Return Value(s): 2D-Array mit Bezeichnung und Wert (siehe Beispiel)
    ; Author(s): Oscar (http://www.autoit.de)
    ;===============================================================================
    Func _GetDriveInfo($sDrive)
    $sDrive = StringRegExpReplace($sDrive, '(?i)(.*)([a-z]{1}:)(.*)', '$2')
    Local $sDriveType = DriveGetType($sDrive)
    If $sDriveType <> 'Fixed' And $sDriveType <> 'Removable' Then SetError(1, 0, 1)
    If Not FileExists($sDrive) Then Return SetError(1, 0, 1)
    Local $wbemFlagReturnImmediately = 0x10
    Local $wbemFlagForwardOnly = 0x20
    Local $colItems = ''
    Local $aPartition, $aPhysicalDrive, $aOut[14][2]
    $objWMIService = ObjGet('winmgmts:\\localhost\root\CIMV2')
    If Not IsObj($objWMIService) Then Return SetError(2, 0, 2)
    $colItems = $objWMIService.ExecQuery('SELECT * FROM Win32_LogicalDiskToPartition', 'WQL', $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    If IsObj($colItems) then
    For $objItem In $colItems
    If StringInStr($objItem.Dependent, '"' & $sDrive & '"') Then
    $aPartition = StringRegExp($objItem.Antecedent, 'DeviceID="(.*)"', 3)
    EndIf
    Next
    Endif
    If Not IsArray($aPartition) Then Return SetError(3, 0, 3)
    $colItems = $objWMIService.ExecQuery('SELECT * FROM Win32_DiskDriveToDiskPartition', 'WQL', $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    If IsObj($colItems) then
    For $objItem In $colItems
    If StringInStr($objItem.Dependent, '"' & $aPartition[0] & '"') Then
    $aPhysicalDrive = StringRegExp($objItem.Antecedent, 'DeviceID="(.*)"', 3)
    EndIf
    Next
    Endif
    If Not IsArray($aPhysicalDrive) Then Return SetError(4, 0, 4)
    $aPhysicalDrive[0] = StringReplace($aPhysicalDrive[0], '\\', '\')
    $colItems = $objWMIService.ExecQuery('SELECT * FROM Win32_DiskDrive', 'WQL', $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    If IsObj($colItems) then
    For $objItem In $colItems
    If StringInStr($objItem.DeviceID, $aPhysicalDrive[0]) Then
    $aOut[0][0] = 'Volume-Label'
    $aOut[0][1] = DriveGetLabel($sDrive)
    $aOut[1][0] = 'Serial-Nr. (Volume)'
    $aOut[1][1] = DriveGetSerial($sDrive)
    $aOut[2][0] = 'Model'
    $aOut[2][1] = $objItem.Model
    $aOut[3][0] = 'Serial-Nr. (Drive)'
    $aOut[3][1] = StringMid($objItem.PNPDeviceID, StringInStr($objItem.PNPDeviceID, '\', 0, -1) + 1)
    $aOut[3][1] = StringReplace($aOut[3][1], '&0', '')
    $aOut[4][0] = 'Interface'
    $aOut[4][1] = $objItem.InterfaceType
    $aOut[5][0] = 'Size (Bytes)'
    $aOut[5][1] = $objItem.Size
    $aOut[6][0] = 'Media Type'
    $aOut[6][1] = StringRegExpReplace($objItem.MediaType, '[^[:print:]]', ' ')
    $aOut[7][0] = 'Total Cylinders'
    $aOut[7][1] = $objItem.TotalCylinders
    $aOut[8][0] = 'Total Heads'
    $aOut[8][1] = $objItem.TotalHeads
    $aOut[9][0] = 'Total Tracks'
    $aOut[9][1] = $objItem.TotalTracks
    $aOut[10][0] = 'Total Sectors'
    $aOut[10][1] = $objItem.TotalSectors
    $aOut[11][0] = 'Tracks Per Cylinder'
    $aOut[11][1] = $objItem.TracksPerCylinder
    $aOut[12][0] = 'Sectors Per Track'
    $aOut[12][1] = $objItem.SectorsPerTrack
    $aOut[13][0] = 'Bytes Per Sector'
    $aOut[13][1] = $objItem.BytesPerSector
    EndIf
    Next
    Endif
    $objWMIService = ''
    Return $aOut
    EndFunc

    [/autoit]
  • Hallo Oscar.

    Bei mir kommt folgende Fehlermeldung, wenn ich nicht innerhalb der ersten 4 Zeilen folgendes schreibe: $sScriptDrive = ""

    Fehlermeldung: WARNING: $sScriptDrive: possibly used before declaration


    Weiß nicht ob das bekannt ist.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Hallo Oscar,

    meine Verehrung. Deine Funktion tut genau das (und noch viel mehr), was ich gemeint habe.

    Danke,

    Ghostbuster.-

  • Hallo
    Da ich leider mit den dll-aufruf noch nicht klar komme hier nur der Text den ich gefunden hab. Vielleicht können ja die Profis damit etwas anfangen. (gefunden in einer Windows API)
    Description
    The GetDriveType function determines whether a disk drive is a removable, fixed, CD-ROM, RAM disk, or network drive.
    Declaration
    Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long
    Parameters
    · lpRootPathName
    Points to a null-terminated string that specifies the root directory of the disk to return information about. If lpRootPathName is NULL, the function uses the root of the current directory.


    ReturnValue
    The return value specifies the type of drive. It can be one of the following values:
    DRIVE_UNKNOWN
    The drive type cannot be determined.

    DRIVE_NO_ROOT_DIR
    The root directory does not exist.

    DRIVE_REMOVABLE
    The disk can be removed from the drive.

    DRIVE_FIXED
    The disk cannot be removed from the drive.

    DRIVE_REMOTE
    The drive is a remote (network) drive.

    DRIVE_CDROM
    The drive is a CD-ROM drive.

    DRIVE_RAMDISK
    The drive is a RAM disk.


    Aufruf in C
    Private Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long
    Private Sub Form_Load()
    'KPD-Team 1998
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    'Set the graphic mode to persistent
    Me.AutoRedraw = True
    'Get information about the C:\
    Select Case GetDriveType("C:\")
    Case 2
    Me.Print "Removable"
    Case 3
    Me.Print "Drive Fixed"
    Case Is = 4
    Me.Print "Remote"
    Case Is = 5
    Me.Print "Cd-Rom"
    Case Is = 6
    Me.Print "Ram disk"
    Case Else
    Me.Print "Unrecognized"
    End Select
    End Sub

    Gruß Ralf

  • Ah sorry hatte ihn nur noch mal überflogen weil ich nen Tag vorher in den Thread geschaut hatte und derweil die API gefunden hatte. Die Funktion DriveGetType ist wahrscheinlich mit der dll erstellt.