Laden...

Probleme mit MSFT_PhysicalDisk - Ermitteln ob SSD oder HDD

Erstellt von LittleTester vor 2 Jahren Letzter Beitrag vor 2 Jahren 277 Views
L
LittleTester Themenstarter:in
158 Beiträge seit 2019
vor 2 Jahren
Probleme mit MSFT_PhysicalDisk - Ermitteln ob SSD oder HDD

Hallo Community,

ich verzweifele gerade an der Aufgabe zu ermitteln ob die Windows-Partition eine SSD oder HDD ist.
Mit Win32_LogicalDisk ist das wohl leider nicht zu machen. Es braucht MSFT_PhysicalDisk und das scheint irgendwie komplizierter zu sein. Ich muss den Namespace Root\Microsoft\Windows\Storage einbinden. Aber wie mache ich das? Mein Code sieht aktuell so aus:


            // SSD oder HDD ermittteln
            try
            {
                searcher = new ManagementObjectSearcher("SELECT * FROM MSFT_PhysicalDisk");
                managementObjectCollection = searcher.Get();
                managementObject = managementObjectCollection.OfType<ManagementObject>().FirstOrDefault();

                foreach (ManagementObject obj in searcher.Get())
                    systemSsdOrHdd = obj["MediaType"].ToString();
            } catch (Exception ex) {
                MessageBox.Show(ex.Message);
            }

Momentan bekomme ich den Fehler: Ungültige Klasse

Könnt ihr mir bitte helfen? Lässt sich der Namespace auch ohne Code einbinden?

IDE: Visual Studio 2022
Sofern nicht anders genannt basieren meine Projekte auf C# und .net 6

D
261 Beiträge seit 2015
vor 2 Jahren

ManagementScope scope = new ManagementScope(@"\\.\root\microsoft\windows\storage");
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM MSFT_PhysicalDisk");
string type = "";
scope.Connect();
searcher.Scope = scope;

foreach (ManagementObject queryObj in searcher.Get())
{       
    switch (Convert.ToInt16(queryObj["MediaType"]))
    {
        case 1:
            type = "Unspecified";
            break;

        case 3:
            type = "HDD";
            break;

        case 4:
            type = "SSD";
            break;

        case 5:
            type = "SCM";
            break;

        default:
            type = "Unspecified";
            break;
    }
}
searcher.Dispose();

Quelle: What is the easiest way in C# to check if hard disk is SSD without writing any file on hard disk?

L
LittleTester Themenstarter:in
158 Beiträge seit 2019
vor 2 Jahren

Danke dannoe für diese superschnelle Antwort.

Was ich aber nicht verstehe (und gerne verstehen würde): Warum funktioniert die Abfrage nicht analog dazu wie bei Win32_LogicalDisk oder anderen WMI-Abfragen in C#? Das macht mich echt fertig.

Was ist dieses "ManagementScope" eigentlich und worin besteht der Unterschied zu "ManagementObjectSearcher"?

IDE: Visual Studio 2022
Sofern nicht anders genannt basieren meine Projekte auf C# und .net 6

190 Beiträge seit 2012
vor 2 Jahren

man kann es auch so schreiben:


            ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\Microsoft\\Windows\\Storage", "SELECT * FROM MSFT_PhysicalDisk");
            string type = "";
            foreach (ManagementObject queryObj in searcher.Get())
            {
                switch (Convert.ToInt16(queryObj["MediaType"]))
                {
                    case 1:
                        type = "Unspecified";
                        break;

                    case 3:
                        type = "HDD";
                        break;

                    case 4:
                        type = "SSD";
                        break;

                    case 5:
                        type = "SCM";
                        break;

                    default:
                        type = "Unspecified";
                        break;
                }
            }


Sehr hilfreich: WMI Code Creator v1.0 Da bekommt man auch gleich den C#-Code.

Und dann gibt es auch noch die Doku: ManagementObjectSearcher Klasse

  • Wer lesen kann, ist klar im Vorteil
  • Meistens sitzt der Fehler vorm Monitor
  • "Geht nicht" ist keine Fehlermeldung!
  • "Ich kann programmieren" != "Ich habe den Code bei Google gefunden"

GidF

16.827 Beiträge seit 2008
vor 2 Jahren

Warum funktioniert die Abfrage nicht analog dazu wie bei Win32_LogicalDisk oder anderen WMI-Abfragen in C#?

C# ist erst mal nur eine Sprache.
.NET (oder auch andere Runtimes) ist nicht in der Verantwortung solch eine Funktionalität als eben Runtime anzubieten, sondern gibt Dir Bausteine, damit Du Windows Funkionalitäten aufrufen kannst.

Willst Du eine Änderung des WMI Verhaltens, das über die letzten 30 Jahre gereift ist, dann musst Du Dich daher eher an das Windows als an das .NET Team wenden 😉