获得远程或本地机器的网卡的MAC
2008-04-30 12:13
495 查看
下面的函数以'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;
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;
相关文章推荐
- vb获得本地和远程的MAC地址 (网卡地址)
- 远程客户端网卡MAC获得
- 不用重新配置,用jconsole连接远程机器进程及获得本地进程的JMX Url的终极办法
- Coding theano under remote ubuntu server from local Mac (在本地mac机器上,写、跑、调试、看-远程ubuntu上的theano代码)
- vb获得本地和远程的MAC地址 (网卡地址)
- 获取机器网卡的物理(MAC)地址
- 使用ASP获得服务器网卡的MAC地址信息
- C#编程之 如何获取本地和远程主机的IP及MAC地址
- 共享了磁盘,但在远程桌面的机器上看不到自己共享的本地硬盘
- 本地和远程机器之间传输数据使用winscp
- 如何实现远程登录机器与本地机器之间的拷贝windows平台
- Linux下java获得本地网卡IP地址
- Mac电脑本地文件转移到远程Linux服务器
- 在本地和远程机器上切换到过去的一个commit
- ASP获得网卡的MAC地址
- 扫描网卡,获取机器mac地址
- 【C++】获得本机所有网卡的IP和MAC地址信息
- 本地roslaunch远程机器的launch文件
- 远程机器的MAC查询
- 局域网内两机器网卡mac地址一样会如何