SCENARIO
我想学习,在C# or VB.NET,如何生成硬件 ID。基于微软开发人员为此所做的相同方法。
首先,在继续之前,我必须声明这个问题是从另一个问题派生出来的一个更好的具体不同问题:像 Microsoft 一样获取硬件 ID https://stackoverflow.com/questions/25190906/get-hardware-ids-like-microsoft-does
创建 Microsoft 的 HWID 的基本问题是基于SMBIOS表,在上面链接的问题的答案中进行了描述,并且在此处进行了更深入的描述:指定计算机的硬件 ID https://learn.microsoft.com/en-us/windows-hardware/drivers/install/specifying-hardware-ids-for-a-computer
我尝试重现他们的方法的原因只是为了遵循关于如何以正确的方式做事的专业标准指南:微软的方式。
PROBLEM
自从获得SMBIOS来自托管的表.NET似乎是一个不可能/未实现的任务,而且我也找不到 Win32 函数的任何演示性使用示例:获取系统固件表 https://msdn.microsoft.com/en-us/library/windows/desktop/ms724379(v=vs.85).aspx,无论如何,a的字段解析SMBIOS表这似乎是一场真正的噩梦,对于一个开发人员来说工作量太大了。 ...因为我怀疑工作解析器算法需要不时地维护/更新:SMBIOS 版本历史 https://www.dmtf.org/standards/smbios
...然后我假设了这一切,并且我选择使用WMI有限制地重现的类(SMBIOS字段WMI不暴露或始终为空使用WMI)我可以从 Microsoft 的 HWID 实现的原始概念中重现所有内容。
为了尝试开始重现 Microsoft 所做的事情,我尝试开始生成仅采用一个字段的 HWID:SMBIOS制造商。
我的问题是我做错了什么,而且我不知道到底是什么......
所以,我注意到我的代码存在的问题:
- 我的结果SHA-1字符串不同于GUID是用SHA-1这是使用生成的计算机硬件Ids.exe工具包含在WDK/SDK: 计算机硬件 ID 规范 https://learn.microsoft.com/en-us/windows-hardware/drivers/devtest/computerhardwareids
(这些 HWID 创建的基础知识在我在“SCENARIO' 这个问题的部分,我坚持)
然后,您需要使用类型 5 (SHA-1) UUID 生成方案
70ffd812-4c7f-4c7d-0000-000000000000 作为命名空间
...但我承认我不明白他所说的使用命名空间作为密码是什么意思?我在构建我的时可能会错过这个细节SHA-1细绳。我试图分析一下该组织的成员SHA1CryptoServiceProvider
类在搜索某些属性以在其中指定名称空间...没有找到。
这是我正在使用的代码,我对制造商字符串检索进行了硬编码,只是为了简化事情:
C# 示例:
string manufacturer = "American Megatrends Inc.";
byte[] charBuff = Encoding.Unicode.GetBytes(manufacturer); // UTF-16
byte[] hashBuff = null;
string hashStr = null;
using (SHA1CryptoServiceProvider cypher = new SHA1CryptoServiceProvider()) {
hashBuff = cypher.ComputeHash(charBuff);
hashStr = BitConverter.ToString(hashBuff).Replace("-", ""); // Same string conversion methodology employed in a MSDN article.
}
Debug.WriteLine("SHA-1=\"{0}\"", hashStr); // SHA-1="0E74E534EE9F1985AE173C640302F58121190593"
Guid guid = new Guid(hashBuff); // System.ArgumentException: 'Byte array for GUID must be exactly 16 bytes long.'
VB.NET 示例:
Dim manufacturer As String = "American Megatrends Inc."
Dim charBuff As Byte() = Encoding.Unicode.GetBytes(manufacturer) ' UTF-16
Dim hashBuff As Byte()
Dim hashStr As String
Using cypher As New SHA1CryptoServiceProvider
hashBuff = cypher.ComputeHash(charBuff)
hashStr = BitConverter.ToString(hashBuff).Replace("-", "") ' Same string conversion methodology employed in a MSDN article.
End Using
Debug.WriteLine("SHA-1=""{0}""", hashStr) ' SHA-1="0E74E534EE9F1985AE173C640302F58121190593"
Dim guid As New Guid(hashBuff) ' System.ArgumentException: 'Byte array for GUID must be exactly 16 bytes long.'
预期结果GUID会是一样的GUID认为计算机硬件Ids.exe工具生成:
{035a20a6-fccf-5040-bc3e-b8b794c57f52}
QUESTION
好吧,只是......我需要什么以及如何修复我的代码以获得预期的结果?