zoukankan
html css js c++ java
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>
"
);
}
}
}
查看全文
相关阅读:
Monad Maybe
Linq怎么支持Monad
创建我们第一个Monad
Monad的重点
解析器组合子
NFA
全排列算法
R语言将数据框转成xts
R语言的字符串处理
wpf mvvm MenuItem的Command事件
原文地址:https://www.cnblogs.com/tonybinlj/p/1328820.html
最新文章
如何配置ThinkPHP中静态缓存的存放路径
thinkphp __PUBLIC__
YII 常用路径总结
JS电子文档链接
ThinkPHP函数详解:U方法
ThinkPHP函数详解:I方法
测试
Spring AOP 浅析
SpringMVC 入门
Python3.5入门学习记录-File
热门文章
C#中的表达式树的浅解
阐述Lambada表达式
Python3.5入门学习记录-模块
Python3.5入门学习记录-函数
C#线程池ThreadPool的理解
C#中Thread.Join()的理解
Android拼图-变形金刚
Monad 系列
将我们的parser转换成Monad
介绍一个简单的Parser
Copyright © 2011-2022 走看看