Windows10 Creators Update
今のところWindows10 更新アシスタントのダウンロード、インストールが必要だけど、今後Anniversary Updateのように強制されるようになったらどうしようとちょっと青くなっているところです。Windows8.1までは、OS SerialNumberが変わる事はなかったのだけど、Windows10の大型アップデートでは下の桁が変わるようになってしまいました。
今までOSのSerialNumberを取得して、固有キーを作成し、そのマシンが何かを特定するアプリを作っていたのですが、Windows10の大型アップデートの関係でアップデートするとこのSerialNumberも変わってしまい、この手法が取れなくなってしまいました。
//http://dobon.net/vb/dotnet/system/wmiwin32os.html
System.Management.ManagementClass mc =
new System.Management.ManagementClass("Win32_OperatingSystem");
System.Management.ManagementObjectCollection moc = mc.GetInstances();
foreach (System.Management.ManagementObject mo in moc)
{
OSSerial = mo["SerialNumber"].ToString();
mo.Dispose();
}
moc.Dispose();
mc.Dispose();
はぁ。参ったなぁ。
一応、代替案としては、
//C:ドライブの論理ドライブ情報を取得する
ManagementObject disk = new ManagementObject("Win32_LogicalDisk.DeviceID=\"C:\"");
disk.Get();
foreach (PropertyData PropertyD in disk.Properties)
{
if (PropertyD.Name == "VolumeSerialNumber")
{
HDDSerial = PropertyD.Value.ToString();
break;
}
}
なと
//GUIDにしようかなと
ManagementObjectSearcher ms = new ManagementObjectSearcher("Select * from Win32_Volume");
foreach (ManagementObject mo in ms.Get())
{
string guid = mo["DeviceID"].ToString();
// ドライブレターが設定されていない場合判定しない
if (!(mo["DriveLetter"] == null || !(mo["DriveLetter"] is string) || mo["DriveLetter"].ToString().Length == 0))
{
var mct = Regex.Match(guid, @"{([A-Fa-f0-9]{8})\-([A-Fa-f0-9]{4})\-([A-Fa-f0-9]{4})\-([A-Fa-f0-9]{4})\-([A-Fa-f0-9]{12})}");
if (mct != null)
guid = mct.Groups[0].Value;
Console.WriteLine("{0}: {1}", mo["DriveLetter"].ToString().Substring(0, 1), guid);
}
}
Creators Updateなどで変わってしまうと困るけど、論理ドライブ情報は変わったことがない。
GUIDの説明はこのサイトが分かりやすかった
GUID は例えば、「このプログラムを開始する」といった処理をプログラム中に書く際に、どのプログラムなのかを指定するのに使われる。
一般に名前をつける際に問題となる事の一つは、名前の重複である(人なら同姓同名)。別のものに同じ名前が付いていると、名前だけでは特定の一つを指せなくなり不便である。GUID では、この重複が起きないようになっている。
ディスク識別子について (ディスクのGUID)
GUIDは変更されるか?
パーティションを作成しなおす=パーティションを削除+作成となり新しいGUIDが付いたということですね。
との情報から、GUIDも再インストールなどしなければめったに再生成される事はなさそうだ。