Interne Festplatten und Partitionen ermitteln

  • Hallo,

    ich habe ein Problem mit einem größeren SW Paket. Im Paket prüfe ich ab, ob genügend Platz auf Laufwerk C:\ (1,6GB!) vorhanden ist und starte dann die Installation. Leider ist auf einigen älteren Rechnern nicht genügend Platz, aber es existiert ggfs. eine zweite Partition, auf der ich das Paket entpacken und von der ich aus installieren könnte. (Voraussetzung ist natürlich, dass auch dort genügend Platz ist.)
    Ich will also eine ähnliche Funktion für mein Paket haben, wie es Microsoft für seine Pakete macht. MS Pakete prüfen, auf welcher Partition/Platte sie zum Entpacken den meisten Speicher frei haben...

    Jetzt gibt es nur das Problem, wie erkenne ich, ob ich eine zweite Partition habe oder aber eine zweite interne Platte habe, die ich nutzen kann?
    Mit den folgenden Zeilen werden alle Festplatten erkannt, aber leider auch extern angeschlossene USB Festplatten und diese will ich aus verschiedenen Gründen nicht nutzen (wie ich feststellen mußte nutzt MS auch die externen Platten... :wacko: )

    [autoit]

    $var = DriveGetDrive ( "FIXED" )
    If NOT @error Then
    MsgBox(4096,"", "Found " & $var[0] & " drives")
    For $i = 1 to $var[0]
    MsgBox(4096,"Drive " & $i, $var[$i])
    Next
    EndIf

    [/autoit]

    Nun habe ich mir diesen (wirklich tollen) Thread (SB v X.0) und die zugehörigen Dateien angeschaut, aber leider nicht allzuviel verstanden.

    Meine Versuche mit WMI zeigten auch immer die externe Festplatte: (hier das Beispiel aus der Scriptomatic, in dem, neben der internen Festplatte mit zwei Partitionen und der externen Festplatte, auch eine im PC Card Adapter steckende CompactFlash Disk als LogicalDisk erkannt wurde... )

    [autoit]

    ; Generated by AutoIt Scriptomatic
    $file = FileOpen(@ScriptDir & '\LogicalDiskToPartition.log', 2)
    If $file <> -1 Then
    $wbemFlagReturnImmediately = 0x10
    $wbemFlagForwardOnly = 0x20
    $colItems = ""
    $strComputer = "localhost"

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

    $Output=""
    $Output = $Output & "Computer: " & $strComputer & @CRLF
    $Output = $Output & "==========================================" & @CRLF
    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_LogicalDiskToPartition", "WQL", _
    $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

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

    If IsObj($colItems) then
    For $objItem In $colItems
    $Output = $Output & "Antecedent: " & $objItem.Antecedent & @CRLF
    $Output = $Output & "Dependent: " & $objItem.Dependent & @CRLF
    $Output = $Output & "EndingAddress: " & $objItem.EndingAddress & @CRLF
    $Output = $Output & "StartingAddress: " & $objItem.StartingAddress & @CRLF
    FileWriteLine($file, $Output)
    FileWriteLine($file, '---------------------NewLine--------------------------------')
    $Output=""
    Next
    Else
    Msgbox(0,"WMI Output","No WMI Objects Found for class: " & "Win32_LogicalDiskToPartition" )
    Endif
    EndIf

    [/autoit]


    Ausgabe:

    Gibt es eine Möglichkeit die externen USB Platten auszuschließen und nur das Laufwerk D:\ bei einer internen Festplatte zu nutzen?

    mfg
    Axel

    There exist 10 different kind of people on earth.
    Those who understand binary, and those who don't.

    • Offizieller Beitrag

    Die Problematik bei der Sache ist doch die Erkennung, was ist intern und was extern?
    Da gibt es keinerlei Einstellung für. Wie sollte das auch gehen?
    Eine z.B. per eSATA angeschlossene Platte sieht für Windows absolut genauso aus, wie eine "Interne".
    Oder wer sagt, dass eine per USB angeschlossene Platte unbedingt extern ist? Es gibt auch USB -> IDE Adapter, die man durchaus "intern" verwenden kann.
    Du wirst Dich wohl mit "Fixed"-Drive zufrieden geben oder eine eigene Definition von Intern und Extern aufstellen müssen.

  • Vielleicht kannst Du Dir mit Hilfe von DevCon von MS noch was zaubern...
    Die für Dich interessante Classe dürfte DiskDrive sein.

    Link

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • Danke für eure Hinweise.

    Es ist wirklich die Frage, ob es den Aufwand lohnt...

    Mit DEVCON bekomme ich schon etwas mehr Info's...

    Scheint vielleicht doch ein Weg zu sein, BugFix hat da doch schon "etwas" Vorarbeit geleistet:

    Manage USB-Drives per devcon.exe

    oder mit der Idee von Eukalyptus...
    [ gelöst ] USB-Hardware-ID auslesen

    Vielleicht lässt sich ja etwas mit den folgenden Zeilen anfangen...

    [autoit]

    $ComputerName = "."
    $wmiServices = ObjGet("winmgmts:{impersonationLevel=Impersonate}!//" & $ComputerName)
    $wmiDiskDrive = $wmiServices.ExecQuery("SELECT * FROM Win32_DiskDrive")
    For $DiskDrive In $wmiDiskDrive
    $wmiDiskPartitions = $wmiServices.ExecQuery("ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" & $DiskDrive.DeviceID & "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition")
    For $DiskPartition In $wmiDiskPartitions
    $wmiLogicalDisks = $wmiServices.ExecQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" & $DiskPartition.DeviceID & "'} WHERE AssocClass = Win32_LogicalDiskToPartition")
    For $LogicalDisk In $wmiLogicalDisks
    ConsoleWrite($DiskPartition.DeviceID & @LF & $LogicalDisk.DeviceID & @LF & @LF)
    Next
    Next
    Next

    [/autoit]

    Ausgabe:

    mfg
    Axel

    There exist 10 different kind of people on earth.
    Those who understand binary, and those who don't.

  • Der Vollständigkeit halber eine funktionierende Lösung für die Prüfung auf eine zweite Partition mit dem Laufwerksbuchstaben D:.
    Hierbei wird auch noch geprüft, ob die erste Platte evtl. noch eine zweite versteckte Partition enthält (kam bei unseren älteren Imageversionen noch vor...).
    Man kann das natürlich noch optimieren, in dem man beispielsweise der Funktion den Laufwerksbuchstaben als Parameter übergibt oder aber die Platte...

    Spoiler anzeigen

    mfg
    Axel

    There exist 10 different kind of people on earth.
    Those who understand binary, and those who don't.