送你一个函数
uses NB30; function GetMACAdress: string; 
var 
  NCB: PNCB; 
  Adapter: PAdapterStatus;   URetCode: PChar; 
  RetCode: char; 
  I: integer; 
  Lenum: PlanaEnum; 
  _SystemID: string; 
  TMPSTR: string; 
begin 
  Result    := ''; 
  _SystemID := ''; 
  Getmem(NCB, SizeOf(TNCB)); 
  Fillchar(NCB^, SizeOf(TNCB), 0);   Getmem(Lenum, SizeOf(TLanaEnum)); 
  Fillchar(Lenum^, SizeOf(TLanaEnum), 0);   Getmem(Adapter, SizeOf(TAdapterStatus)); 
  Fillchar(Adapter^, SizeOf(TAdapterStatus), 0);   Lenum.Length    := chr(0); 
  NCB.ncb_command := chr(NCBENUM); 
  NCB.ncb_buffer  := Pointer(Lenum); 
  NCB.ncb_length  := SizeOf(Lenum); 
  RetCode         := Netbios(NCB);   i := 0; 
  repeat 
    Fillchar(NCB^, SizeOf(TNCB), 0); 
    Ncb.ncb_command  := chr(NCBRESET); 
    Ncb.ncb_lana_num := lenum.lana[I]; 
    RetCode          := Netbios(Ncb);     Fillchar(NCB^, SizeOf(TNCB), 0); 
    Ncb.ncb_command  := chr(NCBASTAT); 
    Ncb.ncb_lana_num := lenum.lana[I]; 
    // Must be 16 
    Ncb.ncb_callname := '*               ';     Ncb.ncb_buffer := Pointer(Adapter);     Ncb.ncb_length := SizeOf(TAdapterStatus); 
    RetCode        := Netbios(Ncb); 
    //---- calc _systemId from mac-address[2-5] XOR mac-address[1]... 
    if (RetCode = chr(0)) or (RetCode = chr(6)) then 
    begin 
      _SystemId := IntToHex(Ord(Adapter.adapter_address[0]), 2) + '-' + 
        IntToHex(Ord(Adapter.adapter_address[1]), 2) + '-' + 
        IntToHex(Ord(Adapter.adapter_address[2]), 2) + '-' + 
        IntToHex(Ord(Adapter.adapter_address[3]), 2) + '-' + 
        IntToHex(Ord(Adapter.adapter_address[4]), 2) + '-' + 
        IntToHex(Ord(Adapter.adapter_address[5]), 2); 
    end; 
    Inc(i); 
  until (I >= Ord(Lenum.Length)) or (_SystemID <> '00-00-00-00-00-00'); 
  FreeMem(NCB); 
  FreeMem(Adapter); 
  FreeMem(Lenum); 
  GetMacAdress := _SystemID; 
end; //使用例子procedure TForm1.Button1Click(Sender: TObject); 
begin 
  label1.Caption := GetMACAdress; 
end; 

解决方案 »

  1.   

    stiwin(【ΨμΩσΣΦΩΧ】『海蜃』) 
    老兄已经说的很明白了,仔细看看吧.
    我又来晚了
      

  2.   

    *****GetNetMacs.pas
    unit GetNetMacs;interfaceuses Windows,Classes,SysUtils;type
      PnetResourceArr = ^TNetResource;
      procedure GetServerList(List:TStrings);
      procedure GetUserList(fServer:string;List:TStrings);
    implementation
    procedure GetServerList(List:TStrings);
    type
      {$H+}
      PMyRec = ^MyRec;
      MyRec = Record
                dwScope : Integer;
                dwType : Integer;
                dwDisplayType : Integer;
                dwUsage : Integer;
                LocalName : String;
                RemoteName : String;
                Comment : String;
                Provider : String;
            end;
    {H-}
    var NetResource : TNetResource;
        TempRec : PMyRec;
        Buf : Pointer;
        Count,BufSize,Res : DWORD;
        lphEnum : THandle;
        p : PNetResourceArr;
        i,j : SmallInt;
        NetworkTypeList : TList;
    begin
      NetworkTypeList := TList.Create;
      List.BeginUpdate;
      List.Clear;
      GetMem(Buf, 8192);
      try
        Res:=WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, RESOURCEUSAGE_CONTAINER, nil,lphEnum);
        if Res <> 0 then Raise Exception(Res);
        Count := $FFFFFFFF;
        BufSize := 8192;
        Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
        if Res = ERROR_NO_MORE_ITEMS then Exit;
        if (Res <> 0) then Raise Exception(Res);
        P := PNetResourceArr(Buf);
        for I := 0 to Count-1 do
          begin
            New(TempRec);
            TempRec^.dwScope := P^.dwScope;
            TempRec^.dwType := P^.dwType ;
            TempRec^.dwDisplayType := P^.dwDisplayType ;
            TempRec^.dwUsage := P^.dwUsage ;
            TempRec^.LocalName := StrPas(P^.lpLocalName);
            TempRec^.RemoteName := StrPas(P^.lpRemoteName);
            TempRec^.Comment := StrPas(P^.lpComment);
            TempRec^.Provider := StrPas(P^.lpProvider);
            NetworkTypeList.Add(TempRec);
            Inc(P);
          end;
        Res := WNetCloseEnum(lphEnum);
        if Res <> 0 then Raise Exception(Res);
        for J := 0 to NetworkTypeList.Count-1 do
          begin
            TempRec := NetworkTypeList.Items[J];
            NetResource := TNetResource(TempRec^);
            Res:=WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum);
            if Res <> 0 then Raise Exception(Res);
            while True do
              begin
                Count := $FFFFFFFF;
                BufSize := 8192;
                Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
                if Res = ERROR_NO_MORE_ITEMS then Break;
                if (Res <> 0) then Raise Exception(Res);
                P := PNetResourceArr(Buf);
                for I := 0 to Count - 1 do
                  begin
                    List.Add(P^.lpRemoteName);
                    Inc(P);
                  end;
              end;
          end;
        Res := WNetCloseEnum(lphEnum);
        if Res <> 0 then Raise Exception(Res);
      finally
        FreeMem(Buf);
        NetworkTypeList.Destroy;
      end;
      List.EndUpdate;
    end;procedure GetUserList(fServer:string;List:TStrings);
    var NetResource : TNetResource;
        Buf : Pointer;
        Count,BufSize,Res : DWord;
        Ind : Integer;
        lphEnum : THandle;
        Temp : PNetResourceArr;
    begin
      List.Clear;
      GetMem(Buf, 8192);
      try
        FillChar(NetResource, SizeOf(NetResource), 0);
        NetResource.lpRemoteName := @fServer[1];
        NetResource.dwDisplayType := RESOURCEDISPLAYTYPE_SERVER;
        NetResource.dwUsage := RESOURCEUSAGE_CONTAINER;
        NetResource.dwScope := RESOURCETYPE_DISK;
        Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum);
        if Res <> 0 then Exit;
        while True do
          begin
            Count := $FFFFFFFF;
            BufSize := 8192;
            Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
            if Res = ERROR_NO_MORE_ITEMS then Exit;
            if (Res <> 0) then Exit;
            Temp := PNetResourceArr(Buf);
            for Ind := 0 to Count - 1 do
              begin
                List.Add(Temp^.lpRemoteName + 2);
                 // Add all the network usernames to List StringList
                Inc(Temp);
              end;
          end;
        Res := WNetCloseEnum(lphEnum);
        if Res <> 0 then Raise Exception(Res);
      finally
        FreeMem(Buf);
      end;
    end;end.
    ********
    调用:
    function TSetup_Main.GetMacsFromName(Name:String):String;
    var Command:String;
        tempResult:String;
    begin
      Command:='Command.com /c nbtstat -a '+Name+' >temp.txt';
      WinExec(Pchar(Command),SW_HIDE);
      Sleep(1000);
      Memo1.Lines.LoadFromFile('temp.txt');
      tempResult:=Memo1.Lines[Memo1.Lines.Count-1];
      Memo1.Lines.Clear;
      if tempResult='Host not found.' then Result:='Error!'
      else
        begin
          tempResult:=Copy(tempResult,15,17);
          Result:=ReplaceText(tempResult,'-','');
        end;
    end;
    procedure TSetup_Main.GetAllStuMacs_BtnClick(Sender: TObject);
    var StuNameListN:Integer;
        LocalName:String;
        GetLineNum:Integer;
        GetLineStr:String;
    begin
      StuName_ListBox.Items.Clear;
      StuMacs_ListBox.Items.Clear;
      Application.MessageBox('依网络状况,该项操作可能耗时2-10分钟,请耐心等候!','提示',MB_OK);
      HadChangeMacs:=True;
      LocalName:=GetDomainName(LocalIPPowersock.LocalIP);
      GetUserList(NetGroup_Edit.Text,StuName_ListBox.Items);
      for StuNameListN:=StuName_ListBox.Items.Count-1 downto 0 do
        if StuName_ListBox.Items[StuNameListN]=LocalName then
          StuName_ListBox.Items.Delete(StuNameListN);
      Application.MessageBox('已经正确得到了所有学生机名!'+#13+#13+'下面将继续取得学生机对应的网卡地址……','提示',MB_OK);
      for StuNameListN:=0 to StuName_ListBox.Items.Count-1 do
        StuMacs_ListBox.Items[StuNameListN]:=GetMacsFromName(StuName_ListBox.Items[StuNameListN]);
      Application.MessageBox('操作成功!','提示',MB_OK);
      DeleteFile('temp.txt');
    end;可以得到相同工作组内所有联机的电脑的网卡,win98+D6通过