我正在寻找一种获取唯一计算机ID的方法。
根据这篇文章,我不能为此目的使用处理器ID。 我可以拿主板ID吗? 识别计算机的最佳方法是什么?
这与C#无关。
人们会假设(回答编程问题时,我很高兴地发现),一旦确定了通用机制,就需要使用C#的特定实现...
这个问题应该使用什么标签?
可能重复:stackoverflow.com/questions/3443093/
如果您想获得有关如何在C#中获得唯一计算机ID的示例,则应使用C#对其进行标记...我想这不是您想要的吗?
就像您说过的CPU ID不会是唯一的一样,但是您可以将其与另一个硬件标识符一起使用来创建自己的唯一密钥。
参考组件System.Management
因此,使用以下代码获取CPU ID:
string cpuInfo = string.Empty;
ManagementClass mc = new ManagementClass("win32_processor");
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
cpuInfo = mo.Properties["processorID"].Value.ToString();
break;
}
然后使用以下代码获取HD ID:
string drive ="C";
ManagementObject dsk = new ManagementObject(
@"win32_logicaldisk.deviceid=""" + drive + @":""");
dsk.Get();
string volumeSerial = dsk["VolumeSerialNumber"].ToString();
然后,您可以将这两个序列结合起来以获取该机器的uniqueId:
string uniqueId = cpuInfo + volumeSerial;
显然,获得ID的硬件组件越多,唯一性就越大。但是,同一台计算机具有相同的CPU序列和硬盘序列的机会已经微乎其微。
正如我之前所说,处理器ID是不合适的。
@StuffHappens-更新了答案。
我明白你的意思。我只是怀疑如果有RAID并有2个不同的HDD(磁盘C),我将得到什么。
@StuffHappens-我假设它最终可能会返回RAID控制器ID或其他内容。我肯定微软已经考虑过了。
@StuffHappens,只需将多个ID的硬盘哈希在一起即可。
FWIW,我使用处理器ID和磁盘序列号(带有回退)构建了一个唯一的ID生成器,但在同时从Dell购买的两台计算机上都失败了。
FWI,VolumeSerialNumber不是硬盘序列号...
我需要在通过ClickOnce发布的应用程序中使用类似的方法。我的最终用户对他们的PC的访问权限可能相当有限。如果最终用户不是其计算机上的管理员,此方法会引起任何问题吗?可以在XP / 7/8上使用吗?谢谢。我确实需要为我的项目派生一个唯一的本地密钥。
@GenericTypeTea我遇到错误:尝试通过安全透明方法demo.Program.demo()访问安全关键方法System.Management.ManagementClass..ctor(System.String)失败。
这不会产生唯一的ID。到目前为止,我们已经在从Dell购买的15台计算机上对此进行了测试,并且已经有3台具有相同的ID。
也许不仅仅像答案中所说的那样尝试两个组件?
@GenericTypeTea:此uniqueId的长度是否固定?
wmic csproduct get UUID是个好主意
网络适??配器的MAC地址?
Windows OS安装的安全标识符(SID)? (假设您正在处理的是窗户)
您能为每台PC生成一个GUID吗?
您到底想达到什么目的?
+1仅用于生成GUID:P
如果他试图通过许可机制执行此操作,则可以很容易地更改SID和MAC地址,因此是不可接受的。
主板ID是一个非常独特的标识符。另一种选择是使用非常独特的网卡MAC地址。
但是应注意,可以从许多NIC的NIC属性窗口更改MAC,而主板ID很难更改。
据我所知,您可以更改您的mac地址。如果有多个滑板,该怎么办(或者我应该如何命名)?
那是对的。主板ID更独特。但是,如果您不需要非常强的唯一性(即可以假设MAC不变),则获取MAC地址要容易得多。 @Stuff,将地址哈希在一起? :)