简体   繁体   English

从驱动器号获取驱动器型号

[英]Get drive model from drive letter

I want to get the model name from a drive letter. 我想从驱动器号中获取型号名称。 For example Crucial_CT256MX100SSD1 is the model of my drive C:\\ 例如Crucial_CT256MX100SSD1是我的驱动器C:\\的模型C:\\

The model can be retrieved with a simple WMI query, 可以使用简单的WMI查询检索模型,

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

However, I cannot filter the query with the drive letter. 但是,我无法使用驱动器号过滤查询。

Unfortunately Win32_LogicalDisk doesn't have the model of the drive. 不幸的是, Win32_LogicalDisk没有驱动器的型号。

I don't have more ideas. 我没有更多的想法。

I wrote you a function that should do what you need: 我给你写了一个应该做你需要的功能:

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>";
    }
}

Just pass in a string, such as C: or D: . 只需传入一个字符串,例如C:D: . It must be just the drive letter and a colon. 它必须只是驱动器号和冒号。 Also, I made this work for just hard drives. 此外,我为硬盘驱动器做了这项工作。 It will not work on CD-ROM drives. 它不适用于CD-ROM驱动器。 It can be expanded, if you need that functionality though. 如果您需要该功能,它可以扩展。

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

Win32_DiskDriveToDiskPartition, Win32_LogicalDiskToPartition Win32_DiskDriveToDiskPartition,Win32_LogicalDiskToPartition

Brute force: 蛮力:

  1. Take all disks 拿走所有磁盘

    SELECT * FROM Win32_DiskDrive SELECT * FROM Win32_DiskDrive

  2. For each disk get partitions 对于每个磁盘获取分区

    ASSOCIATORS OF {Win32_DiskDrive.DeviceID= disk.DeviceID } WHERE AssocClass = Win32_DiskDriveToDiskPartition ASSOCIATORS OF {Win32_DiskDrive.DeviceID = disk.DeviceID } WHERE AssocClass = Win32_DiskDriveToDiskPartition

  3. For each partition get volume letter 为每个分区获取卷号

    ASSOCIATORS OF {Win32_DiskPartition.DeviceID= partition.DeviceID } WHERE AssocClass = Win32_LogicalDiskToPartition ASSOCIATORS OF {Win32_DiskPartition.DeviceID = partition.DeviceID } WHERE AssocClass = Win32_LogicalDiskToPartition

I think you can get the info from the registry. 我想你可以从注册表中获取信息。 I have an Intel SSD, and I looked up its name in the device manager. 我有一个英特尔固态硬盘,我在设备管理器中查找了它的名字。 When I did a registry search I found it: 当我进行注册表搜索时,我发现它:

在此输入图像描述

So I think when you code to iterate trough the HKLM\\HARDWARE\\DEVICEMAP\\Scsi you can find the info. 因此,我认为当您编写代码以通过HKLM\\HARDWARE\\DEVICEMAP\\Scsi进行迭代时,您可以找到该信息。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM