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

Posted

技术标签:

【中文标题】是否可以确定 Environment.SpecialFolder.System 驱动器的 Win32_DiskDrive 序列号?【英文标题】:Is it possible to determine the Win32_DiskDrive SerialNumber of the Environment.SpecialFolder.System drive? 【发布时间】:2019-12-24 18:07:10 【问题描述】:

我一直在兜圈子,似乎也无法在谷歌上找到答案。

正如标题所说,如果我得到当前驱动器号 windows 正在运行,让我们这样说:Path.GetPathRoot(Environment.GetFolderPath(Environment.SpecialFolder.System)); 然后我可以确定它的 Win32_DiskDrive 序列号吗?我找不到链接它们的方法。

这是制造商的 S/N,而不是 VolumeSerialNumber。

提前致谢

【问题讨论】:

@HansPassant 我明白,我的问题是是否可以确定驱动器号/卷与哪个物理驱动器相关?有没有办法将驱动器号链接到其物理驱动器的 Win32_DiskDrive SerialNumber? 【参考方案1】:

您可以使用 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://docs.microsoft.com/en-us/windows/win32/cimwin32prov/win32-diskdrive

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

希望对您有所帮助。

【讨论】:

【参考方案2】:

你可以使用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 返回的路径中删除反斜杠。

【讨论】:

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

以上是关于是否可以确定 Environment.SpecialFolder.System 驱动器的 Win32_DiskDrive 序列号?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 Cocoa 中确定文件是否是从别名打开的?

是否可以使用 JavaScript 确定 GeoJSON 点是否在 GeoJSON 多边形内?

是否可以确定请求JSON中是否存在参数

是否可以通过反射确定方法参数是否为最终参数?

是否有一个简单的算法可以确定 X 是否为素数?

是否可以确定一个类型是否是作用域枚举类型?