[转]用C#获取CPU编号、硬盘编号等系统有关环境、属性
发布日期:2021-08-18 20:58:54 浏览次数:2 分类:技术文章

本文共 8843 字,大约阅读时间需要 29 分钟。

如果利用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 5if (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页面没有任何控件。
本文转自:

转载于:https://www.cnblogs.com/geraint999/archive/2012/09/09/2677286.html

转载地址:https://blog.csdn.net/weixin_30906185/article/details/94961776 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:精妙SQL语句大全
下一篇:通过c#操作word文档的其他方式

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月07日 21时33分04秒