网上常见的都试过了不好用,比如:
首先在添加引用中选中System.Management
using System.Management;
using System.Management.Instrumentation;private void GetInfo()
{
string cpuInfo = "";//cpu序列号
ManagementClass cimobject = new ManagementClass("Win32_Processor");
ManagementObjectCollection moc = cimobject.GetInstances();
foreach(ManagementObject mo in moc)
{
cpuInfo = mo.Properties["ProcessorId"].Value.ToString();
Response.Write ("cpu序列号:"+cpuInfo.ToString ());
} //获取硬盘ID
String HDid;
ManagementClass cimobject1 = new ManagementClass("Win32_DiskDrive");
ManagementObjectCollection moc1 = cimobject1.GetInstances();
foreach(ManagementObject mo in moc1)
{
HDid = (string)mo.Properties["Model"].Value;
Response.Write ("硬盘序列号:"+HDid.ToString ());
}
//获取网卡硬件地址
ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection moc2 = mc.GetInstances();
foreach(ManagementObject mo in moc2)
{
if((bool)mo["IPEnabled"] == true)
Response.Write("MAC address\t{0}"+mo["MacAddress"].ToString());
mo.Dispose();
}
} public static float GetCPUPersent()
{
float cpuload = 0;
const string categoryname = "processor";
const string countername = "% processor time";
const string instancename = "_total";
PerformanceCounter pc = new PerformanceCounter(categoryname, countername, instancename);
int i = 10;
while (i > 0)
{
Thread.Sleep(1000); // wait for 1 second
cpuload = pc.NextValue();
if (cpuload > 0)
{
break;
}
i--;
}
return cpuload;
} public static void GetDiskSpace(string path, out long DiskAll, out long DiskActive)
{
DiskAll = 0;
DiskActive = 0;
long a, b, c;
int aaa = GetDiskFreeSpaceEx(path, out a, out b, out c);
DiskAll = (long)(b / 1024 / 1024);
DiskActive = (long)(a / 1024 / 1024);
} public static void GetMemoryInfo(out uint MemoryAll, out uint MemoryUsed)
{
MemoryAll = 0;
MemoryUsed = 0;
MEMORY_INFO MemInfo = new MEMORY_INFO();
GlobalMemoryStatus(ref MemInfo);
MemoryAll = MemInfo.dwTotalPhys / 1024 / 1024;
MemoryUsed = (MemInfo.dwTotalPhys - MemInfo.dwAvailPhys) / 1024 / 1024;
} [DllImport("kernel32")]
public static extern void GlobalMemoryStatus(ref MEMORY_INFO meminfo); //定义内存的信息结构
[StructLayout(LayoutKind.Sequential)]
public struct MEMORY_INFO
{
public uint dwLength;
public uint dwMemoryLoad;
public uint dwTotalPhys;
public uint dwAvailPhys;
public uint dwTotalPageFile;
public uint dwAvailPageFile;
public uint dwTotalVirtual;
public uint dwAvailVirtual;
} [DllImport("kernel32.dll", EntryPoint = "GetDiskFreeSpaceExA")]
public static extern int GetDiskFreeSpaceEx(string lpRootPathName, out long lpFreeBytesAvailable, out long lpTotalNumberOfBytes, out long lpTotalNumberOfFreeBytes);很多算法,不是不通用(有的取不到数据),就是不唯一(多次运行会变)
求一个好用的算法,谢谢!
首先在添加引用中选中System.Management
using System.Management;
using System.Management.Instrumentation;private void GetInfo()
{
string cpuInfo = "";//cpu序列号
ManagementClass cimobject = new ManagementClass("Win32_Processor");
ManagementObjectCollection moc = cimobject.GetInstances();
foreach(ManagementObject mo in moc)
{
cpuInfo = mo.Properties["ProcessorId"].Value.ToString();
Response.Write ("cpu序列号:"+cpuInfo.ToString ());
} //获取硬盘ID
String HDid;
ManagementClass cimobject1 = new ManagementClass("Win32_DiskDrive");
ManagementObjectCollection moc1 = cimobject1.GetInstances();
foreach(ManagementObject mo in moc1)
{
HDid = (string)mo.Properties["Model"].Value;
Response.Write ("硬盘序列号:"+HDid.ToString ());
}
//获取网卡硬件地址
ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection moc2 = mc.GetInstances();
foreach(ManagementObject mo in moc2)
{
if((bool)mo["IPEnabled"] == true)
Response.Write("MAC address\t{0}"+mo["MacAddress"].ToString());
mo.Dispose();
}
} public static float GetCPUPersent()
{
float cpuload = 0;
const string categoryname = "processor";
const string countername = "% processor time";
const string instancename = "_total";
PerformanceCounter pc = new PerformanceCounter(categoryname, countername, instancename);
int i = 10;
while (i > 0)
{
Thread.Sleep(1000); // wait for 1 second
cpuload = pc.NextValue();
if (cpuload > 0)
{
break;
}
i--;
}
return cpuload;
} public static void GetDiskSpace(string path, out long DiskAll, out long DiskActive)
{
DiskAll = 0;
DiskActive = 0;
long a, b, c;
int aaa = GetDiskFreeSpaceEx(path, out a, out b, out c);
DiskAll = (long)(b / 1024 / 1024);
DiskActive = (long)(a / 1024 / 1024);
} public static void GetMemoryInfo(out uint MemoryAll, out uint MemoryUsed)
{
MemoryAll = 0;
MemoryUsed = 0;
MEMORY_INFO MemInfo = new MEMORY_INFO();
GlobalMemoryStatus(ref MemInfo);
MemoryAll = MemInfo.dwTotalPhys / 1024 / 1024;
MemoryUsed = (MemInfo.dwTotalPhys - MemInfo.dwAvailPhys) / 1024 / 1024;
} [DllImport("kernel32")]
public static extern void GlobalMemoryStatus(ref MEMORY_INFO meminfo); //定义内存的信息结构
[StructLayout(LayoutKind.Sequential)]
public struct MEMORY_INFO
{
public uint dwLength;
public uint dwMemoryLoad;
public uint dwTotalPhys;
public uint dwAvailPhys;
public uint dwTotalPageFile;
public uint dwAvailPageFile;
public uint dwTotalVirtual;
public uint dwAvailVirtual;
} [DllImport("kernel32.dll", EntryPoint = "GetDiskFreeSpaceExA")]
public static extern int GetDiskFreeSpaceEx(string lpRootPathName, out long lpFreeBytesAvailable, out long lpTotalNumberOfBytes, out long lpTotalNumberOfFreeBytes);很多算法,不是不通用(有的取不到数据),就是不唯一(多次运行会变)
求一个好用的算法,谢谢!
public static String GetMainBoardInfo()
{
try
{
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_BaseBoard"))
{
StringBuilder sb = new StringBuilder();
ManagementObjectCollection moc = searcher.Get();
foreach (ManagementObject mo in moc)
{
sb.Append(mo["Manufacturer"]).Append(";").Append(mo["Product"]).Append(";").Append(mo["SerialNumber"]); }
return sb.ToString();
};
}
catch (Exception ex)
{
return "Hewlett-Packard;0A54h;CNG7200QDG";
}
}我们一直用
#include "windows.h"
#include "iostream"
#include "string"using namespace std;//用来存储信息
DWORD deax;
DWORD debx;
DWORD decx;
DWORD dedx;void ExeCPUID(DWORD veax)//初始化CPU
{
__asm
{
mov eax,veax
cpuid
mov deax,eax
mov debx,ebx
mov decx,ecx
mov dedx,edx
}
}long GetCPUFreq()//获取CPU频率,单位: MHZ
{
int start1,start2;
_asm rdtsc
_asm mov start1,eax
Sleep(50);
_asm rdtsc
_asm mov start2,eax
return (start2-start1)/50000;
}string GetManID()//获取制造商信息
{
char ID[25];//存储制造商信息
memset(ID,0,sizeof(ID));//先清空数组 ID
ExeCPUID(0);//初始化
memcpy(ID+0,&debx,4);//制造商信息前四个字符复制到数组
memcpy(ID+4,&dedx,4);//中间四个
memcpy(ID+8,&decx,4);//最后四个
//如果返回 char * ,会出现乱码;故返回 string 值
return string(ID);
}string GetCPUType()
{
const DWORD id = 0x80000002; //从0x80000002开始,到0x80000004结束
char CPUType[49];//用来存储CPU型号信息
memset(CPUType,0,sizeof(CPUType));//初始化数组for(DWORD t = 0 ; t < 3 ; t++ )
{
ExeCPUID(id+t);
//每次循环结束,保存信息到数组
memcpy(CPUType+16*t+ 0,&deax,4);
memcpy(CPUType+16*t+ 4,&debx,4);
memcpy(CPUType+16*t+ 8,&decx,4);
memcpy(CPUType+16*t+12,&dedx,4);
}return string(CPUType);
}void main()
{
cout<<"本机CPU信息如下:"<<endl;
cout<<"CPU 主 频: "<<GetCPUFreq()<<" MHZ"<<endl;
cout<<"CPU 制造商: "<<GetManID()<<endl;
cout<<"CPU 型 号: "<<GetCPUType()<<endl;
cin.get();}c#调用汇编代码的例子网上有。
我也用过,稍有不同: public String GetBaseBoard()
{
try
{
List<string> list = new List<string>();
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_BaseBoard");
String ret = null;
foreach (ManagementObject mo in searcher.Get())
{
ret = mo["SerialNumber"].ToString().Trim();
if (!string.IsNullOrEmpty(ret))
list.Add(ret);
}
if (list.Count > 0)
{
list.Sort();
return list[0];
}
}
catch
{
} return string.Empty;
}好像跟你的没太大区别呀,你确定你的算出来时唯一并且不变的吗?
核心还是SerialNumber字段,有人说重装系统后SerialNumber会变,我也没重装系统测试过。
再对比验证
我发的那个代码是用汇编写的。
你也可以把他编译个标准的dll。用LoadLibrary加载。
那是直接取cpu的ID不可能改的。
至于wmi的方式。我机子上的这个服务从来都关闭的。