C# 从RAID配置获取硬盘驱动器序列的潜在问题

C# 从RAID配置获取硬盘驱动器序列的潜在问题,c#,.net,virtual-machine,identity,C#,.net,Virtual Machine,Identity,我目前有一个函数,可以通过WMI调用返回虚拟机的硬盘驱动器序列,在实际的物理硬盘驱动器上运行时效果非常好。但是,当我在带有虚拟磁盘的虚拟机上运行该函数时,硬盘驱动器序列始终返回为1和0的相同序列。我试图用这种技术来识别一台特定的机器。是否有一种更可靠的方法来检索某种标识符,该标识符标识(虚拟)机中使用的、可能不会更改的硬件 请注意,作为建议,我收到了MAC地址,但如果必须更换它绑定的NIC,我不希望我的软件损坏 我还关心通过RAID配置的系统硬盘驱动器上可能返回的内容,因为此序列需要与每次调用一

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

请注意,作为建议,我收到了MAC地址,但如果必须更换它绑定的NIC,我不希望我的软件损坏

我还关心通过RAID配置的系统硬盘驱动器上可能返回的内容,因为此序列需要与每次调用一致。但是,我没有RAID配置的系统来测试这一点,因此我不确定首先会返回什么

编辑我找到了一种可靠的方法将软件锁定到虚拟机,即使序列号可能不唯一,因此虚拟机部分不再是问题。但是,我仍然不确定在某些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();
                    }
                }
            }
        }
    }
}

您可以使用“逻辑”磁盘的序列号。如果磁盘被重新分区,这将改变。如果冗余RAID设置的一个驱动器发生更改,则不会更改。这是存储在块级别的内容,因此实际的存储设置并不重要

您需要安装卷的Win32_LogicalDisk的
VolumeSerialNumber
属性


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

如果虚拟机被移动到另一台物理机器并运行,您是否希望序列号保持不变或更改?事实上,我已经发现这在虚拟机的情况下无论如何都不重要。我确实需要知道哪些RAID配置可能会产生不一致的结果,尽管我有一个问题,如果分区被修改,序列没有改变,对吗?我不这么认为,不,但我必须检查以确定。感谢您的输入,我将研究这条途径,这可能是我在下一个版本的产品中加入的东西