周公的专栏
光荣在于平淡,艰巨在于漫长。
登录
注册
全站
当前博客
空间
博客
好友
相册
留言
用C#获取CPU编号、硬盘编号等系统有关环境、属性
收藏
如果利用C#获取系统有关环境和属性,这个也是在网上问得比较多的问题,不过大部分只有提问没有回答,最近正好想做有关方面的东西,整理了一下,提供给大家,希望能给大家提供参考意见:
首先需要定义几个结构(struct) ,便于DllImport作为返回参数调用。以下是代码:
CpuInfo.cs
using
System;
using
System.Configuration;
using
System.Runtime.InteropServices;
/**/
/*
*
* LayoutKind.Automatic:为了提高效率允许运行态对类型成员重新排序
* 注意:永远不要使用这个选项来调用不受管辖的动态链接库函数。
* LayoutKind.Explicit:对每个域按照FieldOffset属性对类型成员排序
* LayoutKind.Sequential:对出现在受管辖类型定义地方的不受管辖内存中的类型成员进行排序。
*/
/**/
///
<summary>
///
定义CPU的信息结构
///
</summary>
[StructLayout(LayoutKind.Sequential)]
public
struct
CpuInfo
...
{
/**/
///
<summary>
///
OEM ID
///
</summary>
public
uint
dwOemId;
/**/
///
<summary>
///
页面大小
///
</summary>
public
uint
dwPageSize;
public
uint
lpMinimumApplicationAddress;
public
uint
lpMaximumApplicationAddress;
public
uint
dwActiveProcessorMask;
/**/
///
<summary>
///
CPU个数
///
</summary>
public
uint
dwNumberOfProcessors;
/**/
///
<summary>
///
CPU类型
///
</summary>
public
uint
dwProcessorType;
public
uint
dwAllocationGranularity;
/**/
///
<summary>
///
CPU等级
///
</summary>
public
uint
dwProcessorLevel;
public
uint
dwProcessorRevision;
}
MemoryInfo.cs
using
System;
using
System.Configuration;
using
System.Runtime.InteropServices;
/**/
/*
*
* LayoutKind.Automatic:为了提高效率允许运行态对类型成员重新排序
* 注意:永远不要使用这个选项来调用不受管辖的动态链接库函数。
* LayoutKind.Explicit:对每个域按照FieldOffset属性对类型成员排序
* LayoutKind.Sequential:对出现在受管辖类型定义地方的不受管辖内存中的类型成员进行排序。
*/
/**/
///
<summary>
///
定义内存的信息结构
///
</summary>
[StructLayout(LayoutKind.Sequential)]
public
struct
MemoryInfo
...
{
/**/
///
<summary>
///
///
</summary>
public
uint
dwLength;
/**/
///
<summary>
///
已经使用的内存
///
</summary>
public
uint
dwMemoryLoad;
/**/
///
<summary>
///
总物理内存大小
///
</summary>
public
uint
dwTotalPhys;
/**/
///
<summary>
///
可用物理内存大小
///
</summary>
public
uint
dwAvailPhys;
/**/
///
<summary>
///
交换文件总大小
///
</summary>
public
uint
dwTotalPageFile;
/**/
///
<summary>
///
可用交换文件大小
///
</summary>
public
uint
dwAvailPageFile;
/**/
///
<summary>
///
总虚拟内存大小
///
</summary>
public
uint
dwTotalVirtual;
/**/
///
<summary>
///
可用虚拟内存大小
///
</summary>
public
uint
dwAvailVirtual;
}
SystemTimeInfo.cs
using
System;
using
System.Configuration;
using
System.Runtime.InteropServices;
/**/
/*
*
* LayoutKind.Automatic:为了提高效率允许运行态对类型成员重新排序
* 注意:永远不要使用这个选项来调用不受管辖的动态链接库函数。
* LayoutKind.Explicit:对每个域按照FieldOffset属性对类型成员排序
* LayoutKind.Sequential:对出现在受管辖类型定义地方的不受管辖内存中的类型成员进行排序。
*/
/**/
///
<summary>
///
定义系统时间的信息结构
///
</summary>
[StructLayout(LayoutKind.Sequential)]
public
struct
SystemTimeInfo
...
{
/**/
///
<summary>
///
年
///
</summary>
public
ushort
wYear;
/**/
///
<summary>
///
月
///
</summary>
public
ushort
wMonth;
/**/
///
<summary>
///
星期
///
</summary>
public
ushort
wDayOfWeek;
/**/
///
<summary>
///
天
///
</summary>
public
ushort
wDay;
/**/
///
<summary>
///
小时
///
</summary>
public
ushort
wHour;
/**/
///
<summary>
///
分钟
///
</summary>
public
ushort
wMinute;
/**/
///
<summary>
///
秒
///
</summary>
public
ushort
wSecond;
/**/
///
<summary>
///
毫秒
///
</summary>
public
ushort
wMilliseconds;
}
另外还定义了一个调用类SystemInfo.cs,代码如下:
using
System;
using
System.Configuration;
using
System.Runtime.InteropServices;
using
System.Management;
using
System.Text;
/**/
///
<summary>
///
SystemInfo 的摘要说明
///
</summary>
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);
/**/
///
<summary>
///
查询CPU编号
///
</summary>
///
<returns></returns>
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;
}
/**/
///
<summary>
///
查询硬盘编号
///
</summary>
///
<returns></returns>
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;
}
/**/
///
<summary>
///
获取Windows目录
///
</summary>
///
<returns></returns>
public
string
GetWinDirectory()
...
{
StringBuilder sBuilder
=
new
StringBuilder(CHAR_COUNT);
GetWindowsDirectory(sBuilder, CHAR_COUNT);
return
sBuilder.ToString();
}
/**/
///
<summary>
///
获取系统目录
///
</summary>
///
<returns></returns>
public
string
GetSysDirectory()
...
{
StringBuilder sBuilder
=
new
StringBuilder(CHAR_COUNT);
GetSystemDirectory(sBuilder, CHAR_COUNT);
return
sBuilder.ToString();
}
/**/
///
<summary>
///
获取CPU信息
///
</summary>
///
<returns></returns>
public
CpuInfo GetCpuInfo()
...
{
CpuInfo cpuInfo
=
new
CpuInfo();
GetSystemInfo(
ref
cpuInfo);
return
cpuInfo;
}
/**/
///
<summary>
///
获取系统内存信息
///
</summary>
///
<returns></returns>
public
MemoryInfo GetMemoryInfo()
...
{
MemoryInfo memoryInfo
=
new
MemoryInfo();
GlobalMemoryStatus(
ref
memoryInfo);
return
memoryInfo;
}
/**/
///
<summary>
///
获取系统时间信息
///
</summary>
///
<returns></returns>
public
SystemTimeInfo GetSystemTimeInfo()
...
{
SystemTimeInfo systemTimeInfo
=
new
SystemTimeInfo();
GetSystemTime(
ref
systemTimeInfo);
return
systemTimeInfo;
}
/**/
///
<summary>
///
获取系统名称
///
</summary>
///
<returns></returns>
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()
+
"
<br>
"
);
Response.Write(
"
CPU编号:
"
+
systemInfo.GetCpuId()
+
"
<br>
"
);
Response.Write(
"
硬盘编号:
"
+
systemInfo.GetMainHardDiskId()
+
"
<br>
"
);
Response.Write(
"
Windows目录所在位置:
"
+
systemInfo.GetSysDirectory()
+
"
<br>
"
);
Response.Write(
"
系统目录所在位置:
"
+
systemInfo.GetWinDirectory()
+
"
<br>
"
);
MemoryInfo memoryInfo
=
systemInfo.GetMemoryInfo();
CpuInfo cpuInfo
=
systemInfo.GetCpuInfo();
Response.Write(
"
dwActiveProcessorMask
"
+
cpuInfo.dwActiveProcessorMask
+
"
<br>
"
);
Response.Write(
"
dwAllocationGranularity
"
+
cpuInfo.dwAllocationGranularity
+
"
<br>
"
);
Response.Write(
"
CPU个数:
"
+
cpuInfo.dwNumberOfProcessors
+
"
<br>
"
);
Response.Write(
"
OEM ID:
"
+
cpuInfo.dwOemId
+
"
<br>
"
);
Response.Write(
"
页面大小
"
+
cpuInfo.dwPageSize
+
"
<br>
"
);
Response.Write(
"
CPU等级
"
+
cpuInfo.dwProcessorLevel
+
"
<br>
"
);
Response.Write(
"
dwProcessorRevision
"
+
cpuInfo.dwProcessorRevision
+
"
<br>
"
);
Response.Write(
"
CPU类型
"
+
cpuInfo.dwProcessorType
+
"
<br>
"
);
Response.Write(
"
lpMaximumApplicationAddress
"
+
cpuInfo.lpMaximumApplicationAddress
+
"
<br>
"
);
Response.Write(
"
lpMinimumApplicationAddress
"
+
cpuInfo.lpMinimumApplicationAddress
+
"
<br>
"
);
Response.Write(
"
CPU类型:
"
+
cpuInfo.dwProcessorType
+
"
<br>
"
);
Response.Write(
"
可用交换文件大小:
"
+
memoryInfo.dwAvailPageFile
+
"
<br>
"
);
Response.Write(
"
可用物理内存大小:
"
+
memoryInfo.dwAvailPhys
+
"
<br>
"
);
Response.Write(
"
可用虚拟内存大小
"
+
memoryInfo.dwAvailVirtual
+
"
<br>
"
);
Response.Write(
"
操作系统位数:
"
+
memoryInfo.dwLength
+
"
<br>
"
);
Response.Write(
"
已经使用内存大小:
"
+
memoryInfo.dwMemoryLoad
+
"
<br>
"
);
Response.Write(
"
交换文件总大小:
"
+
memoryInfo.dwTotalPageFile
+
"
<br>
"
);
Response.Write(
"
总物理内存大小:
"
+
memoryInfo.dwTotalPhys
+
"
<br>
"
);
Response.Write(
"
总虚拟内存大小:
"
+
memoryInfo.dwTotalVirtual
+
"
<br>
"
);
}
}
}
说明:前台aspx页面没有任何控件。
发表于 @
2007年03月20日 14:36:00
|
评论(
loading...
)
新一篇: 开发与管理:如何从开发人员走向架构师
|
旧一篇: 用asp.net获取服务器和客服端有关信息
用户操作
[即时聊天]
[发私信]
[加为好友]
周金桥
订阅我的博客
周金桥的公告
英文名:zhoufoxcn
昵称:周公
职业:程序开发
成为MVP时间:2008.07
爱好:编程,旅游,写作
如无特别说明,本博客文章为zhoufoxcn(周公)原创,任何外部引用或摘抄请注明出处,并保持内容和格式不变,未经作者同意不得用于任何盈利目的,谢谢合作!
文章分类
asp.net
ASP.NET夜话
C#基础
GDI+
HTML/CSSJS
Java
jsp开发
WinForm技术
程序人生
模式/分析/管理
数据库技术
网络技术
幽默笑话
收藏
.net
mengyao||Andy 路鑫
(RSS)
The Code Project
剑了
(RSS)
山西.net俱乐部
张子阳
(RSS)
Java
张森炜的博客
(RSS)
娱乐资源
天下网
天下网生活论坛
(RSS)
存档
2009年06月(2)
2009年05月(4)
2009年04月(2)
2009年03月(3)
2009年02月(3)
2008年12月(3)
2008年11月(2)
2008年10月(5)
2008年09月(7)
2008年08月(5)
2008年07月(3)
2008年06月(3)
2008年05月(6)
2008年04月(2)
2008年03月(8)
2008年01月(10)
2007年12月(2)
2007年11月(23)
2007年10月(8)
2007年09月(13)
2007年08月(7)
2007年07月(7)
2007年06月(8)
2007年05月(9)
2007年04月(8)
2007年03月(13)
2007年02月(6)
2007年01月(15)
2006年12月(4)
2006年11月(18)
2006年10月(21)
2006年09月(13)
2006年08月(3)