[HELP] HDD Hardware ID

  • Moin leute,

    ich wäre sehr dankbar wen mir jemand erklären kann wie man mit AutoIt die Hardware ID von der HDD zB auslesen könnte.

    Danke im vorraus !!

    Einmal editiert, zuletzt von b0tnet (23. Februar 2010 um 19:32)

  • Wenn Du mit Hardware-ID die Seriennummer meinst, dann kannst Du

    [autoit]


    DriveGetSerial()

    [/autoit]


    benutzen.

  • Also ich würde es dafür bruachen das gewisse Tools nur auf bestimmten PCs gestartet werden in dem eine Abfrage auf die Hardware ID gemacht wird, jedoch sollte das auch mit "DriveGetSerial()" klappen wie xp_fan sagt.


    muss es noch probieren, aber Danke !!!

  • Diese ID nicht nicht eindeutig.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • ich würde eine kobination aus mehren werten machen, also z.b. noch @cpuarch und die betriebssystem version und noch irgenwas halt nehmen, das gesant is dann schon ziemlich eindeutig, da es unwahrscheinlich ist das mehrere die komplett gleiche Konfiguration und auch noch gleiche Seriennummer hat.

    Mfg

    Computers are like Airconditioning. They don´t work with open Windows.

    • Offizieller Beitrag

    DriveGetSerial ist in der Tat nicht so geeignet, da sie beim formatieren der Partition vergeben wird und sich somit beim nächsten formatieren ändern wird.
    Man kann aber auch die Hersteller-Seriennummer der Festplatte auslesen, die IMHO einmalig ist (oder zumindest sein sollte).
    Dazu hatte ich mal eine Funktion geschrieben:

    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]
  • WOOW !!! Riesen Dank ! sau geiler Script :)

    Vielen Dank für eure Hilfe leute.. habt mir sehr geholfen

  • Ich möchte den Thread noch mal hoch holen, weil ich gerade ein Script benötige das mir die Hersteller-Seriennummer von der Systemplatte anzeigt.
    Das Script oben zeigte mir nicht die richtige SN an. Der richtige Wert steckt in der Eigenschaft : $objItem.Serialnumber
    Das Script hat mir ansonsten sehr geholfen. Vielen Dank!

    [autoit]


    $a = _GetDriveInfo(StringLeft(@SystemDir,3))
    MsgBox(0,"",$a)
    Exit

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

    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 = StringStripWS($objItem.Serialnumber,8)
    EndIf
    Next
    Endif
    $objWMIService = ''
    Return $aOut
    EndFunc

    [/autoit]

    Anmerkung:
    Ich habe alle Leerzeichen aus der SN entfernt (StringStripWS).

  • Leider musste ich im nachhinein festellen dass der Code nicht auf Windows XP läuft.
    Auch bei manchen Festplattenherstellern wird nicht die korrekte SN ausgelesen.

    Aber irgendwie muss es doch möglich sein ?( . Tools wie z.b. der SIV (System Informations Viewer) zeigen mir auf allen Betriebsystemen und allen Festplattenherstellern die SN zuverlässig an.

    Kennt jemand noch eine andere Möglichkeit?