- 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
; 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
;===============================================================================
;
; 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