获得远程或本地机器的网卡的MAC
2008-04-10 02:57:43来源:互联网 阅读 ()
下面的函数以''''XX-XX-XX-XX-XX-XX'''' 的格式返回远程或本地机器的MAC地址。
Function to return the MAC address of a remote or local machine in the format ''''XX-XX-XX-XX-XX-XX''''
返回的MAC地址是一个能用在多个方面的唯一标识。使用方法:
ShowMessage(GetMacAddress(''''\\MHEYDON'''');
输出''''00-02-08-E7-99-6B''''
// ======================================================================
//返回值是主机AServerName的MAC地址
//AServerName参数的格式为''''\\ServerName'''' 或者 ''''ServerName''''
//参数ServerName为空时返回本机的MAC地址
//MAC地址以''''XX-XX-XX-XX-XX-XX''''的格式返回
// ======================================================================
function GetMacAddress(const AServerName : string) : string;
type
TNetTransportEnum = function(pszServer : PWideChar;
Level : DWORD;
var pbBuffer : pointer;
PrefMaxLen : LongInt;
var EntriesRead : DWORD;
var TotalEntries : DWORD;
var ResumeHandle : DWORD) : DWORD; stdcall;
TNetApiBufferFree = function(Buffer : pointer) : DWORD; stdcall;
PTransportInfo = ^TTransportInfo;
TTransportInfo = record
quality_of_service : DWORD;
number_of_vcs : DWORD;
transport_name : PWChar;
transport_address : PWChar;
wan_ish : boolean;
end;
var E,ResumeHandle,
EntriesRead,
TotalEntries : DWORD;
FLibHandle : THandle;
sMachineName,
sMacAddr,
Retvar : string;
pBuffer : pointer;
pInfo : PTransportInfo;
FNetTransportEnum : TNetTransportEnum;
FNetApiBufferFree : TNetApiBufferFree;
pszServer : array[0..128] of WideChar;
i,ii,iIdx : integer;
begin
sMachineName := trim(AServerName);
Retvar := ''''00-00-00-00-00-00'''';
// Add leading \\ if missing
if (sMachineName <> '''''''') and (length(sMachineName) >= 2) then begin
if copy(sMachineName,1,2) <> ''''\\'''' then
sMachineName := ''''\\'''' sMachineName
end;
// Setup and load from DLL
pBuffer := nil;
ResumeHandle := 0;
FLibHandle := LoadLibrary(''''NETAPI32.DLL'''');
// Execute the external function
if FLibHandle <> 0 then begin
@FNetTransportEnum := GetProcAddress(FLibHandle,''''NetWkstaTransportEnum'''');
@FNetApiBufferFree := GetProcAddress(FLibHandle,''''NetApiBufferFree'''');
E := FNetTransportEnum(StringToWideChar(sMachineName,pszServer,129),0,
pBuffer,-1,EntriesRead,TotalEntries,Resumehandle);
if E = 0 then begin
pInfo := pBuffer;
// Enumerate all protocols - look for TCPIP
for i := 1 to EntriesRead do begin
if pos(''''TCPIP'''',UpperCase(pInfo^.transport_name)) <> 0 then begin
// Got It - now format result ''''xx-xx-xx-xx-xx-xx''''
iIdx := 1;
sMacAddr := pInfo^.transport_address;
for ii := 1 to 12 do begin
Retvar[iIdx] := sMacAddr[ii];
inc(iIdx);
if iIdx in [3,6,9,12,15] then inc(iIdx);
end;
end;
inc(pInfo);
end;
if pBuffer <> nil then FNetApiBufferFree(pBuffer);
end;
try
FreeLibrary(FLibHandle);
except
// 错误处理
end;
end;
result:=Retvar;
end;
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash