C#获取硬盘编号、CPU编号及类型、内存大小及使用情况

本文介绍了一种使用C#获取计算机系统信息的方法,包括CPU、内存等硬件信息及操作系统信息。通过定义特定结构体并使用PInvoke技术调用内核API实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 如果利用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页面没有任何控件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值