|
下面的函数以''''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;
没有相关教程
|