c# 获取机器唯一识别码的示例
前言
在客户端认证的过程中,我们总要获取客户机的唯一识别信息,曾经以为MAC地址是不会变的,但是现在各种改,特别是使用无线上网卡,MAC地址插一次变一次,所以这样使用MAC就没有什么意义了,怎么办,又开始求助Google,最后找到一个折中的方案
原理
通过获取主板、处理器、BIOS、mac、显卡、硬盘等的ID生成唯一识别码
建议
1、使用那些不经常更换的模块来生成识别码。
2、如果经常更换MAC,显卡,硬盘,则不要使用这些ID。
3、确保使用static变量在整个应用来保存唯一识别码。
实现
注意引用System.Management
usingSystem;
usingSystem.Management;
usingSystem.Security.Cryptography;
usingSystem.Security;
usingSystem.Collections;
usingSystem.Text;
namespaceSecurity
{
///
///Generatesa16byteUniqueIdentificationcodeofacomputer
///Example:4876-8DB5-EE85-69D3-FE52-8CF7-395D-2EA9
/// 
publicclassFingerPrint
{
privatestaticstringfingerPrint=string.Empty;
publicstaticstringValue()
{
if(string.IsNullOrEmpty(fingerPrint))
{
fingerPrint=GetHash("CPU>>"+cpuId()+"\nBIOS>>"+
biosId()+"\nBASE>>"+baseId()
//+"\nDISK>>"+diskId()+"\nVIDEO>>"+
videoId()+"\nMAC>>"+macId()
);
}
returnfingerPrint;
}
privatestaticstringGetHash(strings)
{
MD5sec=newMD5CryptoServiceProvider();
ASCIIEncodingenc=newASCIIEncoding();
byte[]bt=enc.GetBytes(s);
returnGetHexString(sec.ComputeHash(bt));
}
privatestaticstringGetHexString(byte[]bt)
{
strings=string.Empty;
for(inti=0;i>4)&15;
if(n2>9)
s+=((char)(n2-10+(int)'A')).ToString();
else
s+=n2.ToString();
if(n1>9)
s+=((char)(n1-10+(int)'A')).ToString();
else
s+=n1.ToString();
if((i+1)!=bt.Length&&(i+1)%2==0)s+="-";
}
returns;
}
#regionOriginalDeviceIDGettingCode
//Returnahardwareidentifier
privatestaticstringidentifier
(stringwmiClass,stringwmiProperty,stringwmiMustBeTrue)
{
stringresult="";
System.Management.ManagementClassmc=
newSystem.Management.ManagementClass(wmiClass);
System.Management.ManagementObjectCollectionmoc=mc.GetInstances();
foreach(System.Management.ManagementObjectmoinmoc)
{
if(mo[wmiMustBeTrue].ToString()=="True")
{
//Onlygetthefirstone
if(result=="")
{
try
{
result=mo[wmiProperty].ToString();
break;
}
catch
{
}
}
}
}
returnresult;
}
//Returnahardwareidentifier
privatestaticstringidentifier(stringwmiClass,stringwmiProperty)
{
stringresult="";
System.Management.ManagementClassmc=
newSystem.Management.ManagementClass(wmiClass);
System.Management.ManagementObjectCollectionmoc=mc.GetInstances();
foreach(System.Management.ManagementObjectmoinmoc)
{
//Onlygetthefirstone
if(result=="")
{
try
{
result=mo[wmiProperty].ToString();
break;
}
catch
{
}
}
}
returnresult;
}
privatestaticstringcpuId()
{
//UsesfirstCPUidentifieravailableinorderofpreference
//Don'tgetallidentifiers,asitisverytimeconsuming
stringretVal=identifier("Win32_Processor","UniqueId");
if(retVal=="")//IfnoUniqueID,useProcessorID
{
retVal=identifier("Win32_Processor","ProcessorId");
if(retVal=="")//IfnoProcessorId,useName
{
retVal=identifier("Win32_Processor","Name");
if(retVal=="")//IfnoName,useManufacturer
{
retVal=identifier("Win32_Processor","Manufacturer");
}
//Addclockspeedforextrasecurity
retVal+=identifier("Win32_Processor","MaxClockSpeed");
}
}
returnretVal;
}
//BIOSIdentifier
privatestaticstringbiosId()
{
returnidentifier("Win32_BIOS","Manufacturer")
+identifier("Win32_BIOS","SMBIOSBIOSVersion")
+identifier("Win32_BIOS","IdentificationCode")
+identifier("Win32_BIOS","SerialNumber")
+identifier("Win32_BIOS","ReleaseDate")
+identifier("Win32_BIOS","Version");
}
//MainphysicalharddriveID
privatestaticstringdiskId()
{
returnidentifier("Win32_DiskDrive","Model")
+identifier("Win32_DiskDrive","Manufacturer")
+identifier("Win32_DiskDrive","Signature")
+identifier("Win32_DiskDrive","TotalHeads");
}
//MotherboardID
privatestaticstringbaseId()
{
returnidentifier("Win32_BaseBoard","Model")
+identifier("Win32_BaseBoard","Manufacturer")
+identifier("Win32_BaseBoard","Name")
+identifier("Win32_BaseBoard","SerialNumber");
}
//PrimaryvideocontrollerID
privatestaticstringvideoId()
{
returnidentifier("Win32_VideoController","DriverVersion")
+identifier("Win32_VideoController","Name");
}
//FirstenablednetworkcardID
privatestaticstringmacId()
{
returnidentifier("Win32_NetworkAdapterConfiguration",
"MACAddress","IPEnabled");
}
#endregion
}
} 
补充
现在遇到一些平板等简陋的机型,竟然获取到的所有设备标识都一样(除了mac),最后只好在本地再生成一个软件自身的标识,然后每次在计算标识的时候附带上,这样不会再重复了吧。
代码如下:
privatestaticstringlocalkey()
{
stringpath=Environment.CurrentDirectory+"client.key";
if(File.Exists(path))
{
StreamReadersr=newStreamReader(path);
stringkey=sr.ReadLine();
sr.Close();
returnkey;
}
else
{
StreamWritersw=File.CreateText(path);
stringkey=Guid.NewGuid().ToString();
sw.WriteLine(key);
sw.Close();
returnkey;
}
}
可以再把该文件设为隐藏等手段,防止用户误操作。
补充2
文件容易被误删,还可以写入注册表,除非系统重装,但是需要以管理员权限运行
classRegistryHelper
{
conststring_uriDeviecId="SOFTWARE\\YourCompany\\YouApp";
publicstaticstringGetDeviceId()
{
stringret=string.Empty;
using(varobj=Registry.LocalMachine.OpenSubKey(_uriDeviecId,false))
{
if(obj!=null)
{
varvalue=obj.GetValue("DeviceId");
if(value!=null)
ret=Convert.ToString(value);
}
}
returnret;
}
publicstaticvoidSetDeviceId()
{
using(MD5md5Hash=MD5.Create())
{
byte[]data=md5Hash.ComputeHash(Encoding.UTF8.GetBytes(DateTime.Now.ToString()));
StringBuildersBuilder=newStringBuilder();
for(inti=0;i
以上就是c#获取机器唯一识别码的示例的详细内容,更多关于c#获取机器识别码的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。