_GetDriveInfo (erweiterte Informationen zu einer Festplatte/USB-Stick)

    • Offizieller Beitrag

    Die Informationen, die man per WMI auslesen kann sind ja ganz interessant, aber man kann sie nicht speziell für ein bestimmtes Laufwerk (Buchstaben übergeben) auslesen. Deshalb habe ich diese Funktion geschrieben, mit der genau das möglich ist:

    Spoiler anzeigen
    [autoit]


    ; Anfang Beispiel
    #include<Array.au3> ; wird nur für _ArrayDisplay benötigt
    $sScriptDrive = StringLeft(@ScriptDir, 2) ; Laufwerksbuchstaben holen
    $Ret = _GetDriveInfo($sScriptDrive)
    If IsArray($Ret) Then
    _ArrayDisplay($Ret, 'Informationen über Laufwerk "' & $sScriptDrive & '"')
    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)
    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]
    • Offizieller Beitrag

    Hab gestern mit WMI rumgebastelt, machdem ich das in deinem Systeminfoprogramm gefunden habe. Bin aber irgendwie nicht weitergekommen . Find dein Script gut und werd es jetz stuckadieren um was zu lernen . :thumbup::thumbup: