能否确定 Environment.SpecialFolder.System 驱动器的 Win32_DiskDrive 序列号?

3

我已经困惑了一段时间,似乎在谷歌上也找不到答案。

如标题所述,如果我获取当前 Windows 运行的驱动器号,例如:Path.GetPathRoot(Environment.GetFolderPath(Environment.SpecialFolder.System)); 那么我是否可以确定其 Win32_DiskDrive 序列号?我找不到将它们联系起来的方法。

这是制造商的序列号而不是 VolumeSerialNumber。

提前感谢。


@HansPassant 我明白,我的问题是是否有可能确定一个驱动器字母/卷与哪个物理驱动器相关联?是否有办法将驱动器字母链接到其物理驱动器的Win32_DiskDrive序列号? - Spark
2个回答

4
您可以使用 ManagmentObjectSearch 结合 ASSOCIATORS OF 语句:
public static string GetSerialNumber(string logicalDrive)
{
    using (var partitionsQuery = new ManagementObjectSearcher(string.Format("ASSOCIATORS OF {{Win32_LogicalDisk.DeviceID='{0}'}} WHERE ResultClass = Win32_DiskPartition", logicalDrive)))            
    {
        foreach (var results in partitionsQuery.Get())
        {
            using (var diskDrives = new ManagementObjectSearcher(string.Format("ASSOCIATORS OF {{Win32_DiskPartition.DeviceID='{0}'}} WHERE ResultClass=Win32_DiskDrive", results["DeviceID"])))
            {
                foreach (var d in diskDrives.Get())
                {
                    Console.WriteLine("Serial: " + d["SerialNumber"]);

                    return d["SerialNumber"].ToString();
                }
            }
        }
    }

    return null;
} 

使用方法:

var num = GetSerialNumber(Path.GetPathRoot(Environment.SystemDirectory).TrimEnd(new [] {'\\'}));

注意:不要忘记从Path.GetPathRoot返回的路径中删除反斜杠。

这正是我想要的,非常感谢! - Spark

0
你可以使用System.Management中的ManagementObjectSearcher类,然后循环遍历属性以查找序列号。
我认为以下代码可以让你接近你想要的结果...
                var search = new ManagementObjectSearcher("select * from Win32_DiskDrive");
                foreach (var mo in search.Get())
                {
                    if (mo["SerialNumber"] != null)
                    {
                        return mo["SerialNumber"].ToString();
                    }
                }

https://learn.microsoft.com/en-us/windows/win32/cimwin32prov/win32-diskdrive

^ 那应该包含您可以获取的所有各种属性

希望这有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接