`
wsql
  • 浏览: 11756898 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

用C#获取CPU编号、硬盘编号等系统有关环境、属性

 
阅读更多

用C#获取CPU编号、硬盘编号等系统有关环境、属性
如果利用C#获取系统有关环境和属性,这个也是在网上问得比较多的问题,不过大部分只有提问没有回答,最近正好想做有关方面的东西,整理了一下,提供给大家,希望能给大家提供参考意见:

首先需要定义几个结构(struct) ,便于DllImport作为返回参数调用。以下是代码:
CpuInfo.cs

using System;
using System.Configuration;
using System.Runtime.InteropServices;

/**//**
* LayoutKind.Automatic:为了提高效率允许运行态对类型成员重新排序
* 注意:永远不要使用这个选项来调用不受管辖的动态链接库函数。
* LayoutKind.Explicit:对每个域按照FieldOffset属性对类型成员排序
* LayoutKind.Sequential:对出现在受管辖类型定义地方的不受管辖内存中的类型成员进行排序。
*/

/**////


/// 定义CPU的信息结构
///
[StructLayout(LayoutKind.Sequential)]
public struct CpuInfo
...{
/**////
/// OEM ID
///
public uint dwOemId;
/**////
/// 页面大小
///
public uint dwPageSize;
public uint lpMinimumApplicationAddress;
public uint lpMaximumApplicationAddress;
public uint dwActiveProcessorMask;
/**////
/// CPU个数
///
public uint dwNumberOfProcessors;
/**////
/// CPU类型
///
public uint dwProcessorType;
public uint dwAllocationGranularity;
/**////
/// CPU等级
///
public uint dwProcessorLevel;
public uint dwProcessorRevision;
}
MemoryInfo.cs
using System;
using System.Configuration;
using System.Runtime.InteropServices;

/**//**
* LayoutKind.Automatic:为了提高效率允许运行态对类型成员重新排序
* 注意:永远不要使用这个选项来调用不受管辖的动态链接库函数。
* LayoutKind.Explicit:对每个域按照FieldOffset属性对类型成员排序
* LayoutKind.Sequential:对出现在受管辖类型定义地方的不受管辖内存中的类型成员进行排序。
*/
/**////


/// 定义内存的信息结构
///
[StructLayout(LayoutKind.Sequential)]
public struct MemoryInfo
...{
/**////
///
///
public uint dwLength;
/**////
/// 已经使用的内存
///
public uint dwMemoryLoad;
/**////
/// 总物理内存大小
///
public uint dwTotalPhys;
/**////
/// 可用物理内存大小
///
public uint dwAvailPhys;
/**////
/// 交换文件总大小
///
public uint dwTotalPageFile;
/**////
/// 可用交换文件大小
///
public uint dwAvailPageFile;
/**////
/// 总虚拟内存大小
///
public uint dwTotalVirtual;
/**////
/// 可用虚拟内存大小
///
public uint dwAvailVirtual;
}
SystemTimeInfo.cs
using System;
using System.Configuration;
using System.Runtime.InteropServices;

/**//**
* LayoutKind.Automatic:为了提高效率允许运行态对类型成员重新排序
* 注意:永远不要使用这个选项来调用不受管辖的动态链接库函数。
* LayoutKind.Explicit:对每个域按照FieldOffset属性对类型成员排序
* LayoutKind.Sequential:对出现在受管辖类型定义地方的不受管辖内存中的类型成员进行排序。
*/
/**////


/// 定义系统时间的信息结构
///
[StructLayout(LayoutKind.Sequential)]
public struct SystemTimeInfo
...{
/**////
/// 年
///
public ushort wYear;
/**////
/// 月
///
public ushort wMonth;
/**////
/// 星期
///
public ushort wDayOfWeek;
/**////
/// 天
///
public ushort wDay;
/**////
/// 小时
///
public ushort wHour;
/**////
/// 分钟
///
public ushort wMinute;
/**////
/// 秒
///
public ushort wSecond;
/**////
/// 毫秒
///
public ushort wMilliseconds;
}
另外还定义了一个调用类SystemInfo.cs,代码如下:
using System;
using System.Configuration;
using System.Runtime.InteropServices;
using System.Management;
using System.Text;

/**////


/// SystemInfo 的摘要说明
///
public class SystemInfo
...{
private const int CHAR_COUNT = 128;
public SystemInfo()
...{

}
[DllImport("kernel32")]
private static extern void GetWindowsDirectory(StringBuilder WinDir, int count);

[DllImport("kernel32")]
private static extern void GetSystemDirectory(StringBuilder SysDir, int count);

[DllImport("kernel32")]
private static extern void GetSystemInfo(ref CpuInfo cpuInfo);

[DllImport("kernel32")]
private static extern void GlobalMemoryStatus(ref MemoryInfo memInfo);

[DllImport("kernel32")]
private static extern void GetSystemTime(ref SystemTimeInfo sysInfo);

/**////


/// 查询CPU编号
///
///
public string GetCpuId()
...{
ManagementClass mClass = new ManagementClass("Win32_Processor");
ManagementObjectCollection moc = mClass.GetInstances();
string cpuId=null;
foreach (ManagementObject mo in moc)
...{
cpuId = mo.Properties["ProcessorId"].Value.ToString();
break;
}
return cpuId;
}

/**////


/// 查询硬盘编号
///
///
public string GetMainHardDiskId()
...{
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia");
String hardDiskID=null;
foreach (ManagementObject mo in searcher.Get())
...{
hardDiskID = mo["SerialNumber"].ToString().Trim();
break;
}
return hardDiskID;
}

/**////


/// 获取Windows目录
///
///
public string GetWinDirectory()
...{
StringBuilder sBuilder = new StringBuilder(CHAR_COUNT);
GetWindowsDirectory(sBuilder, CHAR_COUNT);
return sBuilder.ToString();
}

/**////


/// 获取系统目录
///
///
public string GetSysDirectory()
...{
StringBuilder sBuilder = new StringBuilder(CHAR_COUNT);
GetSystemDirectory(sBuilder, CHAR_COUNT);
return sBuilder.ToString();
}

/**////


/// 获取CPU信息
///
///
public CpuInfo GetCpuInfo()
...{
CpuInfo cpuInfo = new CpuInfo();
GetSystemInfo(ref cpuInfo);
return cpuInfo;
}

/**////


/// 获取系统内存信息
///
///
public MemoryInfo GetMemoryInfo()
...{
MemoryInfo memoryInfo = new MemoryInfo();
GlobalMemoryStatus(ref memoryInfo);
return memoryInfo;
}

/**////


/// 获取系统时间信息
///
///
public SystemTimeInfo GetSystemTimeInfo()
...{
SystemTimeInfo systemTimeInfo = new SystemTimeInfo();
GetSystemTime(ref systemTimeInfo);
return systemTimeInfo;
}

/**////


/// 获取系统名称
///
///
public string GetOperationSystemInName()
...{
OperatingSystem os = System.Environment.OSVersion;
string osName = "UNKNOWN";
switch (os.Platform)
...{
case PlatformID.Win32Windows:
switch (os.Version.Minor)
...{
case 0: osName = "Windows 95"; break;
case 10: osName = "Windows 98"; break;
case 90: osName = "Windows ME"; break;
}
break;
case PlatformID.Win32NT:
switch (os.Version.Major)
...{
case 3: osName = "Windws NT 3.51"; break;
case 4: osName = "Windows NT 4"; break;
case 5: if (os.Version.Minor == 0)
...{
osName = "Windows 2000";
}
else if (os.Version.Minor == 1)
...{
osName = "Windows XP";
}
else if (os.Version.Minor == 2)
...{
osName = "Windows Server 2003";
}
break;
case 6: osName = "Longhorn"; break;
}
break;
}
return String.Format("{0},{1}", osName, os.Version.ToString());
}
}
以下是调用实例,为了简单,我在一个aspx页面中输出,不过这个程序可以在WinForm中调用:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Collections.Specialized;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Runtime.InteropServices;

public partial class Index : System.Web.UI.Page
...{
protected void Page_Load(object sender, EventArgs e)
...{
if (!Page.IsPostBack)
...{
SystemInfo systemInfo = new SystemInfo();
Response.Write("操作系统:" + systemInfo.GetOperationSystemInName() + "
");
Response.Write("CPU编号:"+systemInfo.GetCpuId() + "
");
Response.Write("硬盘编号:"+systemInfo.GetMainHardDiskId() + "
");
Response.Write("Windows目录所在位置:" + systemInfo.GetSysDirectory() + "
");
Response.Write("系统目录所在位置:" + systemInfo.GetWinDirectory() + "
");
MemoryInfo memoryInfo = systemInfo.GetMemoryInfo();
CpuInfo cpuInfo = systemInfo.GetCpuInfo();
Response.Write("dwActiveProcessorMask" + cpuInfo.dwActiveProcessorMask + "
");
Response.Write("dwAllocationGranularity" + cpuInfo.dwAllocationGranularity + "
");
Response.Write("CPU个数:" + cpuInfo.dwNumberOfProcessors + "
");
Response.Write("OEM ID:" + cpuInfo.dwOemId + "
");
Response.Write("页面大小" + cpuInfo.dwPageSize + "
");
Response.Write("CPU等级" + cpuInfo.dwProcessorLevel + "
");
Response.Write("dwProcessorRevision" + cpuInfo.dwProcessorRevision + "
");
Response.Write("CPU类型" + cpuInfo.dwProcessorType + "
");
Response.Write("lpMaximumApplicationAddress" + cpuInfo.lpMaximumApplicationAddress + "
");
Response.Write("lpMinimumApplicationAddress" + cpuInfo.lpMinimumApplicationAddress + "
");
Response.Write("CPU类型:" + cpuInfo.dwProcessorType + "
");
Response.Write("可用交换文件大小:" + memoryInfo.dwAvailPageFile + "
");
Response.Write("可用物理内存大小:" + memoryInfo.dwAvailPhys + "
");
Response.Write("可用虚拟内存大小" + memoryInfo.dwAvailVirtual + "
");
Response.Write("操作系统位数:" + memoryInfo.dwLength + "
");
Response.Write("已经使用内存大小:" + memoryInfo.dwMemoryLoad + "
");
Response.Write("交换文件总大小:" + memoryInfo.dwTotalPageFile + "
");
Response.Write("总物理内存大小:" + memoryInfo.dwTotalPhys + "
");
Response.Write("总虚拟内存大小:" + memoryInfo.dwTotalVirtual + "
");
}
}
}
说明:前台aspx页面没有任何控件。


用C#获取CPU编号、硬盘编号等系统有关环境、属性
如果利用C#获取系统有关环境和属性,这个也是在网上问得比较多的问题,不过大部分只有提问没有回答,最近正好想做有关方面的东西,整理了一下,提供给大家,希望能给大家提供参考意见:

首先需要定义几个结构(struct) ,便于DllImport作为返回参数调用。以下是代码:
CpuInfo.cs

using System;
using System.Configuration;
using System.Runtime.InteropServices;

/**//**
* LayoutKind.Automatic:为了提高效率允许运行态对类型成员重新排序
* 注意:永远不要使用这个选项来调用不受管辖的动态链接库函数。
* LayoutKind.Explicit:对每个域按照FieldOffset属性对类型成员排序
* LayoutKind.Sequential:对出现在受管辖类型定义地方的不受管辖内存中的类型成员进行排序。
*/

/**////


/// 定义CPU的信息结构
///
[StructLayout(LayoutKind.Sequential)]
public struct CpuInfo
...{
/**////
/// OEM ID
///
public uint dwOemId;
/**////
/// 页面大小
///
public uint dwPageSize;
public uint lpMinimumApplicationAddress;
public uint lpMaximumApplicationAddress;
public uint dwActiveProcessorMask;
/**////
/// CPU个数
///
public uint dwNumberOfProcessors;
/**////
/// CPU类型
///
public uint dwProcessorType;
public uint dwAllocationGranularity;
/**////
/// CPU等级
///
public uint dwProcessorLevel;
public uint dwProcessorRevision;
}
MemoryInfo.cs
using System;
using System.Configuration;
using System.Runtime.InteropServices;

/**//**
* LayoutKind.Automatic:为了提高效率允许运行态对类型成员重新排序
* 注意:永远不要使用这个选项来调用不受管辖的动态链接库函数。
* LayoutKind.Explicit:对每个域按照FieldOffset属性对类型成员排序
* LayoutKind.Sequential:对出现在受管辖类型定义地方的不受管辖内存中的类型成员进行排序。
*/
/**////


/// 定义内存的信息结构
///
[StructLayout(LayoutKind.Sequential)]
public struct MemoryInfo
...{
/**////
///
///
public uint dwLength;
/**////
/// 已经使用的内存
///
public uint dwMemoryLoad;
/**////
/// 总物理内存大小
///
public uint dwTotalPhys;
/**////
/// 可用物理内存大小
///
public uint dwAvailPhys;
/**////
/// 交换文件总大小
///
public uint dwTotalPageFile;
/**////
/// 可用交换文件大小
///
public uint dwAvailPageFile;
/**////
/// 总虚拟内存大小
///
public uint dwTotalVirtual;
/**////
/// 可用虚拟内存大小
///
public uint dwAvailVirtual;
}
SystemTimeInfo.cs
using System;
using System.Configuration;
using System.Runtime.InteropServices;

/**//**
* LayoutKind.Automatic:为了提高效率允许运行态对类型成员重新排序
* 注意:永远不要使用这个选项来调用不受管辖的动态链接库函数。
* LayoutKind.Explicit:对每个域按照FieldOffset属性对类型成员排序
* LayoutKind.Sequential:对出现在受管辖类型定义地方的不受管辖内存中的类型成员进行排序。
*/
/**////


/// 定义系统时间的信息结构
///
[StructLayout(LayoutKind.Sequential)]
public struct SystemTimeInfo
...{
/**////
/// 年
///
public ushort wYear;
/**////
/// 月
///
public ushort wMonth;
/**////
/// 星期
///
public ushort wDayOfWeek;
/**////
/// 天
///
public ushort wDay;
/**////
/// 小时
///
public ushort wHour;
/**////
/// 分钟
///
public ushort wMinute;
/**////
/// 秒
///
public ushort wSecond;
/**////
/// 毫秒
///
public ushort wMilliseconds;
}
另外还定义了一个调用类SystemInfo.cs,代码如下:
using System;
using System.Configuration;
using System.Runtime.InteropServices;
using System.Management;
using System.Text;

/**////


/// SystemInfo 的摘要说明
///
public class SystemInfo
...{
private const int CHAR_COUNT = 128;
public SystemInfo()
...{

}
[DllImport("kernel32")]
private static extern void GetWindowsDirectory(StringBuilder WinDir, int count);

[DllImport("kernel32")]
private static extern void GetSystemDirectory(StringBuilder SysDir, int count);

[DllImport("kernel32")]
private static extern void GetSystemInfo(ref CpuInfo cpuInfo);

[DllImport("kernel32")]
private static extern void GlobalMemoryStatus(ref MemoryInfo memInfo);

[DllImport("kernel32")]
private static extern void GetSystemTime(ref SystemTimeInfo sysInfo);

/**////


/// 查询CPU编号
///
///
public string GetCpuId()
...{
ManagementClass mClass = new ManagementClass("Win32_Processor");
ManagementObjectCollection moc = mClass.GetInstances();
string cpuId=null;
foreach (ManagementObject mo in moc)
...{
cpuId = mo.Properties["ProcessorId"].Value.ToString();
break;
}
return cpuId;
}

/**////


/// 查询硬盘编号
///
///
public string GetMainHardDiskId()
...{
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia");
String hardDiskID=null;
foreach (ManagementObject mo in searcher.Get())
...{
hardDiskID = mo["SerialNumber"].ToString().Trim();
break;
}
return hardDiskID;
}

/**////


/// 获取Windows目录
///
///
public string GetWinDirectory()
...{
StringBuilder sBuilder = new StringBuilder(CHAR_COUNT);
GetWindowsDirectory(sBuilder, CHAR_COUNT);
return sBuilder.ToString();
}

/**////


/// 获取系统目录
///
///
public string GetSysDirectory()
...{
StringBuilder sBuilder = new StringBuilder(CHAR_COUNT);
GetSystemDirectory(sBuilder, CHAR_COUNT);
return sBuilder.ToString();
}

/**////


/// 获取CPU信息
///
///
public CpuInfo GetCpuInfo()
...{
CpuInfo cpuInfo = new CpuInfo();
GetSystemInfo(ref cpuInfo);
return cpuInfo;
}

/**////


/// 获取系统内存信息
///
///
public MemoryInfo GetMemoryInfo()
...{
MemoryInfo memoryInfo = new MemoryInfo();
GlobalMemoryStatus(ref memoryInfo);
return memoryInfo;
}

/**////


/// 获取系统时间信息
///
///
public SystemTimeInfo GetSystemTimeInfo()
...{
SystemTimeInfo systemTimeInfo = new SystemTimeInfo();
GetSystemTime(ref systemTimeInfo);
return systemTimeInfo;
}

/**////


/// 获取系统名称
///
///
public string GetOperationSystemInName()
...{
OperatingSystem os = System.Environment.OSVersion;
string osName = "UNKNOWN";
switch (os.Platform)
...{
case PlatformID.Win32Windows:
switch (os.Version.Minor)
...{
case 0: osName = "Windows 95"; break;
case 10: osName = "Windows 98"; break;
case 90: osName = "Windows ME"; break;
}
break;
case PlatformID.Win32NT:
switch (os.Version.Major)
...{
case 3: osName = "Windws NT 3.51"; break;
case 4: osName = "Windows NT 4"; break;
case 5: if (os.Version.Minor == 0)
...{
osName = "Windows 2000";
}
else if (os.Version.Minor == 1)
...{
osName = "Windows XP";
}
else if (os.Version.Minor == 2)
...{
osName = "Windows Server 2003";
}
break;
case 6: osName = "Longhorn"; break;
}
break;
}
return String.Format("{0},{1}", osName, os.Version.ToString());
}
}
以下是调用实例,为了简单,我在一个aspx页面中输出,不过这个程序可以在WinForm中调用:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Collections.Specialized;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Runtime.InteropServices;

public partial class Index : System.Web.UI.Page
...{
protected void Page_Load(object sender, EventArgs e)
...{
if (!Page.IsPostBack)
...{
SystemInfo systemInfo = new SystemInfo();
Response.Write("操作系统:" + systemInfo.GetOperationSystemInName() + "
");
Response.Write("CPU编号:"+systemInfo.GetCpuId() + "
");
Response.Write("硬盘编号:"+systemInfo.GetMainHardDiskId() + "
");
Response.Write("Windows目录所在位置:" + systemInfo.GetSysDirectory() + "
");
Response.Write("系统目录所在位置:" + systemInfo.GetWinDirectory() + "
");
MemoryInfo memoryInfo = systemInfo.GetMemoryInfo();
CpuInfo cpuInfo = systemInfo.GetCpuInfo();
Response.Write("dwActiveProcessorMask" + cpuInfo.dwActiveProcessorMask + "
");
Response.Write("dwAllocationGranularity" + cpuInfo.dwAllocationGranularity + "
");
Response.Write("CPU个数:" + cpuInfo.dwNumberOfProcessors + "
");
Response.Write("OEM ID:" + cpuInfo.dwOemId + "
");
Response.Write("页面大小" + cpuInfo.dwPageSize + "
");
Response.Write("CPU等级" + cpuInfo.dwProcessorLevel + "
");
Response.Write("dwProcessorRevision" + cpuInfo.dwProcessorRevision + "
");
Response.Write("CPU类型" + cpuInfo.dwProcessorType + "
");
Response.Write("lpMaximumApplicationAddress" + cpuInfo.lpMaximumApplicationAddress + "
");
Response.Write("lpMinimumApplicationAddress" + cpuInfo.lpMinimumApplicationAddress + "
");
Response.Write("CPU类型:" + cpuInfo.dwProcessorType + "
");
Response.Write("可用交换文件大小:" + memoryInfo.dwAvailPageFile + "
");
Response.Write("可用物理内存大小:" + memoryInfo.dwAvailPhys + "
");
Response.Write("可用虚拟内存大小" + memoryInfo.dwAvailVirtual + "
");
Response.Write("操作系统位数:" + memoryInfo.dwLength + "
");
Response.Write("已经使用内存大小:" + memoryInfo.dwMemoryLoad + "
");
Response.Write("交换文件总大小:" + memoryInfo.dwTotalPageFile + "
");
Response.Write("总物理内存大小:" + memoryInfo.dwTotalPhys + "
");
Response.Write("总虚拟内存大小:" + memoryInfo.dwTotalVirtual + "
");
}
}
}
说明:前台aspx页面没有任何控件。

分享到:
评论

相关推荐

    C#开发经验技巧宝典

    0721 如何获取CPU编号 446 0722 如何获取显示设备的PNPDeviceID 447 0723 如何获取声音设备的PNPDeviceID 447 0724 如何获取硬盘编号 447 0725 如何获取CPU的版本信息 448 0726 如何获取CPU的产品名称...

    C#编程经验技巧宝典

    C#编程经验技巧宝典源代码,目录如下: 第1章 开发环境 1 <br>1.1 Visual Studio开发环境安装与配置 2 <br>0001 安装Visual Studio 2005开发环境须知 2 <br>0002 配置合适的Visual Studio 2005...

    C#.net_经典编程例子400个

    273 实例190 获取窗口文本 273 实例191 判断文件是否正在被使用 274 实例192 在程序中调用.HLP文件 275 实例193 C#中实现文件拖放 276 实例194 文件比较 276 第7章 操作系统与Windows...

    C#程序开发范例宝典(第2版).part08

    实例253 CPU使用率 348 7.7 系统软件信息 350 实例254 获取计算机中已安装的字体 350 实例255 获取计算机的显示设备信息 351 实例256 获取系统启动后经过的时间 351 实例257 系统已经安装的打印机信息 352 ...

    C#程序开发范例宝典(第2版).part02

    实例253 CPU使用率 348 7.7 系统软件信息 350 实例254 获取计算机中已安装的字体 350 实例255 获取计算机的显示设备信息 351 实例256 获取系统启动后经过的时间 351 实例257 系统已经安装的打印机信息 352 ...

    C#程序开发范例宝典(第2版).part12

    实例253 CPU使用率 348 7.7 系统软件信息 350 实例254 获取计算机中已安装的字体 350 实例255 获取计算机的显示设备信息 351 实例256 获取系统启动后经过的时间 351 实例257 系统已经安装的打印机信息 352 ...

    C#程序开发范例宝典(第2版).part13

    实例253 CPU使用率 348 7.7 系统软件信息 350 实例254 获取计算机中已安装的字体 350 实例255 获取计算机的显示设备信息 351 实例256 获取系统启动后经过的时间 351 实例257 系统已经安装的打印机信息 352 ...

Global site tag (gtag.js) - Google Analytics