送你一个函数
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;
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;
老兄已经说的很明白了,仔细看看吧.
我又来晚了
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通过