【问题标题】:Retrieve Hard drive info through WMI .NET C#通过 WMI .NET C# 检索硬盘驱动器信息
【发布时间】:2019-07-04 22:20:46
【问题描述】:

所以我使用此代码来获取 S.M.A.R.T.来自 Windows WMI 的硬盘诊断信息:

http://vasters.com/archive/Reading-ATAPI-SMART-Data-From-Drives-Using-NET-Temperature-Anyone.html

它适用于大多数计算机,但不适用于其他计算机。经过一番研究和样品测试,我发现它不适用于硬盘连接到 PCI Express 而不是 SATA 的计算机。

var searcher = new ManagementObjectSearcher("root\\WMI", "SELECT * FROM MSStorageDriver_ATAPISmartData");
    foreach (ManagementObject queryObj in searcher.Get())
    {
          //do stuff
    }

这是我得到异常的地方:

System.Management.ManagementException: '不支持'

有没有其他方法可以做到这一点,或者在这段代码中添加一些东西来使它工作?

【问题讨论】:

  • 除了@BugFinder,我想补充一点,现在可以通过 System.IO.DriveInfo.GetDrives() 以更简洁的方式获取此信息
  • 你可以尝试为非托管代码创建C#包装器docs.microsoft.com/en-us/windows/desktop/fileio/…,也可以在GitHub上查看一些应用程序的源代码github.com/mirror/smartmontools/blob/master/os_win32.cpp
  • @BugFinder System.IO.DriveInfo.GetDrives() 仅提供基本信息。我正在寻找 S.M.A.R.T.属性
  • @TomasPangonis 您可以使用下一种方式作为临时解决方法(但首先检查它的 LICENSE 以确保这种方式是合法的):您可以安装 smartmontools 应用程序(github 链接 I在之前的评论中提到)并在您的应用程序中复制\使用其二进制文件。您可以使用其 CLI 获取有关所有驱动器的 SMART 信息:smartctl.exe -a /dev/sda 通过 Process.Start 等运行它并获取输出。

标签: c# .net wmi


【解决方案1】:

我到处搜索此代码,但找不到适合我的代码,但最终在另一个论坛上找到了,因此使用起来非常简单。 仅从我的示例中获取 WMI 信息的另一种方式。您可以在 Microsoft 文档中找到 WMI Win32_DiskDrive 的更多属性 https://github.com/Mityugin/greentest

string NamespacePath = "\\\\.\\ROOT\\cimv2";
string ClassName = "Win32_DiskDrive";
oClass = new ManagementClass(NamespacePath + ":" + ClassName);
            foreach (ManagementObject oObject in oClass.GetInstances())
            {
                var sign = Convert.ToString(oObject["Signature"]);
                var model = Convert.ToString(oObject["Model"]);
                var status = Convert.ToString(oObject["Status"]);

                if (Equals(sign,""))
                {
                    TextBox1.AppendText("DISK model: " + model);
                    TextBox1.AppendText(Environment.NewLine);
                    TextBox1.AppendText("Status: " + status);
                    TextBox1.AppendText(Environment.NewLine);

                    if (!status.Equals("OK") || !model.Contains("SSD"))
                    {
                        //Here is info if Disk is not OK or model not SSD
                    }
                }


            }

【讨论】:

    猜你喜欢
    • 2012-08-07
    • 2020-03-29
    • 1970-01-01
    • 2010-10-05
    • 2010-10-09
    • 2013-12-15
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    相关资源
    最近更新 更多