1

Windows SDK には、 computerhardwareidsという名前の CLI ツールがあります。

このツールは、特定のケースに適切な HardwareId を選択するために、さまざまな GUID を返します。

これは、私の PC でこのツールを返す出力です。

Using the BIOS to gather information

Computer Information
--------------------

BIOS Vendor: American Megatrends Inc.
BIOS Version string: 1201
System BIOS Major Release: 4
System BIOS Minor Release: 6

System Manufacturer: To be filled by O.E.M.
System Family: To be filled by O.E.M.
System ProductName: To be filled by O.E.M.
SKU Number: SKU

Enclosure Type: 03 "Desktop"


Hardware IDs
------------
{a8670b03-1d98-5e95-ad4e-c64211eac9df}    <- Manufacturer + Family + ProductName + SKUNumber + BIOS Vendor + BIOS Version + BIOS Major Release + BIOS Minor Release
{01c6b2a2-a2b2-58e4-906d-4677639f1a42}    <- Manufacturer + Family + ProductName + BIOS Vendor + BIOS Version + BIOS Major Release + BIOS Minor Release
{dc5af3fe-c2de-539d-aafd-5061a1634723}    <- Manufacturer + ProductName + BIOS Vendor + BIOS Version + BIOS Major Release + BIOS Minor Release
{d78b474d-dee0-5412-bc9d-e9f7d7783df2}    <- Manufacturer + Family + ProductName + SKUNumber
{7ccbb6f1-9641-5f84-b00d-51ff218a4066}    <- Manufacturer + Family + ProductName
{5a127cba-be28-5d3b-84f0-0e450d266d97}    <- Manufacturer + SKUNumber
{6525c6e5-28e9-5f9c-abe4-20fd82504002}    <- Manufacturer + ProductName
{6525c6e5-28e9-5f9c-abe4-20fd82504002}    <- Manufacturer + Family
{482f3f58-6045-593a-9be4-611717ce4770}    <- Manufacturer + Enclosure Type
{11b4a036-3b64-5421-a372-22c07df10a4d}    <- Manufacturer

そのMicrosoftツールの機能を模倣し、まったく同じHardwareIds(まったく同じ)を返す汎用使用関数を開発したいと思います。

MSDN で情報を見つけました。すべての出力は非常に文書化されているようで、このツールを返す値に関する情報が含まれていますが、WMI クラスのプロパティを正確に指定していません。「Bios」と「System」とだけ表示されています。 :

· ComputerHardwareIds の概要

·コンピュータのハードウェア ID を指定する

「ファミリ」、「BIOS ベンダー」、「BIOS メジャー リリース」、「BIOS マイナー リリース」などの値が見つからず、「SKU 番号」がどこを指しているのかわかりません。

これらは、ツールがすべてのデータの一部を取得して GUID を作成する WMI クラスだと思います。

· Win32_BIOS クラス

Win32_BaseBoard クラス

· Win32_ComputerSystem クラス

· Win32_ComputerSystemProduct クラス

ドキュメントにも次のように記載されていることに注意してください。

各文字列は、SHA-1 ハッシュ アルゴリズムを使用して GUID に変換されます。


これは私がやろうとしたことですが、いくつかの概念やいくつかの値が間違っているかどうかはわかりません.不完全であり、Guisにも問題があります(コメントラインで説明されています):

Private Function GetHardwareId() As Guid

    Dim HardwareId As String = String.Empty

    Dim BIOSVersion, BIOSVendor, BIOSMajorRelease, BIOSMinorRelease,
        SystemManufacturer, SystemFamily, SystemProductName, SKUNumber As String

    ' Get System Info.
    Using wmi As New Management.ManagementObjectSearcher("select * from Win32_ComputerSystem")

        Using SystemInfo As Management.ManagementObject = wmi.Get(0)

            SystemManufacturer = Convert.ToString(SystemInfo.Properties("Manufacturer").Value)
            SystemProductName = Convert.ToString(SystemInfo.Properties("Model").Value)
            SystemFamily = I don't know how to get it.
            SKUNumber = I don't know how to get it.

        End Using

    End Using

    ' Get BIOS Info.
    Using wmi As New Management.ManagementObjectSearcher("select * from Win32_BIOS")

        Using BIOSInfo As Management.ManagementObject = wmi.Get(0)

            BIOSVersion = Convert.ToString(BIOSInfo.Properties("SMBIOSBIOSVersion").Value) 
            BIOSVendor = I don't know how to get it.
            BIOSMajorRelease = I don't know how to get it.
            BIOSMinorRelease = I don't know how to get it.

        End Using

    End Using ' wmi

    HardwareId = BIOSVersion & BIOSVendor & BIOSMajorRelease & BIOSMinorRelease &
                 SystemManufacturer & SystemFamily & SystemProductName & SKUNumber

    ' Here I call other method to encode the resulting string to SHA1 Hash
    HardwareId = ConvertToSHA1(HardwareId)
    ' and then continue below...

    ' But this will not work, 
    ' it throws an exception about missing "-" chars in the SHA1 string.
    ' So Microsoft formats "manualy" the SHA1 string to add some "-"?
    Return Guid.Parse(HardwareId)

End Function
4

3 に答える 3

2

あなたの問題はあなたが望むように解決できるとは思いません。しかし、まだそうする理由もありません。

MS は、提供されたさまざまなデータの SHA ハッシュから確定的な GUIDを作成しています。4 つの定義済み GUID 名前空間の 1 つを含むrfc422 標準に従って作成された場合、これら 4 つの名前空間のいずれかを使用して、同じデータから GUID を再作成できるはずです。

ただし、a) できません。b) MSDN の「コンピューターのハードウェア ID の指定」には次のように記載されていますthe hardware ID for the computer must be produced by the ComputerHardwareIds tool (ComputerHardwareIDs.exe)...。これにより、独自の方法(Salt、秘密鍵など)を使用するか、独自の名前空間を定義してこれらを生成すると思われます。

二次/サブの質問に対するいくつかの回答:

  • BIOS バージョン/リリース - DTMF.org 仕様によると、表 5の「リリース」はオフセット &H14 および &H15 にあり、「バージョン」とは異なります。ただし、それらは Name、Caption、Description、および SoftwareElementID プロパティに埋め込まれている場合もあります Win32_BIOS(以下のツールを参照)。隠れているようにも見えますWin32_BIOS.BiosVersion(1)が、名前/キャプションなどと同じです。

私たちのシステムが数年離れているのに、リリース値が同じであることは少し不思議です。これは、SMBios リリース/仕様を参照している可能性があります。

  • SKU: MSDN によると、これは AKA ですIdentificationCode

  • ファミリ: どうやら BIOS エンコーディングの一部ですが、WMI はそれを公開したり返したりしません (まだ?)。

  • 同じことが製品名にも当てはまりModelます。他の場所から取得したものは、偶然に同じ値を持つ場合があります。

したがって、ハッシュで使用される値がすべて公開されているようには見えません。私の古いシステムでは、Family と SKU は null です。その結果、1 番目と 2 番目の ID は同じでなければならないように見えますが、そうではありません。

GUID/ID がそのツールからしか利用できない場合、これらが何のためにあるのか、平均的なアプリにとってどのように価値があるのか​​はわかりません。SDK の他の部分を調べて、実行時に情報を提供するアセンブリなどがあるかどうかを確認できます。

システムまたはデバイスを次に見たときに認識したいだけの場合は、rfc422 に基づいて独自のメソッドを記述して、定義した名前空間内で一意の値がまったく同じ「非常に高い確率」で保証されるようにすることができます。MS のようにそれを行う唯一の理由は、その値が他の場所からもたらされることを確認する場合ですが、そうではありません。

最後に、GUID メーカーを投稿することは気にしませんでした。


プロパティ値をフェッチする WMI ヘルパー:

Public Sub GetWMIInfo(wmiclass As String)

    Using searcher As New Management.ManagementObjectSearcher("select * from " & wmiclass)

        For Each item As System.Management.ManagementObject In searcher.Get
            DebugProperties(item)
        Next

    End Using
End Sub

' this sub is copied from the watcher answer I gave:
Private Sub DebugProperties(mo As Management.ManagementObject)

    For Each pd As PropertyData In mo.Properties
        If pd.Value IsNot Nothing Then
            ' some props are string arrays, so you can iterate them if you want

            Console.WriteLine("{0} {1}", pd.Name,
                              If(pd.Value IsNot Nothing,
                                 pd.Value.ToString,
                                 "Nothing"))
        End If

    Next
End Sub

出力は次のようになります。

Caption BIOS Date: XXXXXXXXXXXX Ver: 04.06.04
Description BIOS Date: ##/##/## 11:18:49 Ver: 04.06.04
Manufacturer Dell Inc.
Name BIOS Date: ##/##/## 11:18:49 Ver: 04.06.04
PrimaryBIOS True
ReleaseDate ########000000.000000+000
SerialNumber ######
SMBIOSBIOSVersion A##
SMBIOSMajorVersion #
SMBIOSMinorVersion #
于 2014-08-07T20:09:58.113 に答える