首页 > 编程 > C# > 正文

C#获取机器码的方法详解(机器名,CPU编号,硬盘编号,网卡mac等)

2020-01-24 01:03:21
字体:
来源:转载
供稿:网友

本文实例讲述了C#获取机器码的方法。分享给大家供大家参考,具体如下:

using System.Runtime.InteropServices;using System.Management;using System;public class HardwareInfo{  //取机器名  public string GetHostName()  {  return System.Net.Dns.GetHostName();  }  //取CPU编号  public String GetCpuID()  {    try    {      ManagementClass mc = new ManagementClass("Win32_Processor");      ManagementObjectCollection moc = mc.GetInstances();      String strCpuID = null ;      foreach( ManagementObject mo in moc )      {        strCpuID = mo.Properties["ProcessorId"].Value.ToString();        break;      }      return strCpuID;    }    catch    {      return "";    }  }//end method//取第一块硬盘编号  public String GetHardDiskID()  {    try    {      ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia");      String strHardDiskID = null ;      foreach(ManagementObject mo in searcher.Get())      {        strHardDiskID = mo["SerialNumber"].ToString().Trim();        break;      }      return strHardDiskID ;    }    catch    {      return "";    }  }//endpublic enum NCBCONST{  NCBNAMSZ =16, /* absolute length of a net name */  MAX_LANA =254, /* lana's in range 0 to MAX_LANA inclusive */  NCBENUM =0x37, /* NCB ENUMERATE LANA NUMBERS */  NRC_GOODRET =0x00, /* good return */  NCBRESET =0x32, /* NCB RESET */  NCBASTAT =0x33, /* NCB ADAPTER STATUS */  NUM_NAMEBUF =30, /* Number of NAME's BUFFER */}  [StructLayout(LayoutKind.Sequential)]  public struct ADAPTER_STATUS  {    [MarshalAs(UnmanagedType.ByValArray, SizeConst=6)]    public byte[] adapter_address;    public byte rev_major;    public byte reserved0;    public byte adapter_type;    public byte rev_minor;    public ushort duration;    public ushort frmr_recv;    public ushort frmr_xmit;    public ushort iframe_recv_err;    public ushort xmit_aborts;    public uint xmit_success;    public uint recv_success;    public ushort iframe_xmit_err;    public ushort recv_buff_unavail;    public ushort t1_timeouts;    public ushort ti_timeouts;    public uint reserved1;    public ushort free_ncbs;    public ushort max_cfg_ncbs;    public ushort max_ncbs;    public ushort xmit_buf_unavail;    public ushort max_dgram_size;    public ushort pending_sess;    public ushort max_cfg_sess;    public ushort max_sess;    public ushort max_sess_pkt_size;    public ushort name_count;  }  [StructLayout(LayoutKind.Sequential)]  public struct NAME_BUFFER  {    [MarshalAs(UnmanagedType.ByValArray, SizeConst=(int)NCBCONST.NCBNAMSZ)]    public byte[] name;    public byte name_num;    public byte name_flags;  }  [StructLayout(LayoutKind.Sequential)]  public struct NCB  {    public byte ncb_command;    public byte ncb_retcode;    public byte ncb_lsn;    public byte ncb_num;    public IntPtr ncb_buffer;    public ushort ncb_length;    [MarshalAs(UnmanagedType.ByValArray, SizeConst=(int)NCBCONST.NCBNAMSZ)]    public byte[] ncb_callname;    [MarshalAs(UnmanagedType.ByValArray, SizeConst=(int)NCBCONST.NCBNAMSZ)]    public byte[] ncb_name;    public byte ncb_rto;    public byte ncb_sto;    public IntPtr ncb_post;    public byte ncb_lana_num;    public byte ncb_cmd_cplt;    [MarshalAs(UnmanagedType.ByValArray, SizeConst=10)]    public byte[] ncb_reserve;    public IntPtr ncb_event;  }  [StructLayout(LayoutKind.Sequential)]  public struct LANA_ENUM  {    public byte length;    [MarshalAs(UnmanagedType.ByValArray, SizeConst=(int)NCBCONST.MAX_LANA)]    public byte[] lana;  }  [StructLayout(LayoutKind.Auto)]  public struct ASTAT  {    public ADAPTER_STATUS adapt;    [MarshalAs(UnmanagedType.ByValArray, SizeConst=(int)NCBCONST.NUM_NAMEBUF)]    public NAME_BUFFER[] NameBuff;  }  public class Win32API  {    [DllImport("NETAPI32.DLL")]    public static extern char Netbios(ref NCB ncb);  }  //取网卡mac  public string GetMacAddress()  {    string addr="";    try    {      int cb;      ASTAT adapter;      NCB Ncb=new NCB();      char uRetCode;      LANA_ENUM lenum;      Ncb.ncb_command = (byte)NCBCONST.NCBENUM;      cb = Marshal.SizeOf(typeof(LANA_ENUM));      Ncb.ncb_buffer = Marshal.AllocHGlobal(cb);      Ncb.ncb_length = (ushort)cb;      uRetCode = Win32API.Netbios(ref Ncb);      lenum = (LANA_ENUM)Marshal.PtrToStructure(Ncb.ncb_buffer, typeof(LANA_ENUM));      Marshal.FreeHGlobal(Ncb.ncb_buffer);      if(uRetCode != (short)NCBCONST.NRC_GOODRET)      return "";      for(int i=0; i < lenum.length ;i++)      {        Ncb.ncb_command = (byte)NCBCONST.NCBRESET;        Ncb.ncb_lana_num = lenum.lana[i];        uRetCode = Win32API.Netbios(ref Ncb);        if(uRetCode != (short)NCBCONST.NRC_GOODRET)        return "";        Ncb.ncb_command = (byte)NCBCONST.NCBASTAT;        Ncb.ncb_lana_num = lenum.lana[i];        Ncb.ncb_callname[0]=(byte)'*';        cb = Marshal.SizeOf(typeof(ADAPTER_STATUS)) + Marshal.SizeOf(typeof(NAME_BUFFER))*(int)NCBCONST.NUM_NAMEBUF;        Ncb.ncb_buffer = Marshal.AllocHGlobal(cb);        Ncb.ncb_length = (ushort)cb;        uRetCode = Win32API.Netbios(ref Ncb);        adapter.adapt = (ADAPTER_STATUS)Marshal.PtrToStructure(Ncb.ncb_buffer, typeof(ADAPTER_STATUS));        Marshal.FreeHGlobal(Ncb.ncb_buffer);        if (uRetCode == (short)NCBCONST.NRC_GOODRET)        {          if(i>0)          addr += ":";          addr = string.Format("{0,2:X}{1,2:X}{2,2:X}{3,2:X}{4,2:X}{5,2:X}",          adapter.adapt.adapter_address[0],          adapter.adapt.adapter_address[1],          adapter.adapt.adapter_address[2],          adapter.adapt.adapter_address[3],          adapter.adapt.adapter_address[4],          adapter.adapt.adapter_address[5]);        }      }    }    catch    {    }    return addr.Replace(' ', '0');  }}

更多关于C#相关内容感兴趣的读者可查看本站专题:《C#窗体操作技巧汇总》、《C#常见控件用法教程》、《WinForm控件用法总结》、《C#程序设计之线程使用技巧总结》、《C#操作Excel技巧总结》、《C#中XML文件操作技巧汇总》、《C#数据结构与算法教程》、《C#数组操作技巧总结》及《C#面向对象程序设计入门教程

希望本文所述对大家C#程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表