DiskPart DiskNummer und VolumenNummer

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 35 Antworten in diesem Thema. Der letzte Beitrag () ist von Amelie.

    DiskPart DiskNummer und VolumenNummer

    Moin moin

    Ich habe hier ein Problem um die ​Datenträger Nr ( disknr ) zu ermitteln.
    Die Volumen Nummer bekomme ich heraus, stimmt auch nach etlichen Tests.

    Bei der Datenträger Nummer bekomme ich immer nur " -1 " heraus. :(

    Spoiler anzeigen

    VB.NET-Quellcode

    1. ' Ermitteln der Disk - Volumen Nummer basierend auf dem Laufwerksbuchstaben
    2. Dim volumenNumber As Integer = GetVolumenNumber(driveLetter.Chars(0))
    3. Dim diskNumber As Integer = GetDiskNumber(driveLetter.Chars(0))
    4. ' --------------------------------------------------------------
    5. ' Methode um die Volumen Nummer zu ermitteln
    6. Public Function GetVolumenNumber(driveLetter As Char) As Integer
    7. Dim volumenNumber As Integer = -1 ' Standardwert, wenn keine Disk-Nummer gefunden wurde
    8. Dim startInfo As New ProcessStartInfo()
    9. startInfo.FileName = "diskpart"
    10. startInfo.RedirectStandardInput = True
    11. startInfo.RedirectStandardOutput = True
    12. startInfo.UseShellExecute = False
    13. startInfo.CreateNoWindow = True
    14. Dim process As Process = Process.Start(startInfo)
    15. If process IsNot Nothing Then
    16. Dim sw As StreamWriter = process.StandardInput
    17. Dim sr As StreamReader = process.StandardOutput
    18. sw.WriteLine("list volume")
    19. sw.WriteLine("exit")
    20. sw.Close()
    21. Dim output As String = sr.ReadToEnd()
    22. Debug.WriteLine("Debugausgabe output: " & output)
    23. Dim regexPattern As String = "Volume\s+(\d+)\s+" & driveLetter & "\s+"
    24. 'Debug.WriteLine("PatterN: " & regexPattern)
    25. Dim regex As New Regex(regexPattern, RegexOptions.IgnoreCase)
    26. Dim match As System.Text.RegularExpressions.Match = regex.Match(output)
    27. If match.Success Then
    28. volumenNumber = Integer.Parse(match.Groups(1).Value)
    29. End If
    30. process.WaitForExit()
    31. process.Close()
    32. End If
    33. Debug.WriteLine("DriveLetter: " & driveLetter & " VolumenNr: " & volumenNumber)
    34. Return volumenNumber
    35. End Function
    36. ' Methode um die Datentraeger Nummer zu ermitteln
    37. Public Function GetDiskNumber(driveLetter As Char) As Integer
    38. Dim diskNumber As Integer = -1 ' Standardwert, wenn keine Datenträger-Nummer gefunden wurde
    39. Dim startInfo As New ProcessStartInfo()
    40. startInfo.FileName = "diskpart"
    41. startInfo.RedirectStandardInput = True
    42. startInfo.RedirectStandardOutput = True
    43. startInfo.UseShellExecute = False
    44. startInfo.CreateNoWindow = True
    45. Dim process As Process = Process.Start(startInfo)
    46. If process IsNot Nothing Then
    47. Dim sw As StreamWriter = process.StandardInput
    48. Dim sr As StreamReader = process.StandardOutput
    49. sw.WriteLine("list disk")
    50. sw.WriteLine("exit")
    51. sw.Close()
    52. Dim output As String = sr.ReadToEnd()
    53. output = output.Replace("„", "ä").Replace("„", "ö").Replace("á", "ü") ' Umlaute ersetzen
    54. Debug.WriteLine("Debugausgabe output: " & output) ' Ausgabe der gesamten Ausgabe von diskpart
    55. Dim regexPattern As String = "Datentrager\s+(\d+)\s+" & driveLetter & "\s+"
    56. ' Regulärer Ausdruck für die Datenträgernummer
    57. Dim regex As New Regex(regexPattern, RegexOptions.IgnoreCase)
    58. Dim match As System.Text.RegularExpressions.Match = regex.Match(output)
    59. If match.Success Then
    60. diskNumber = Integer.Parse(match.Groups(1).Value)
    61. Else
    62. Debug.WriteLine("Keine Übereinstimmung für Laufwerksbuchstabe " & driveLetter & " gefunden.")
    63. End If
    64. process.WaitForExit()
    65. process.Close()
    66. End If
    67. Debug.WriteLine("DriveLetter: " & driveLetter & " DiskNr: " & diskNumber)
    68. Return diskNumber
    69. End Function

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Bist Du Dir sicher das Du dazu ein externes DOS-Programm verwenden möchtest? Windows stellt dafür entsprechende APIs und/oder Interfaces bereit, die von diskpart auch verwendet werden. Also die Schnittstellen kann man auch direkt aufrufen ohne Umweg über ein DOS-Programm.
    Mfg -Franky-
    @-Franky-

    Ich versuchte es schon über :

    VB.NET-Quellcode

    1. Dim searcher As New ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive")
    2. For Each disk As ManagementObject In searcher.Get()
    3. Console.WriteLine("Datenträger: " & disk("DeviceID") & " - Nummer: " & disk("Index"))
    4. Next


    Brachte mir aber keinen Erfolg. ;(
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Ich gehe bei @-Franky- mit.

    Schau dir mal folgendes an: pinvoke.net/default.aspx/kernel32.deviceiocontrol

    Das müsste genau das sein, was du suchst. Müsstest du nur in VB übersetzen.
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)
    Klar, ist keine triviale Geschichte. Allerdings gehört das Ausprobieren und zerstören einer Partition fast schon dazu :D

    Dann lernt man auch eine wichtige Lektion, dass man lieber nicht mit seinem Rechner testet, sondern mit einer VM o.Ä., dass man auch mal zu einem alten Stand springen kann.

    Wobei, selbst dann muss ich sagen, die Windows-APIs sind zum Glück nicht so gemein, wie die POSIX/Linux APIs. Wo ich mit einem einfachen Befehl eine komplette Platte zerstören kann ^^
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)
    @siycah und @-Franky-
    Danke erstmal.

    ​ und zerstören einer Partition fast schon dazu

    Na du machst mir ja Angst. :/ :D

    ----
    Das alles von der Webseite umzubauen, ist noch zu hoch für mich. Da bin ich mit meinem "Latein" bzw "Vb" am Ende. Habe mir den Link aber mal gespeichert. :thumbup:

    Ich dachte, das wäre etwas einfacher, so wie mit der "VolumenNumber".
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Na du machst mir ja Angst.


    Irgendwann zerstören wir alle etwas. Ob das eine Datenbank in Prod ist, oder wie in meinem Fall, dass hunderte Maschinen plötzlich wegen eines Speicherfehlers keine Daten mehr senden. Passiert. Ist nicht schön, aber gehört nunmal dazu.

    Aus Fehlern lernt man. Wenn man nie Fehler macht, macht man etwas falsch.

    Probier es mal aus und schau was passiert. Du wirst es nicht alles verstehen, was da getan wird, aber je mehr du es verwendest und dann ggf. auch mal was anpassen musst, desto mehr wirst du verstehen, was es tut und warum :)
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)

    siycah schrieb:

    Wenn man nie Fehler macht, macht man etwas falsch.
    Das kann ich bestätigen.
    Deswegen gehört das Testen zu ~80 % meiner täglichen Arbeit.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Amelie Such mal mit Deiner Suchmaschine Deines Vertrauens nach "DeviceIoControl IOCTL_STORAGE_GET_DEVICE_NUMBER" Dann hängst an der Suche vllt noch C#, VB.Net oder nur .Net noch mit dran. Im einfachsten Fall findest vllt nur C++ Code und wenn Du Glück hast evtl auch Code für C# oder VB.Net.
    Mfg -Franky-
    Nun ja, zerschossen hab ich mir schon öfters mein System. :whistling: Aber ich hab ein Image, das ich in 20 Minuten wieder zurückschreiben kann.
    Bin aber nicht wirklich scharf darauf, mir alle paar Stunden / Tage .... :D :D

    Nun eine Frage:

    ​<DllImport("kernel32.dll", SetLastError:=True)>
    Kann man irgendwo lesen (möglichst deutsch) was da alles drinsteckt?
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Bin aber nicht wirklich scharf darauf, mir alle paar Stunden / Tage ....


    Genau deswegen: wenn du damit rumspielst, dann verwende eine virtuelle Maschine.
    Oracle VirtualBox ist kostenlos und super simpel. Spiel damit rum und du brauchst keine Angst um etwas haben :)

    Amelie schrieb:

    Kann man irgendwo lesen (möglichst deutsch) was da alles drinsteckt?


    Das Ganze ist ein Attribut. Attribute ändern das Verhalten einer Methode oder Klasse gegenüber der Runtime.

    DllImport
    Hiermit importierst du eine DLL (Bibliothek) in das Namespace deiner Applikation.

    "kernel32.dll"
    Ist der Name der DLL, die du laden willst. In diesem Fall ist es der NT Kernel, womit du die entsprechenden Syscalls (zum Kernel) ausführen kannst.

    SetLastError:=True
    Damit sagst du der C-Bibliothek, dass sie das Makro ​errno setzen soll.

    Bei C/C++ ist es üblich (weil keine Exceptions), dass Funktionen (​Sub oder Function) einen Integerwert zurückliefern.
    Lief die Methode ohne Fehler durch, wird in den allermeisten Fällen eine 0 (Null) zurückgegeben. Trat ein Fehler auf, wird meistens -1 zurückgeliefert und ​errno wird gesetzt.*

    Den Fehlerwert kannst du mit ​Marshal.GetLastWin32Error auslesen und dann entsprechend schauen, was der Fehler ist/war.

    * Fun Fact: Dieses führt bei "Veteran-C-Entwicklern" zu merkwürdigen Konstrukten, wie

    C-Quellcode

    1. if (!ioctl(x, y, z)) {
    2. // War Erfolgreich
    3. }
    4. // oder
    5. if (ioctl(x, y, z)) {
    6. // Fehlerfall
    7. }


    Vielleicht mal ein Gotcha, auf dass man achten sollte.
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)

    Amelie schrieb:

    Nun ja, zerschossen hab ich mir schon öfters mein System.
    Frag bloß nicht wie oft ich DOS auf meinem ersten 286er mit 8MHz Takt installiert habe. Halt viel ausprobiert und DOS zerschossen. Eine HD, die mit DoubleDisk (kennt das wer noch?) eingerichtet war wieder DoubleDisk rückgängig machen. Pöff, alle Daten auf der HD weg. Da war meine ganze Musiksammlung (mod Dateien) drauf die man mit den FastTracker unter DOS, später mit dem FastTracker II unter Windows abspielen und erstellen konnte. Einen DC bei der Migration dazu gebracht alle Rollen nach und nach zu löschen ob wohl noch gar nicht runtergestuft. Jupp, Fehler machen wir alle mal. ;)
    Mfg -Franky-

    -Franky- schrieb:

    die mit DoubleDisk


    War das nicht das, was die Tracks auf der Platte näher beieinander legte, um mehr Speicherplatz pro Platter zu erreichen?
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)
    Da wurden die Dateien beim Speichern komprimiert um Plattenplatz zu sparen. forum.winworldpc.com/discussio…t-drive-compression-tools Man konnte ja froh sein wenn man eine 20 oder 40MB Festplatte hatte. Da zählte noch jedes freie Byte. Das was Du wahrscheinlich meinst war die Möglichkeit eine 1,4MB Floppy auf 1,7MB zu formatieren. Wilde Zeiten waren das noch. ;)
    Mfg -Franky-

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „-Franky-“ ()

    -Franky- schrieb:

    war die Möglichkeit eine 1,4MB Floppy auf 1,7MB zu formatieren.


    Ja, das kann durchaus sein. Da gab's so viel verrücktes Krams. Von echten Hilfen, hinzu Schlangenöl wie "RAMDoubler". Bin ich froh, dass ich da nicht durchblicken musste und mich stattdessen auf Erfahrungsberichte verlassen konnte beim Ausprobieren :D
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)
    Im Übrigen: Auf dem 286er hab ich angefangen mit QBasic zu programmieren. Mein erstes Basicprogramm für Trafoberechnungen hab ich allerdings auf einem KC85-3 de.m.wikipedia.org/wiki/Kleincomputer_KC_85/2-4 programmiert. Da musste man noch erst das Basic von Kassette auf den KC85-3 übertragen bevor man überhaupt anfangen konnte zu programmieren. Gespeichert und geladen wurde das Programm dann auch von Kassette. ;) Ich oute mich hier mal als alten Sa.... äh alten Programmierer.
    Mfg -Franky-

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „-Franky-“ ()