如何获取指定磁盘(如C盘)的Serialnumber与Signature值
获取指定磁盘的SerialNumber和Signature值
Win32_LogicalDisk仅能提供卷级别的VolumeSerialNumber,要获取物理磁盘的SerialNumber和磁盘Signature,需要通过逻辑盘→分区→物理磁盘的关联关系查询WMI类,以下是具体实现方案:
核心思路
- 通过
Win32_LogicalDisk定位目标盘符(如C:) - 利用
Win32_LogicalDiskToPartition关联类,找到该逻辑盘对应的磁盘分区 - 通过分区关联到
Win32_DiskDrive,获取物理磁盘的SerialNumber - 从
Win32_DiskDrive或Win32_DiskPartition中读取磁盘Signature(不同磁盘格式可能存储位置不同)
C#代码示例
using System; using System.Management; class DiskInfoRetriever { static void Main(string[] args) { GetTargetDiskInfo("C:"); GetTargetDiskInfo("D:"); } static void GetTargetDiskInfo(string driveLetter) { // 格式化盘符格式 if (!driveLetter.EndsWith(":")) driveLetter += ":"; try { // 1. 获取目标逻辑盘对象 using var logicalDisk = new ManagementObject($"Win32_LogicalDisk.DeviceID='{driveLetter}'"); logicalDisk.Get(); // 2. 关联到对应的磁盘分区 using var relatedPartitions = logicalDisk.GetRelated("Win32_DiskPartition"); foreach (ManagementObject partition in relatedPartitions) { // 3. 关联到对应的物理磁盘 using var relatedDisks = partition.GetRelated("Win32_DiskDrive"); foreach (ManagementObject disk in relatedDisks) { // 提取物理磁盘序列号(注意去除多余空格) string serialNumber = disk["SerialNumber"]?.ToString().Trim(); // 提取磁盘签名(优先从DiskDrive取,无则从Partition取) object signature = disk["Signature"] ?? partition["Signature"]; Console.WriteLine($"=== 盘符 {driveLetter} 信息 ==="); Console.WriteLine($"物理磁盘SerialNumber: {serialNumber ?? "未获取到"}"); Console.WriteLine($"磁盘Signature: {signature?.ToString() ?? "未获取到"}"); Console.WriteLine(); } } } catch (Exception ex) { Console.WriteLine($"查询盘符 {driveLetter} 出错: {ex.Message}"); } } }
关键说明
- 权限要求:需要管理员权限才能访问完整的磁盘硬件信息,否则部分属性可能返回空值
- 属性差异:
SerialNumber是物理磁盘的硬件序列号,由厂商写入,部分廉价磁盘可能未提供该值Signature是磁盘的分区表签名(MBR磁盘为主引导记录签名,GPT磁盘可能需查询Win32_DiskPartition的Guid属性)
- 资源释放:使用
using语句自动释放ManagementObject资源,避免内存泄漏
内容的提问来源于stack exchange,提问作者Raider_007
相关产品推荐
相关产品推荐

