Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Probleme mit MSFT_PhysicalDisk - Ermitteln ob SSD oder HDD
Little Tester
myCSharp.de - Member



Dabei seit:
Beiträge: 77

Themenstarter:

Probleme mit MSFT_PhysicalDisk - Ermitteln ob SSD oder HDD

beantworten | zitieren | melden

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?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Little Tester am .
private Nachricht | Beiträge des Benutzers
dannoe
myCSharp.de - Member



Dabei seit:
Beiträge: 181

beantworten | zitieren | melden


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?
private Nachricht | Beiträge des Benutzers
Little Tester
myCSharp.de - Member



Dabei seit:
Beiträge: 77

Themenstarter:

beantworten | zitieren | melden

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"?
private Nachricht | Beiträge des Benutzers
Wilfried
myCSharp.de - Member

Avatar #2TnJ7IKlYXgOor5sZSIA.jpg


Dabei seit:
Beiträge: 97
Herkunft: Radeberg

beantworten | zitieren | melden

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 !

GidF
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15955

beantworten | zitieren | melden

Zitat von Little Tester
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 ;-)
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers