当前位置:K88软件开发文章中心编程语言.NET.NET02 → 文章内容

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

减小字体 增大字体 作者:佚名  来源:翔宇亭IT乐园  发布时间:2019-1-3 0:48:10

:2010-05-27 06:15:00

本文在ASP.NET程序中实现了获取CPU编号、硬盘编号等与系统有关环境属性,这个方法也可以移植到其他程序当中。

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>
    //

[1] [2]  下一页


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