web-dev-qa-db-ja.com

優れた一意のPC識別子とは何ですか?

このチュートリアル のコードを見てきましたが、My.Computer.Nameコンピュータ間でローミングしない設定を保存します。ただし、ユーザーが同じ名前の2台のPCを持つことは完全に可能です。たとえば、各PCで同じユーザー名を使用したい場合、Username-PCという名前の2台のPCになる可能性があります。

異なるPCを識別する良い方法は何ですか? PCにはGUIDが関連付けられていますか、またはハードウェアからシリアル番号を取得する必要がありますか? Windowsを再インストールしても識別が保持されるかどうかは気にしません。

(リンクしたチュートリアルはVB.Netにありますが、C#で実装しています)

41
dlras2

良い識別子:

  • MACアドレス:簡単に入手でき、通常は一意です。ただし、それはかなり簡単になりすまし/変更される可能性があるため、必要な一意性に依存します。
  • CPUシリアル番号:多くの古いシステムでは使用できませんが、あります。 このMSDNページ をご覧ください。変更されませんが、コンピューターにバインドされています。
  • HDDシリアル番号:変更されない可能性がありますが、HDに障害が発生すると迷惑になる可能性があります。 このMSDNページ をご覧ください。
43
mattbasta

Windowsを使用している場合HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\ CurrentVersion\ProductIdは、マシンごと/ Windowsインストールごとに一意です。 MACアドレス、Proc SN、HD SNなどの他の回答の一部と同様、Windowsの再インストール/デュアルブートの状況間で同じままです。

19

その質問に対する本当の答え:そのようなことはありません。

いくつかの「十分に近い」ソリューションがありますが、それぞれに独自の制限があります。

すべてのハードウェアID-ハードウェアの変更。また、多くの場合、これらの識別子を変更できます(たとえば、MACスプーフィング)。

既にコメントしたように、SIDはあまり良くありません。コンピューターがイメージからインストールされた場合、SIDは変わらないからです。 SIDはWindowsのインストールによって生成されます。Windowsがインストールされていなかったが、イメージからコピーされた場合、SIDは変更されません( 「セキュリティリスク」に関する神話 =-あなたはそれを当てにすることはできません)。

コンピューター名-さて、前述のように、彼らは一意であると仮定しますが、それは決して強制されません。

実装できる別のソリューションは、独自の識別子を生成し、ローカルに保存することです(そのようなことができると仮定した場合)。繰り返しますが、コンピューターがアプリケーションでイメージ化されている場合、このソリューションは機能しません。

あなたにとって最良の解決策は、あなたが何を達成しようとしているかに本当に依存します。私は非常に大規模なネットワークでも同じ問題を抱えていましたが、私の場合の最良の解決策はコンピューターの名前でした。プロセスがイメージ化されないことが確実な場合、おそらく最も安全であるため、Guidを使用して一意の識別子を生成します。

11
DiGMi

コンピューターを一意に識別する方法を次に示します。 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())

複数のアイテムを見つける必要があります

9
andrewmcc

半一意で半定数の3つの識別子を取ります。確実な識別には3つのうち2つで十分であるというルールを使用します。時々間違っている3分の1の登録データを更新します。

5
Tomminn

ネットワークカードの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;
}
2
MicSim

使用できるものの1つは、ネットワークインターフェイスのMACです。また、複数の情報源を組み合わせることができます。 HDDシリアル番号、mac、プロセッサタイプなど、ハッシュを計算します。

1
schoetbi

同じドメインに同じ名前の2台のPCを搭載することは不可能だと思います。ドメイン名をキャプチャしようとしましたか?

0
user279521

こちらをご覧ください: 。netを使用してDellマシンからサービスタグを取得していますか?

レジストリからいくつかの一意のデータを取得できます。

0
JonH

各コンピューターには、通常の状況では一意のSIDがあります。

0
Steven Sudit