取MAC地址 (含多网卡),最好的方法,支持Vista,Win7

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
WinSock, StdCtrls;

Const
MAX_HOSTNAME_LEN = 128; { from IPTYPES.H }
MAX_DOMAIN_NAME_LEN = 128;
MAX_SCOPE_ID_LEN = 256;
MAX_ADAPTER_NAME_LENGTH = 256;
MAX_ADAPTER_DESCRIPTION_LENGTH = 128;
MAX_ADAPTER_ADDRESS_LENGTH = 8;

Type
TIPAddressString = Array[0..4*4-1] of Char;

PIPAddrString = ^TIPAddrString;
TIPAddrString = Record
Next : PIPAddrString;
IPAddress : TIPAddressString;
IPMask : TIPAddressString;
Context : Integer;
End;

PFixedInfo = ^TFixedInfo;
TFixedInfo = Record { FIXED_INFO }
HostName : Array[0..MAX_HOSTNAME_LEN+3] of Char;
DomainName : Array[0..MAX_DOMAIN_NAME_LEN+3] of Char;
CurrentDNSServer : PIPAddrString;
DNSServerList : TIPAddrString;
NodeType : Integer;
ScopeId : Array[0..MAX_SCOPE_ID_LEN+3] of Char;
EnableRouting : Integer;
EnableProxy : Integer;
EnableDNS : Integer;
End;

PIPAdapterInfo = ^TIPAdapterInfo;
TIPAdapterInfo = Record { IP_ADAPTER_INFO }
Next : PIPAdapterInfo;
ComboIndex : Integer;
AdapterName : Array[0..MAX_ADAPTER_NAME_LENGTH+3] of Char;
Description : Array[0..MAX_ADAPTER_DESCRIPTION_LENGTH+3] of Char;
AddressLength : Integer;
Address : Array[1..MAX_ADAPTER_ADDRESS_LENGTH] of Byte;
Index : Integer;
_Type : Integer;
DHCPEnabled : Integer;
CurrentIPAddress : PIPAddrString;
IPAddressList : TIPAddrString;
GatewayList : TIPAddrString;
DHCPServer : TIPAddrString;
HaveWINS : Bool;
PrimaryWINSServer : TIPAddrString;
SecondaryWINSServer : TIPAddrString;
LeaseObtained : Integer;
LeaseExpires : Integer;
End;

type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure GetAdapterInformation;
public
{ Public declarations }
end;

var
Form1: TForm1;

Function sendarp(ipaddr:ulong;
temp:dword;
ulmacaddr:pointer;
ulmacaddrleng:pointer) : DWord; StdCall;

implementation

{$R *.dfm}

Function sendarp; External ‘Iphlpapi.dll‘ Name ‘SendARP‘;
Function GetAdaptersInfo(AI : PIPAdapterInfo; Var BufLen : Integer) : Integer;
StdCall; External ‘iphlpapi.dll‘ Name ‘GetAdaptersInfo‘;

procedure TForm1.GetAdapterInformation;
Var
AI,Work : PIPAdapterInfo;
Size : Integer;
Res : Integer;
I : Integer;

Function MACToStr(ByteArr : PByte; Len : Integer) : String;
Begin
Result := ‘‘;
While (Len > 0) do Begin
Result := Result+IntToHex(ByteArr^,2)+‘-‘;
ByteArr := Pointer(Integer(ByteArr)+SizeOf(Byte));
Dec(Len);
End;
SetLength(Result,Length(Result)-1); { remove last dash }
End;

Function GetAddrString(Addr : PIPAddrString) : String;
Begin
Result := ‘‘;
While (Addr <> nil) do Begin
Result := Result+‘A: ‘+Addr^.IPAddress+‘ M: ‘+Addr^.IPMask+#13;
Addr := Addr^.Next;
End;
End;

Function TimeTToDateTimeStr(TimeT : Integer) : String;
Const UnixDateDelta = 25569; { days between 12/31/1899 and 1/1/1970 }
Var
DT : TDateTime;
TZ : TTimeZoneInformation;
Res : DWord;

Begin
If (TimeT = 0) Then Result := ‘‘
Else Begin
{ Unix TIME_T is secs since 1/1/1970 }
DT := UnixDateDelta+(TimeT / (24*60*60)); { in UTC }
{ calculate bias }
Res := GetTimeZoneInformation(TZ);
If (Res = TIME_ZONE_ID_INVALID) Then RaiseLastWin32Error;
If (Res = TIME_ZONE_ID_STANDARD) Then Begin
DT := DT-((TZ.Bias+TZ.StandardBias) / (24*60));
Result := DateTimeToStr(DT)+‘ ‘+WideCharToString(TZ.StandardName);
End
Else Begin { daylight saving time }
DT := DT-((TZ.Bias+TZ.DaylightBias) / (24*60));
Result := DateTimeToStr(DT)+‘ ‘+WideCharToString(TZ.DaylightName);
End;
End;
End;

begin
Memo1.Lines.Clear;
Size := 5120;
GetMem(AI,Size);
Res := GetAdaptersInfo(AI,Size);
If (Res <> ERROR_SUCCESS) Then Begin
SetLastError(Res);
RaiseLastWin32Error;
End;
With Memo1,Lines do Begin
Work := AI;
I := 1;
Repeat
Add(‘‘);
Add(‘Adapter ‘ + IntToStr(I));
Add(‘ ComboIndex: ‘+IntToStr(Work^.ComboIndex));
Add(‘ Adapter name: ‘+Work^.AdapterName);
Add(‘ Description: ‘+Work^.Description);
Add(‘ Adapter address: ‘+MACToStr(@Work^.Address,Work^.AddressLength));
Add(‘ Index: ‘+IntToStr(Work^.Index));
Add(‘ Type: ‘+IntToStr(Work^._Type));
Add(‘ DHCP: ‘+IntToStr(Work^.DHCPEnabled));
Add(‘ Current IP: ‘+GetAddrString(Work^.CurrentIPAddress));
Add(‘ IP addresses: ‘+GetAddrString(@Work^.IPAddressList));
Add(‘ Gateways: ‘+GetAddrString(@Work^.GatewayList));
Add(‘ DHCP servers: ‘+GetAddrString(@Work^.DHCPServer));
Add(‘ Has WINS: ‘+IntToStr(Integer(Work^.HaveWINS)));
Add(‘ Primary WINS: ‘+GetAddrString(@Work^.PrimaryWINSServer));
Add(‘ Secondary WINS: ‘+GetAddrString(@Work^.SecondaryWINSServer));
Add(‘ Lease obtained: ‘+TimeTToDateTimeStr(Work^.LeaseObtained));
Add(‘ Lease expires: ‘+TimeTToDateTimeStr(Work^.LeaseExpires));
Inc(I);
Work := Work^.Next;
Until (Work = nil);
End;
FreeMem(AI);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
GetAdapterInformation;
end;

end.

时间: 2024-11-19 15:13:07

取MAC地址 (含多网卡),最好的方法,支持Vista,Win7的相关文章

取Mac地址

uses Nb30; //一般用默认的 0 就可以了 function GetMacAddress(const Index:Integer =0):string; var ncb : TNCB; {NetBios控制块} AdapterS : TAdapterStatus; {网卡状态结构} LanaNum : TLanaeNum; {Netbios Lana} i : Integer; rc : Char; {NetBios的返回代码} str : String; begin Result :

解决virtualbox复制ubuntu后改变mac地址不能识别网卡问题

在vbox里面安装了一个ubuntu server 12.04,利用自带的复制功能,完成 3台虚拟服务器的搭建.为了更好的模拟局域网环境,为了保证mac不一样, 所以刷新mac地址,登陆时ifconfig发现eth0不翼而飞,自然也不能连通网络.  www.2cto.com 最后发现是/etc/udev/rules.d/70-persistent-net.rules文件保存了原始虚 拟机网卡的mac地址,这时候利用vbox刷新mac地址,自然匹配不了,ubuntu就 识别不出网卡. 解决 办法是

ios7之后暂时代替MAC地址的作为唯一标识的方法!

转自:http://supershll.blog.163.com/blog/static/37070436201399111929848/ 1.KeyChain方法:http://www.cnblogs.com/smileEvday/p/UDID.html  项目地质:https://github.com/smileEvday/SvUDID 使用项目中的SvUDIDTools即可.现摘录以下: 苹果提供了一个方法允许同一个发商的多个APP访问各APP之间的途径,即在调SecItemAdd添加数据

分享取实际网卡MAC地址的一种方法

近期由于监管要求,需要在做业务的时候将机器的mac地址也要上报,之前的代码其实已经实现了取mac地址的功能,但是存在一个问题,如果有多块网卡的时候或者装了虚拟机的情况下就尴尬了,之前的代码默认是取第一块网卡的MAC地址,这样就不符合要求.由于技术功底不扎实,不知道如何判断到底实际网卡是哪一块,后来想到了一种歪门邪道的方法,在这里做个笔记和分享. 主要问题:不知道客户端跟服务器之间到底是走的哪块网卡 解决办法:那就想办法确定这块网卡 主要是在对客户端连接服务器成功后进行处理: 第一步:客户端连接成

网络编程懒人入门(九):通俗讲解,有了IP地址,为何还要用MAC地址?

1.前言 标题虽然是为了解释有了 IP 地址,为什么还要用 MAC 地址,但是本文的重点在于理解为什么要有 IP 这样的东西.本文对读者的定位是知道 MAC 地址是什么,IP 地址是什么. (本文同步发布于:http://www.52im.net/thread-2067-1-1.html) 2.关于作者 翟志军,个人博客地址:https://showme.codes/,Github:https://github.com/zacker330.感谢作者的原创分享. 作者的另一篇<即时通讯安全篇(七)

修改电脑MAC地址

当然一般不建议修改电脑的MAC地址,但不代表不能去修改 MAC地址是网卡的物理地址,固话在网卡芯片里的,应具有唯一性 但生活中常常会去修改MAC地址来欺骗接入设备等,当然随便乱改可能引起网络问题 注:实验前保存原先MAC一份 一.可以通过ipconfig /all来查看电脑的MAC地址 二.打开网卡所在的路径~好多方法都能到达 三.找见本地连接->右键->属性->配置 四.记得网卡是16进制0~9,A~F,如果超过16进制的话,就会变成0,像G2,还有记的去掉'-' 五.最后来查看结果吧

无线路由器的“克隆MAC地址”是干什么作用的?

本文章转载:http://blog.sina.com.cn/s/blog_4c900d100102uysb.html 1.问题: 无线路由器的“克隆MAC地址”是干什么作用的?怎样使用? 2.使用背景: 个别地区的宽带运营商(联通公司.电信公司等)默认的是:一个宽带帐号只允许你一台电脑上网,并暗中把你电脑的MAC地址(实际上是把你电脑网卡的MAC地址)记录保存到他们的服务器中,并与宽带帐号捆绑在了一起. 3.发生原因: 如果你发生了下列情况:更换了电脑的网卡,或者是更换了电脑(实质也是更换了网卡

Internet为什么需要IP地址和MAC地址?

1 基本概念 IP地址是Internet协议地址,每个Internet包必须带有IP地址,每个Internet服务提供商(ISP)必须向有关组织申请一组IP地址,然后一般是动态分配给其用户. MAC地址是Ethernet网卡上带的地址,长度为48位.每个Ethernet网卡生产厂家必须向IEEE组织申请一组MAC地址,在生产网卡时在网卡的串行EEPROM中写入一个唯一的MAC地址. 2 为什么需要IP地址和MAC地址? 第一种情形:宽带用户通过ADSL拨号上网 用户/主机(如Host A)最初是

67&gt;&gt;Mac地址

Mac地址是每张网卡的唯一标识符,也叫物理地址.硬件地址或链路地址,由网络设备制造商生产时烧在网卡的ROM中,可以修改.现在的Mac地址一般都采用6字节48bit(还有2字节16bit的Mac地址,多在局域网中使用),前3字节由各个企业向IEEE的RA机构购买,后3个字节由企业自己决定. IEEE规定地址字段的第一字节的最低位为I/G比特,I/G表示Individual/Group.当I/G比特为0时,地址字段表示一个单播地址.当I/G比特为1的时候表示组地址,用来表示多播.因此,IEEE只分配