WEB开发网
开发学院软件开发Delphi 获得远程或本地机器的网卡的MAC 阅读

获得远程或本地机器的网卡的MAC

 2006-02-04 13:46:01 来源:WEB开发网   
核心提示:下面的函数以'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' 返

下面的函数以'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;

Tags:获得 远程 本地

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接