从RAID配置获取硬盘驱动器串行的潜在问题



我目前有一个函数,该函数通过WMI调用返回虚拟机的硬盘驱动器序列号,在实际物理硬盘驱动器上运行时效果很好。然而,当我在带有虚拟磁盘的虚拟机上运行该功能时,硬盘驱动器序列号总是以1和0的相同序列返回。我正在尝试使用这种技术来识别特定的机器。是否有更可靠的方法来检索某种标识符,该标识符标识(虚拟)机中使用的可能不会更改的硬件?

需要注意的是,我已经收到了MAC地址作为建议,但如果必须更换我的NIC,我不希望我的软件坏掉。

我还担心通过RAID配置的系统硬盘可能会返回什么,因为这个序列需要与每次调用保持一致。然而,我没有RAID配置的系统来测试它,所以我不确定一开始会返回什么。

编辑 我已经找到了一种可靠的方法,即使序列号可能不是唯一的,也可以将我们的软件锁定到虚拟机,因此VM部分不再是问题。然而,我仍然不确定某些RAID配置会如何恢复,如上所述,我没有足够的RAID配置机器来测试,更不用说测试几个配置了。我们非常感谢在这方面提供的任何协助。

这是HD串行功能:

string Win32_Class = string.Empty;
string Win32_Property = string.Empty;
string systemDrive = null;
try
{
systemDrive = System.Environment.GetFolderPath(System.Environment.SpecialFolder.System).Substring(0, 2);
Win32_Class = "Win32_LogicalDisk";
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(string.Format("SELECT * FROM {1} WHERE DeviceID='{0}'", systemDrive, Win32_Class)))
{
foreach (ManagementObject logicalDisk in searcher.Get())
{
Win32_Class = "Win32_DiskPartition";
foreach (ManagementObject partition in logicalDisk.GetRelated(Win32_Class))
{
Win32_Class = "Win32_DiskDrive";
foreach (ManagementObject diskDrive in partition.GetRelated(Win32_Class))
{
Win32_Class = "Win32_PhysicalMedia";
foreach (ManagementObject diskMedia in diskDrive.GetRelated(Win32_Class))
{
Win32_Property = "SerialNumber";
mySystemDeviceSerial = diskMedia[Win32_Property].ToString().Trim();
}
}
}
}
}
}

如果要标识VM实例,可以使用Win32_ComputerSystemProduct实例的UUID属性。在现实世界中,这映射到主板上的ID。在虚拟机中,无论驱动器是什么,这都会为每个虚拟机配置返回一个唯一的值(但我不确定如果克隆或移动虚拟机会发生什么)。

您可以使用"逻辑"磁盘的序列号。如果磁盘被重新分区,这种情况将会改变。如果冗余RAID设置中的一个驱动器发生了更改,则不会发生更改。这是存储在块级别的东西,所以实际的存储设置是什么并不重要

您需要安装卷的Win32_LogicalDiskVolumeSerialNumber属性。

http://msdn.microsoft.com/en-us/library/windows/desktop/aa394173(v=vs.85).aspx

最新更新