飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 2653|回复: 0

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

[复制链接]
  • TA的每日心情
    开心
    2019-9-19 16:05
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    发表于 2007-2-8 11:23:36 | 显示全部楼层 |阅读模式
    下面的函数以'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;
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表