欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-02-02 15:01:33
本文实例讲述了c#获取机器码的方法。分享给大家供大家参考,具体如下: using system.runtime.interopservices; using s...

本文实例讲述了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 "";
    }
  }//end
public 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#程序设计有所帮助。