優れた一意のPC識別子とは何ですか?
このチュートリアル のコードを見てきましたが、My.Computer.Name
コンピュータ間でローミングしない設定を保存します。ただし、ユーザーが同じ名前の2台のPCを持つことは完全に可能です。たとえば、各PCで同じユーザー名を使用したい場合、Username-PCという名前の2台のPCになる可能性があります。
異なるPCを識別する良い方法は何ですか? PCにはGUIDが関連付けられていますか、またはハードウェアからシリアル番号を取得する必要がありますか? Windowsを再インストールしても識別が保持されるかどうかは気にしません。
(リンクしたチュートリアルはVB.Netにありますが、C#で実装しています)
Windowsを使用している場合HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\ CurrentVersion\ProductId
は、マシンごと/ Windowsインストールごとに一意です。 MACアドレス、Proc SN、HD SNなどの他の回答の一部と同様、Windowsの再インストール/デュアルブートの状況間で同じままです。
その質問に対する本当の答え:そのようなことはありません。
いくつかの「十分に近い」ソリューションがありますが、それぞれに独自の制限があります。
すべてのハードウェアID-ハードウェアの変更。また、多くの場合、これらの識別子を変更できます(たとえば、MACスプーフィング)。
既にコメントしたように、SIDはあまり良くありません。コンピューターがイメージからインストールされた場合、SIDは変わらないからです。 SIDはWindowsのインストールによって生成されます。Windowsがインストールされていなかったが、イメージからコピーされた場合、SIDは変更されません( 「セキュリティリスク」に関する神話 =-あなたはそれを当てにすることはできません)。
コンピューター名-さて、前述のように、彼らは一意であると仮定しますが、それは決して強制されません。
実装できる別のソリューションは、独自の識別子を生成し、ローカルに保存することです(そのようなことができると仮定した場合)。繰り返しますが、コンピューターがアプリケーションでイメージ化されている場合、このソリューションは機能しません。
あなたにとって最良の解決策は、あなたが何を達成しようとしているかに本当に依存します。私は非常に大規模なネットワークでも同じ問題を抱えていましたが、私の場合の最良の解決策はコンピューターの名前でした。プロセスがイメージ化されないことが確実な場合、おそらく最も安全であるため、Guidを使用して一意の識別子を生成します。
コンピューターを一意に識別する方法を次に示します。 System.Managementを使用してWin32_BIOSを取得すると、マシンのBIOSから一意の値を取得できます。
参照:Win32_BIOSクラス、 http://msdn.Microsoft.com/en-us/library/aa394077.aspx
using System.Management;
string UniqueMachineId()
{
StringBuilder builder = new StringBuilder();
String query = "SELECT * FROM Win32_BIOS";
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
// This should only find one
foreach (ManagementObject item in searcher.Get())
{
Object obj = item["Manufacturer"];
builder.Append(Convert.ToString(obj));
builder.Append(':');
obj = item["SerialNumber"];
builder.Append(Convert.ToString(obj));
}
return builder.ToString();
}
同様のロジックで、「Win32_DiskDrive」をステップスルーすることもできます。 http://msdn.Microsoft.com/en-us/library/aa394132.aspx ;物理ドライブごとに「シリアル番号」を取得します。この場合、
foreach (ManagementObject item in searcher.Get())
複数のアイテムを見つける必要があります
半一意で半定数の3つの識別子を取ります。確実な識別には3つのうち2つで十分であるというルールを使用します。時々間違っている3分の1の登録データを更新します。
ネットワークカードのMACアドレスを使用します。それはユニークであることになっています。ただし、変更することはできます。ユーザーがどの程度悪意があると予想されるか、およびアプリケーションがどれほど重要かによって異なります。
それを行うサンプルコード:
public string GetMACAddress() {
ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection moc = mc.GetInstances();
string MACAddress = String.Empty;
foreach (ManagementObject mo in moc) {
if (MACAddress == String.Empty) { // only return MAC Address from first card
if ((bool)mo["IPEnabled"] == true) MACAddress = mo["MacAddress"].ToString();
}
mo.Dispose();
}
return MACAddress;
}
使用できるものの1つは、ネットワークインターフェイスのMACです。また、複数の情報源を組み合わせることができます。 HDDシリアル番号、mac、プロセッサタイプなど、ハッシュを計算します。
同じドメインに同じ名前の2台のPCを搭載することは不可能だと思います。ドメイン名をキャプチャしようとしましたか?
こちらをご覧ください: 。netを使用してDellマシンからサービスタグを取得していますか?
レジストリからいくつかの一意のデータを取得できます。
各コンピューターには、通常の状況では一意のSIDがあります。