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
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?
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
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
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 - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code