現在、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();
}
}
}
}
}
}