各位,请问如何获取网卡的MAC地址。最好给段代码。

解决方案 »

  1.   

    一个检测本机网卡号(物理地址)的程序源码    
      unit Main; 
    interfaceusesSysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,Nb, ExtCtrls;typeTForm1 = class(TForm)Panel1: TPanel;Memo1: TMemo;Panel2: TPanel;Button1: TButton;procedure Button1Click(Sender: TObject);procedure FormCreate(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;implementation{$R *.DFM} {---------------------------------------------}{ enumerate the lana's - works only on WIN32 }{---------------------------------------------}function NbLanaEnum: TLana_Enum;varNCB: TNCB;L_Enum: TLana_Enum;RetCode: Word;begin{$IFDEF WIN32}FillChar(NCB, SizeOf(NCB), 0);FillChar(L_Enum, SizeOf(TLana_Enum), 0);NCB.Command := NCB_ENUM;NCB.Buf := @L_Enum;NCB.Length := Sizeof(L_Enum);RetCode := NetBiosCmd(NCB);if RetCode <> NRC_GOODRET then beginL_Enum.Length := 0;L_Enum.Lana[0] := Byte(RetCode);end;{$ELSE} { not supported for WIN16, fake LANA 0 }L_Enum.Length := 1;L_Enum.Lana[0] := 0;{$ENDIF}Result := L_Enum;end;{----------------------------------------}{ Reset the lana - don't for WIN16 ! }{----------------------------------------}function NbReset(l: Byte): Word;varNCB: TNCB;begin{$IFNDEF WIN32} { will reset all your connections for WIN1 6 }Result := NRC_GOODRET; { so just fake a reset for Win16 }{$ELSE}FillChar(NCB, SizeOf(NCB), 0);NCB.Command := NCB_RESET;NCB.Lana_Num := l;Result := NetBiosCmd(NCB);{$ENDIF}end;{----------------------------------------}{ return the MAC address of an interface }{ in the form of a string like : }{ 'xx:xx:xx:xx:xx:xx' }{ using the definitions in nb.pas }{----------------------------------------}function NbGetMacAddr(LanaNum: Integer): String;varNCB: TNCB;AdpStat: TAdpStat;RetCode: Word;beginFillChar(NCB, SizeOf(NCB), 0);FillChar(AdpStat, SizeOf(AdpStat), 0);NCB.Command := NCB_ADPSTAT;NCB.Buf := @AdpStat;NCB.Length := Sizeof(AdpStat);FillChar(NCB.CallName, Sizeof(TNBName), $20);NCB.CallName[0] := Byte('*');NCB.Lana_Num := LanaNum;RetCode := NetBiosCmd(NCB);if RetCode = NRC_GOODRET then beginResult := Format('%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x',[AdpStat.ID[0],AdpStat.ID[1],AdpStat.ID[2],AdpStat.ID[3],AdpStat.ID[4],AdpStat.ID[5]]);end else beginResult := '??:??:??:??:??:??';end;end; procedure TForm1.Button1Click(Sender: TObject);beginClose;end;procedure TForm1.FormCreate(Sender: TObject);varL_Enum : TLana_Enum;RetCode: Word;i: Integer;beginL_Enum := NbLanaEnum; { enumerate lanas for WI N NT }if L_Enum.Length = 0 then beginButton1.Caption := Format('LanaEnum err=%2.2x', [L_Enum.Lana[0]]); exit;end;for i := 0 to (L_Enum.Length - 1)do begin { for every lana found }RetCode := NbReset(L_Enum.Lana[i]); { Reset lana for WIN NT }if RetCode <> NRC_GOODRET then beginButton1.Caption := Format('Reset Lana %d err=%2.2x',[i, RetCode ]);exit;end;{ Get MAC Address }Memo1.Lines.Add(Format('Lana %x = %s', [L_Enum.Lana[i], NbGetMacAd dr(i)]));end;Button1.Caption := 'Stop';end;end.—————————————————————————————————— -
     
     
      

  2.   

    我有代码,用c写dll用delphi调
    留个信箱发给你
      

  3.   

    unit Nb;{$F+}{ nb.pas16/32 bit windows netbios access (follows IBM's Netbios 3.0 spec) (C) CEVI VZW - 29 april 1998 -- DH ([email protected]) --You can (ab)use this code as you like, but please do not remove the credits.I used reference material from IBM, Microsoft, Syntax and Byte when I wrotethe 16-bit (DOS) c-version ages ago (in Borland Turbo C 2.0 on a 38 6SX PC)with a Syntax SMB server running on Interactive Unix.I now converted this to 16 and 32 bit Delphi code.}interface uses SysUtils, Winprocs, Wintypes;const { size of a netbios name }NBNAMESIZE = 16;{ max number of network adapters }{ remeber it's BIG Blue, right ? }MAXLANAS = 254;{ NCB Command codes }NCB_ASYNC = $80; { asynch command bit to be or-ed into command }NCB_CALL = $10; { open a session }NCB_LISTEN = $11; { wait for a call }NCB_HANGUP = $12; { end session }NCB_SEND = $14; { send data }NCB_RECV = $15; { receive data }NCB_RECVANY = $16; { receive data on any session }NCB_CHAINSEND = $17; { chain send data }NCB_DGSEND = $20; { send a datagram }NCB_DGRECV = $21; { receive datagram }NCB_DGSENDBC = $22; { send broadcast datagram }NCB_DGREVCBC = $23; { receive broadcast datagram }NCB_ADDNAME = $30; { add unique name to local table }NCB_DELNAME = $31; { delete name from local table }NCB_RESET = $32; { reset adapter }NCB_ADPSTAT = $33; { adapter status }NCB_SSTAT = $34; { session status }NCB_CANCEL = $35; { cancel NCB request }NCB_ADDGRPNAME= $36; { add group name to local table }NCB_ENUM = $37; { enum adapters }NCB_UNLINK = $70; { unlink remote boot code }NCB_SENDNA = $71; { send, don't wait for ACK }NCB_CHAINSENDNA=$72; { chain send, but don't wait for ACK }NCB_LANSTALERT= $73; { lan status alert }NCB_ACTION = $77; { enable extensions }NCB_FINDNAME = $78; { search for name on the network }NCB_TRACE = $79; { activate / stop tracing }{ NCB return codes }NRC_GOODRET = $00; { good returnalso returned when ASYNCH request accept ed }NRC_BUFLEN = $01; { illegal buffer length }NRC_ILLCMD = $03; { illegal command }NRC_CMDTMO = $05; { command timed out }NRC_INCOMP = $06; { message incomplete, issue another comman d }NRC_BADDR = $07; { illegal buffer address }NRC_SNUMOUT = $08; { session number out of range }NRC_NORES = $09; { no resource available }NRC_SCLOSED = $0a; { session closed }NRC_CMDCAN = $0b; { command cancelled }NRC_DUPNAME = $0d; { duplicate name }NRC_NAMTFUL = $0e; { name table full }NRC_ACTSES = $0f; { no deletions, name has active sessions }NRC_LOCTFUL = $11; { local session table full }NRC_REMTFUL = $12; { remote session table full }NRC_ILLNN = $13; { illegal name number }NRC_NOCALL = $14; { no callname }NRC_NOWILD = $15; { cannot put * in NCB_NAME }NRC_INUSE = $16; { name in use on remote adapter }NRC_NAMERR = $17; { name deleted }NRC_SABORT = $18; { session ended abnormally }NRC_NAMCONF = $19; { name conflict detected }NRC_IFBUSY = $21; { interface busy, IRET before retrying }NRC_TOOMANY = $22; { too many commands outstanding, retry lat er }NRC_BRIDGE = $23; { ncb_lana_num field invalid }NRC_CANOCCR = $24; { command completed while cancel occurring }NRC_CANCEL = $26; { command not valid to cancel }NRC_DUPENV = $30; { name defined by anther local process }NRC_ENVNOTDEF = $34; { environment undefined. RESET required }NRC_OSRESNOTAV = $35; { required OS resources exhausted }NRC_MAXAPPS = $36; { max number of applications exceeded }NRC_NOSAPS = $37; { no saps available for netbios }NRC_NORESOURCES = $38; { requested resources are not available }NRC_INVADDRESS = $39; { invalid ncb address or length > segment }NRC_INVDDID = $3B; { invalid NCB DDID }NRC_LOCKFAIL = $3C; { lock of user area failed }NRC_OPENERR = $3f; { NETBIOS not loaded }NRC_SYSTEM = $40; { system error }NRC_PENDING = $ff; { asynchronous command is not yet finished }{ Values for transport_id }ALL_TRANSPORTS = 'M'#$00#$00#$00;MS_NBF = 'MNBF'; { values for name_flags bits. }NAME_FLAGS_MASK = $87;GROUP_NAME = $80;UNIQUE_NAME = $00;REGISTERING = $00;REGISTERED = $04;DEREGISTERED = $05;DUPLICATE = $06;DUPLICATE_DEREG = $07; { Values for state }LISTEN_OUTSTANDING = $01;CALL_PENDING = $02;SESSION_ESTABLISHED = $03;HANGUP_PENDING = $04;HANGUP_COMPLETE = $05;SESSION_ABORTED = $06; type { Netbios Name }TNBName = array[0..(NBNAMESIZE - 1)] of byte;{ MAC address }TMacAddress = array[0..5] of byte;PNCB = ^TNCB;{ Netbios Control Block }{$IFDEF WIN32}TNCBPostProc = procedure(P: PNCB);{$ENDIF}TNCB = packed record { Netbios Control Block }Command: byte; { command code }RetCode: byte; { return code }LSN: byte; { local session number }Num: byte; { name number }Buf: ^byte; { data buffer }Length: word; { data length }CallName: TNBName; { name to call }Name: TNBName; { our own name }RTO: byte; { receive time-out }STO: byte; { send time-out }{$IFNDEF WIN32}Post_Offs:word; { asynch notification routine offset }Post_Seg: word; { asynch notification routine segment}{$ELSE}PostPrc: TNCBPostProc;{ asynch notification routine (nb30) }{$ENDIF}Lana_Num: byte; { adapter number }Cmd_Cplt: byte; { command completion flag }{$IFDEF WIN32}Reserved: array[0..9] of byte; { Reserverd for Bios use }Event: THandle; { WIN32 event handle to be signalled }{ for asynch cmd completion }{$ELSE}Reserved: array[0..13] of byte; { Reserved }{$ENDIF}end; 
      

  4.   

    { Netbios Name Info record }PNameInfo = ^TNameInfo;TNameInfo = packed record { name info record }Name: TNBName; { netbios name }NameNum:byte; { name number }NameSt: byte; { name status }end;{ Netbios adapter status }PAdpStat = ^TAdpStat;TAdpStat = packed record { adapter status record}ID: TMacAddress; { adapter mac address }VMajor: byte; { software version major number }Resvd0: byte;AdpType: byte; { adapter type }VMinor: byte; { software version minor number }RptTime: word; { reporting time period }RcvCRC: word; { receive crc errors }RcvOth: word; { receive other errors }TxmCol: word; { transmit collisions }TxmOth: word; { transmit other errors }TxmOK: LongInt; { successfull transmissions }RcvOK: LongInt; { successfull receives }TxmRetr: word; { transmit retries }NoRcvBuf: word; { number of 'no receive buffer' }T1_tmo: word; { t1 time-outs }Ti_tmo: word; { ti time_outs }Resvd1: LongInt;Free_Ncbs:word; { number of free ncb's }Cfg_Ncbs: word; { number of configured ncb's }max_Ncbs: word; { max ncb's used }NoTxmBuf: word; { number of 'no transmit buffer'}MaxDGSize:word; { max. datagram size }Pend_Ses: word; { number of pending sessions }Cfg_Ses: word; { number of configured sessions }Max_Ses: word; { max sessions used }Max_SPSz: word; { max. session packet size }nNames: word; { number of names in local table}Names: array[0..15] of TnameInfo; { local name table }end;{Structure returned to the NCB command NCBSSTAT is SESSION_HEADER fo llowedby an array of SESSION_BUFFER structures. If the NCB_NAME starts wi th anasterisk then an array of these structures is returned containing t hestatus for all names.}{ session header }PSession_Header = ^TSession_Header;TSession_Header = packed recordsess_name: byte;num_sess: byte;rcv_dg_outstanding: byte;rcv_any_outstanding: byte;end;{ session buffer }PSession_Buffer = ^TSession_Buffer;TSession_Buffer = packed recordlsn: byte;state: byte;local_name: TNBName;remote_name: TNBName;rcvs_outstanding: byte;sends_outstanding: byte;end;{Structure returned to the NCB command NCBENUM.On a system containing lana's 0, 2 and 3, a structure withlength =3, lana[0]=0, lana[1]=2 and lana[2]=3 will be returned.}PLana_Enum = ^TLana_Enum;TLANA_ENUM = packed recordlength: byte; { Number of valid entries in lana[] }lana: array[0..(MAXLANAS - 1)] of byte;end;{Structure returned to the NCB command NCBFINDNAME is FIND_NAME_HEAD ER followedby an array of FIND_NAME_BUFFER structures.}PFind_Name_Header = ^TFind_Name_Header;TFind_Name_Header = packed recordnode_count: word;reserved: byte;unique_group: byte;end;PFind_Name_Buffer = ^TFind_Name_Buffer;TFind_Name_Buffer = packed recordlength: byte;access_control: byte;frame_control: byte;destination_addr:TMacAddress;source_addr: TMacAddress;routing_info: array[0..17] of byte;end;{Structure provided with NCBACTION. The purpose of NCBACTION is to p rovidetransport specific extensions to netbios.}PAction_Header = ^TAction_Header;TAction_Header = packed recordtransport_id: LongInt;action_code: Word;reserved: Word;end;  {$IFDEF WIN32}function Netbios(P: PNCB): Char; stdcall;{$ENDIF}{ Exposed functions } function NetbiosCmd(var NCB: TNCB): Word; implementation{$IFDEF WIN32}function Netbios; external 'netapi32.dll' name 'Netbios';{$ENDIF}{---------------------------------}{ execute a Windows Netbios Call }{---------------------------------}function NetbiosCmd(var NCB: TNCB): Word;begin{$IFNDEF WIN32}asmpush bp { save bp }push ss { save ss }push ds { save ds }les bx, NCB { get segment/offset address of NCB }call NetBiosCall; { 16 bit Windows Netbios call }xor ah,ahmov @Result, ax { store return code }pop ds { restore ds }pop ss { restore ss }pop bp { restore bp }end;{$ELSE}Result := Word(Netbios(PNCB(@NCB))); { 32 bit Windows Netbios call } {$ENDIF}end;end.================================Function NBGetAdapterAddress(a:Integer) : String;VarNCB : TNCB; // Netbios control block //NetBios控制块ADAPTER : TADAPTERSTATUS; // Netbios adapter status//取网卡状态LANAENUM : TLANAENUM; // Netbios lanaintIdx : Integer; // Temporary work value//临时变量cRC : Char; // Netbios return code//NetBios返回值strTemp : String; // Temporary string//临时变量Begin// InitializeResult := '';Try// Zero control bloclZeroMemory(@NCB, SizeOf(NCB));// Issue enum commandNCB.ncb_command := Chr(NCBENUM);cRC := NetBios(@NCB);// Reissue enum commandNCB.ncb_buffer := @LANAENUM;NCB.ncb_length := SizeOf(LANAENUM);cRC := NetBios(@NCB);If Ord(cRC)<>0 Thenexit;// Reset adapterZeroMemory(@NCB, SizeOf(NCB));NCB.ncb_command := Chr(NCBRESET);NCB.ncb_lana_num := LANAENUM.lana[a];cRC := NetBios(@NCB);If Ord(cRC)<>0 Thenexit;// Get adapter addressZeroMemory(@NCB, SizeOf(NCB));NCB.ncb_command := Chr(NCBASTAT);NCB.ncb_lana_num := LANAENUM.lana[a];StrPCopy(NCB.ncb_callname, '*');NCB.ncb_buffer := @ADAPTER;NCB.ncb_length := SizeOf(ADAPTER);cRC := NetBios(@NCB);// Convert it to stringstrTemp := '';For intIdx := 0 To 5 DostrTemp := strTemp + InttoHex(Integer(ADAPTER.adapter_address[intIdx]),2);Result := strTemp;FinallyEnd;End;
      

  5.   

    感谢 coreblood
    ,发完后请通知一声。再次谢过!
      

  6.   

    如何取的網卡的MAC號
    簡介:
    function TForm1.NBGetAdapterAddress(a: integer): String;
    //a指定多個網卡適配器中的哪一個0,1,2...
    Var
    NCB:TNCB; // Netbios control block file://NetBios控制塊
    ADAPTER : TADAPTERSTATUS; // Netbios adapter status//取網卡狀態
    LANAENUM : TLANAENUM; // Netbios lana
    intIdx : Integer; // Temporary work value//臨時變數
    cRC : Char; // Netbios return code//NetBios返回值
    strTemp : String; // Temporary string//臨時變數Begin
    // Initialize
    Result := '';
    Try
    // Zero control blocl
    ZeroMemory(@NCB, SizeOf(NCB));
    // Issue enum command
    NCB.ncb_command:=Chr(NCBENUM);
    cRC := NetBios(@NCB);
    // Reissue enum command
    NCB.ncb_buffer := @LANAENUM;
    NCB.ncb_length := SizeOf(LANAENUM);
    cRC := NetBios(@NCB);
    If Ord(cRC)0 Then
    exit;
    // Reset adapter
    ZeroMemory(@NCB, SizeOf(NCB));
    NCB.ncb_command := Chr(NCBRESET);
    NCB.ncb_lana_num := LANAENUM.lana[a];
    cRC := NetBios(@NCB);
    If Ord(cRC)0 Then
    exit;
    // Get adapter address
    ZeroMemory(@NCB, SizeOf(NCB));
    NCB.ncb_command := Chr(NCBASTAT);
    NCB.ncb_lana_num := LANAENUM.lana[a];
    StrPCopy(NCB.ncb_callname, '*');
    NCB.ncb_buffer := @ADAPTER;
    NCB.ncb_length := SizeOf(ADAPTER);
    cRC := NetBios(@NCB);
    // Convert it to string
    strTemp := '';
    For intIdx := 0 To 5 Do
    strTemp := strTemp + InttoHex(Integer(ADAPTER.adapter_address[intIdx]),2);
    Result := strTemp;
    Finally
    End;最後別忘了uses nb30.pas
    經測試,98,2000下皆可用
    發表人 - ddy 於 2002/11/23 23:57:24
      

  7.   

    转载,希望对你有帮助
    在iphlpapi.dll里面有一个函数:GetAdaptersInfo() 
    好像是干这个用的。说明如下:GetAdaptersInfoThe GetAdaptersInfo function retrieves adapter information for the local computer.DWORD GetAdaptersInfo(PIP_ADAPTER_INFO pAdapterInfo, // buffer to receive dataPULONG pOutBufLen // size of data returned);ParameterspAdapterInfo[out] Pointer to a buffer that, , receives a linked list of IP_ADAPTER_INFO structures.pOutBufLen[in] Pointer to a ULONG variable that specifies the size of the buffer pointed to by the pAdapterInfo parameter. If this size is insufficient to hold the adapter information, GetAdaptersInfo fills in this variable with the required size, and returns an error code of ERROR_BUFFER_OVERFLOW.Return ValuesIf the function succeeds, the return value is ERROR_SUCCESS.If the function fails, the return value is one of the following error codes.Value MeaningERROR_BUFFER_OVERFLOW The buffer size indicated by the pOutBufLen parameter is too small to hold the adapter information. The pOutBufLen parameter points to the required size.ERROR_INVALID_PARAMETER The pOutBufLen parameter is NULL, or the calling process does not have read/write access to the memory pointed to by pOutBufLen, or the calling process does not have write access to the memory pointed to by the pAdapterInfo parameter.ERROR_NO_DATA No adapter information exists for the local computer.ERROR_NOT_SUPPORTED GetAdaptersInfo is not supported by the operating system running on the local computer.Other If the function fails, use FormatMessage to obtain the message string for the returned error. RequirementsWindows NT/2000: Requires Windows 2000.Windows 95/98: Requires Windows 98.Header: Declared in Iphlpapi.h.//没有Library: Use Iphlpapi.lib.//没有  IP_ADAPTER_INFOThe IP_ADAPTER_INFO structure contains information about a particular network adapter on the local computer.typedef struct _IP_ADAPTER_INFO {struct _IP_ADAPTER_INFO* Next;DWORD ComboIndex;char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4];char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];UINT AddressLength;BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH];DWORD Index;UINT Type;UINT DhcpEnabled;PIP_ADDR_STRING CurrentIpAddress;IP_ADDR_STRING IpAddressList;IP_ADDR_STRING GatewayList;IP_ADDR_STRING DhcpServer;BOOL HaveWins;IP_ADDR_STRING PrimaryWinsServer;IP_ADDR_STRING SecondaryWinsServer;time_t LeaseObtained;time_t LeaseExpires;} IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;MembersNextPointer to the next adapter in the linked list of adapters.ComboIndexThis member is unused.AdapterName[MAX_ADAPTER_NAME_LENGTH + 4]Specifies the name of the adapter.Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4]Specifies a description for the adapter.AddressLengthSpecifies the length of the hardware address for the adapter.Address[MAX_ADAPTER_ADDRESS_LENGTH]Specifies the hardware address for the adapter. //这个是不是你想要的?IndexSpecifies the adapter index.TypeSpecifies the adapter type.DhcpEnabledSpecifies whether dynamic host configuration protocol (DHCP) is enabled for this adapter.CurrentIpAddressSpecifies the current IP address for this adapter.IpAddressListSpecifies the list of IP addresses associated with this adapter.GatewayListSpecifies the IP address of the default gateway for this adapter.DhcpServerSpecifies the IP address of the DHCP server for this adapter.HaveWinsSpecifies whether this adapter uses Windows Internet Name Service (WINS).PrimaryWinsServerSpecifies the IP address of the primary WINS server.SecondaryWinsServerSpecifies the IP address of the secondary WINS server.LeaseObtainedSpecifies the time when the current DHCP lease was obtained.LeaseExpiresSpecifies the time when the current DHCP lease will expire.RequirementsWindows NT/2000: Requires Windows 2000.Windows 95/98: Requires Windows 98.Header: Declared in Iptypes.h.
      

  8.   

    WINEXEC(PCHAR('CMD /C  IPCONFIG /ALL > C:\TEMP.TXT'),SW_HIDE);