【问题标题】:Get drive model from drive letter从驱动器号获取驱动器型号
【发布时间】:2014-12-25 00:49:54
【问题描述】:

我想从驱动器号中获取型号名称。比如Crucial_CT256MX100SSD1是我驱动的型号C:\

可以通过简单的 WMI 查询来检索模型,

var hdd = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive WHERE Index = '0'")
    .Get()
    .Cast<ManagementObject>()
    .First();
MessageBox.Show(hdd["Model"].ToString());

但是,我无法使用驱动器号过滤查询。

很遗憾Win32_LogicalDisk没有驱动的型号。

我没有更多的想法。

【问题讨论】:

  • 您仍然需要使用 WMI。我不知道确切的查询,但您需要查看 physical 驱动器。驱动器号不对应于特定的物理驱动器。它可能代表单个驱动器内的分区、单个驱动器上的唯一分区,甚至是跨越多个驱动器的逻辑分区。因此,第一步是确定“从驱动器号获取型号名称”的真正含义。
  • 再次阅读您的问题时,我想我没有对您的问题给出正确答案。但这可能会进一步帮助您:geekpedia.com/…
  • @Sjips 如果你知道你没有给出正确答案,不要回答问题!

标签: c#


【解决方案1】:

我给你写了一个函数来满足你的需要:

class Program
{
    static void Main(string[] args)
    {
        const string drive = "C:";

        Console.WriteLine("Drive {0}'s Model Number is {1}", drive, GetModelFromDrive(drive));
    }

    public static string GetModelFromDrive(string driveLetter)
    {
        // Must be 2 characters long.
        // Function expects "C:" or "D:" etc...
        if (driveLetter.Length != 2)
            return "";

        try
        {
            using (var partitions = new ManagementObjectSearcher("ASSOCIATORS OF {Win32_LogicalDisk.DeviceID='" + driveLetter +
                                             "'} WHERE ResultClass=Win32_DiskPartition"))
            {
                foreach (var partition in partitions.Get())
                {
                    using ( var drives = new ManagementObjectSearcher("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" +
                                                         partition["DeviceID"] +
                                                         "'} WHERE ResultClass=Win32_DiskDrive"))
                    {
                        foreach (var drive in drives.Get())
                        {
                            return (string) drive["Model"];
                        }
                    }
                }
            }
        }
        catch
        {
            return "<unknown>";
        }

        // Not Found
        return "<unknown>";
    }
}

只需传入一个字符串,例如C:D:。它必须只是驱动器号和冒号。此外,我只为硬盘驱动器完成了这项工作。它不适用于 CD-ROM 驱动器。如果您需要该功能,它可以扩展。

【讨论】:

  • 工作正常,即使使用 USB 闪存驱动器或 USB 硬盘驱动器。谢谢!
  • 这可以通过调用与 ASSOCIATORS 等效的 ManagementObject.GetRelated() 来简化。
【解决方案2】:

我相信可以从Win32_LogicalDiskToPartitionWin32_DiskDriveToDiskPartition 类中读取分区驱动器映射。

【讨论】:

    【解决方案3】:

    Win32_DiskDriveToDiskPartition、Win32_LogicalDiskToPartition

    蛮力:

    1. 占用所有磁盘

      从 Win32_DiskDrive 中选择 *

    2. 为每个磁盘获取分区

      {Win32_DiskDrive.DeviceID=disk.DeviceID} 的关联方,其中 AssocClass = Win32_DiskDriveToDiskPartition

    3. 为每个分区获取卷号

      {Win32_DiskPartition.DeviceID=partition.DeviceID} 的关联者,其中 AssocClass = Win32_LogicalDiskToPartition

    【讨论】:

      【解决方案4】:

      我认为您可以从注册表中获取信息。我有一个 Intel SSD,我在设备管理器中查找了它的名称。当我进行注册表搜索时,我找到了它:

      所以我认为,当您通过HKLM\HARDWARE\DEVICEMAP\Scsi 进行迭代时,您可以找到相关信息。

      【讨论】:

      • 这只是部分回答了这个问题。请使用如何检索此信息的代码示例编辑您的答案,我将删除反对票并改为赞成票。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-05
      • 2012-05-24
      • 2020-12-15
      • 1970-01-01
      相关资源
      最近更新 更多