procedure TForm1.Button1Click(Sender: TObject); var dwEntriesRead, dwEntriesTotal: DWORD; ui1, ui2 : Pointer; i : Integer; begin if NetUserEnum(nil, 0, FILTER_NORMAL_ACCOUNT, ui1, MAX_PREFERRED_LENGTH, dwEntriesRead, dwEntriesTotal, nil) = NERR_SUCCESS then begin ui2 := ui1; for i := 0 to dwEntriesRead-1 do begin Listbox1.Items.Add(PUserInfo1(ui1)^.usri1_name); Inc(Integer(ui1), SizeOf(Pointer)); end; end; NetAPIBufferFree(ui2); end;
/*列出局域网上所有工作组*/ Function GetGroupList( var List : TStringList ) : Boolean; type TNetResourceArray = ^TNetResource;//网络类型的数组 Var NetResource: TNetResource; Buf: Pointer; Count,BufSize,Res: DWORD; lphEnum: THandle; p: TNetResourceArray; i,j: SmallInt; NetworkTypeList: TList; Begin Result := False; NetworkTypeList := TList.Create; List.Clear; //获取整个网络中的文件资源的句柄,lphEnum为返回名柄 Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK, RESOURCEUSAGE_CONTAINER, Nil,lphEnum); if Res <> NO_ERROR then exit;//Raise Exception(Res);//执行失败 //获取整个网络中的网络类型信息 Count := $FFFFFFFF;//不限资源数目 BufSize := 8192;//缓冲区大小设置为8K GetMem(Buf, BufSize);//申请内存,用于获取工作组信息 Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize); //资源列举完毕 //执行失败 if ( Res = ERROR_NO_MORE_ITEMS ) or (Res <> NO_ERROR ) then Exit; P := TNetResourceArray(Buf); for i := 0 to Count - 1 do//记录各个网络类型的信息 begin NetworkTypeList.Add(p); Inc(P); end; Res := WNetCloseEnum(lphEnum);//关闭一次列举 if Res <> NO_ERROR then exit; for j := 0 to NetworkTypeList.Count-1 do //列出各个网络类型中的所有工作组名称 begin//列出一个网络类型中的所有工作组名称 NetResource := TNetResource(NetworkTypeList.Items[J]^);//网络类型信息 //获取某个网络类型的文件资源的句柄,NetResource为网络类型信息,lphEnum为返回名柄 Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum); if Res <> NO_ERROR then break;//执行失败 while true do//列举一个网络类型的所有工作组的信息 begin Count := $FFFFFFFF;//不限资源数目 BufSize := 8192;//缓冲区大小设置为8K GetMem(Buf, BufSize);//申请内存,用于获取工作组信息 //获取一个网络类型的文件资源信息, Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize); //资源列举完毕 //执行失败 if ( Res = ERROR_NO_MORE_ITEMS ) or (Res <> NO_ERROR) then break; P := TNetResourceArray(Buf); for i := 0 to Count - 1 do//列举各个工作组的信息 begin List.Add( StrPAS( P^.lpRemoteName ));//取得一个工作组的名称 Inc(P); end; end; Res := WNetCloseEnum(lphEnum);//关闭一次列举 if Res <> NO_ERROR then break;//执行失败 end; Result := True; FreeMem(Buf); NetworkTypeList.Destroy; End;{================================================================= 功 能: 列举工作组中所有的计算机 参 数: List: 需要填充的List 返回值: 成功: True,并填充List 失败: False; 备 注: 版 本: 1.0 2002/10/03 08:00:00 =================================================================} Function GetUsers(GroupName: string; var List: TStringList): Boolean; type TNetResourceArray = ^TNetResource;//网络类型的数组 Var i: Integer; Buf: Pointer; Temp: TNetResourceArray; lphEnum: THandle; NetResource: TNetResource; Count,BufSize,Res: DWord; begin Result := False; List.Clear; FillChar(NetResource, SizeOf(NetResource), 0);//初始化网络层次信息 NetResource.lpRemoteName := @GroupName[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 <> NO_ERROR then Exit; //执行失败 while True do//列举指定工作组的网络资源 begin Count := $FFFFFFFF;//不限资源数目 BufSize := 8192;//缓冲区大小设置为8K GetMem(Buf, BufSize);//申请内存,用于获取工作组信息 //获取计算机名称 Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize); if Res = ERROR_NO_MORE_ITEMS then break;//资源列举完毕 if (Res <> NO_ERROR) then Exit;//执行失败 Temp := TNetResourceArray(Buf); for i := 0 to Count - 1 do//列举工作组的计算机名称 begin //获取工作组的计算机名称,+2表示删除"\\",如\\wangfajun=>wangfajun List.Add(Temp^.lpRemoteName + 2); inc(Temp); end; end; Res := WNetCloseEnum(lphEnum);//关闭一次列举 if Res <> NO_ERROR then exit;//执行失败 Result := True; FreeMem(Buf); end;
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,Winsock, StdCtrls, Spin, ExtCtrls;type TForm1 = class(TForm) Button1: TButton; Label1: TLabel; Edit_input: TEdit; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; SpinEdit_start: TSpinEdit; SpinEdit_end: TSpinEdit; Memo1: TMemo; Panel_name: TPanel; procedure Button1Click(Sender: TObject); function GetComputerName(IP:string):string; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}function LocalIP:string;//获取本地IP type tapinaddr=array[0..10] of pinaddr; papinaddr=^tapinaddr; var phe:phostent; pptr:papinaddr; buffer:array[0..63] of char; i:integer; GinitData:TWSADATA; begin WSAStartup($101,GinitData); result:=''; gethostname(buffer,sizeof(buffer)); phe:=gethostbyname(buffer); if phe=nil then exit; pptr:=papinaddr(phe^.h_addr_list); i:=0; while pptr^[i]<>nil do begin result:=strpas(inet_ntoa(pptr^[i]^)); inc(i); end; wsacleanup; end;function TForm1.GetComputerName(IP:string):string;//给定IP求取电脑名称. var HostEnt:PHostEnt; WSAData:TWSADATA; Addr:DWORD; begin WSAStartup($101,WSAData); Addr:=inet_addr(PChar(IP)); HostEnt:=gethostbyaddr(@Addr,sizeof(Addr),PF_INET); if HostEnt<>nil then Result:=HostEnt.h_name else Result:=''; WSACleanup(); end;procedure TForm1.Button1Click(Sender: TObject); var temp,temp_ip,IP_PCname:string; i,p:integer; begin p:=0; temp:=''; temp_ip:=''; button1.Caption:='Searching computer name...'; memo1.Lines.Clear; for i:=spinedit_start.Value to spinedit_end.Value do begin temp_ip:=edit_input.Text+'.'+inttostr(i); IP_PCname:=GetComputerName(temp_ip); panel_name.Update; if IP_PCname<>'' then begin P:=P+1; panel_name.Caption:=IntToStr(p)+' PCS'; temp:=temp_ip+' '+IP_PCname; memo1.Lines.Add(temp); end else begin IP_PCname:='No Open'; end; end; button1.Caption:='Find computer name' end;procedure TForm1.FormCreate(Sender: TObject); begin label3.Caption:=localIP; end;end.
http://www.csdn.net/develop/Read_Article.asp?id=25532
改變這個就是
dwServerType := SV_TYPE_SQLSERVER; //服务器类型
var
dwEntriesRead, dwEntriesTotal: DWORD;
ui1, ui2 : Pointer;
i : Integer;
begin
if NetUserEnum(nil, 0, FILTER_NORMAL_ACCOUNT, ui1, MAX_PREFERRED_LENGTH, dwEntriesRead, dwEntriesTotal, nil) = NERR_SUCCESS then
begin
ui2 := ui1;
for i := 0 to dwEntriesRead-1 do
begin
Listbox1.Items.Add(PUserInfo1(ui1)^.usri1_name);
Inc(Integer(ui1), SizeOf(Pointer));
end;
end;
NetAPIBufferFree(ui2);
end;
Function GetGroupList( var List : TStringList ) : Boolean;
type
TNetResourceArray = ^TNetResource;//网络类型的数组
Var
NetResource: TNetResource;
Buf: Pointer;
Count,BufSize,Res: DWORD;
lphEnum: THandle;
p: TNetResourceArray;
i,j: SmallInt;
NetworkTypeList: TList;
Begin
Result := False;
NetworkTypeList := TList.Create;
List.Clear;
//获取整个网络中的文件资源的句柄,lphEnum为返回名柄
Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER, Nil,lphEnum);
if Res <> NO_ERROR then exit;//Raise Exception(Res);//执行失败
//获取整个网络中的网络类型信息
Count := $FFFFFFFF;//不限资源数目
BufSize := 8192;//缓冲区大小设置为8K
GetMem(Buf, BufSize);//申请内存,用于获取工作组信息
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
//资源列举完毕 //执行失败
if ( Res = ERROR_NO_MORE_ITEMS ) or (Res <> NO_ERROR ) then Exit;
P := TNetResourceArray(Buf);
for i := 0 to Count - 1 do//记录各个网络类型的信息
begin
NetworkTypeList.Add(p);
Inc(P);
end;
Res := WNetCloseEnum(lphEnum);//关闭一次列举
if Res <> NO_ERROR then exit;
for j := 0 to NetworkTypeList.Count-1 do //列出各个网络类型中的所有工作组名称
begin//列出一个网络类型中的所有工作组名称
NetResource := TNetResource(NetworkTypeList.Items[J]^);//网络类型信息
//获取某个网络类型的文件资源的句柄,NetResource为网络类型信息,lphEnum为返回名柄
Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum);
if Res <> NO_ERROR then break;//执行失败
while true do//列举一个网络类型的所有工作组的信息
begin
Count := $FFFFFFFF;//不限资源数目
BufSize := 8192;//缓冲区大小设置为8K
GetMem(Buf, BufSize);//申请内存,用于获取工作组信息
//获取一个网络类型的文件资源信息,
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
//资源列举完毕 //执行失败
if ( Res = ERROR_NO_MORE_ITEMS ) or (Res <> NO_ERROR) then break;
P := TNetResourceArray(Buf);
for i := 0 to Count - 1 do//列举各个工作组的信息
begin
List.Add( StrPAS( P^.lpRemoteName ));//取得一个工作组的名称
Inc(P);
end;
end;
Res := WNetCloseEnum(lphEnum);//关闭一次列举
if Res <> NO_ERROR then break;//执行失败
end;
Result := True;
FreeMem(Buf);
NetworkTypeList.Destroy;
End;{=================================================================
功 能: 列举工作组中所有的计算机
参 数:
List: 需要填充的List
返回值: 成功: True,并填充List 失败: False;
备 注:
版 本:
1.0 2002/10/03 08:00:00
=================================================================}
Function GetUsers(GroupName: string; var List: TStringList): Boolean;
type
TNetResourceArray = ^TNetResource;//网络类型的数组
Var
i: Integer;
Buf: Pointer;
Temp: TNetResourceArray;
lphEnum: THandle;
NetResource: TNetResource;
Count,BufSize,Res: DWord;
begin
Result := False;
List.Clear;
FillChar(NetResource, SizeOf(NetResource), 0);//初始化网络层次信息
NetResource.lpRemoteName := @GroupName[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 <> NO_ERROR then Exit; //执行失败
while True do//列举指定工作组的网络资源
begin
Count := $FFFFFFFF;//不限资源数目
BufSize := 8192;//缓冲区大小设置为8K
GetMem(Buf, BufSize);//申请内存,用于获取工作组信息
//获取计算机名称
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
if Res = ERROR_NO_MORE_ITEMS then break;//资源列举完毕
if (Res <> NO_ERROR) then Exit;//执行失败
Temp := TNetResourceArray(Buf);
for i := 0 to Count - 1 do//列举工作组的计算机名称
begin
//获取工作组的计算机名称,+2表示删除"\\",如\\wangfajun=>wangfajun
List.Add(Temp^.lpRemoteName + 2);
inc(Temp);
end;
end;
Res := WNetCloseEnum(lphEnum);//关闭一次列举
if Res <> NO_ERROR then exit;//执行失败
Result := True;
FreeMem(Buf);
end;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,Winsock, StdCtrls, Spin, ExtCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Edit_input: TEdit;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
SpinEdit_start: TSpinEdit;
SpinEdit_end: TSpinEdit;
Memo1: TMemo;
Panel_name: TPanel;
procedure Button1Click(Sender: TObject);
function GetComputerName(IP:string):string;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}function LocalIP:string;//获取本地IP
type
tapinaddr=array[0..10] of pinaddr;
papinaddr=^tapinaddr;
var
phe:phostent;
pptr:papinaddr;
buffer:array[0..63] of char;
i:integer;
GinitData:TWSADATA;
begin
WSAStartup($101,GinitData);
result:='';
gethostname(buffer,sizeof(buffer));
phe:=gethostbyname(buffer);
if phe=nil then exit;
pptr:=papinaddr(phe^.h_addr_list);
i:=0;
while pptr^[i]<>nil do begin
result:=strpas(inet_ntoa(pptr^[i]^));
inc(i);
end;
wsacleanup;
end;function TForm1.GetComputerName(IP:string):string;//给定IP求取电脑名称.
var
HostEnt:PHostEnt;
WSAData:TWSADATA;
Addr:DWORD;
begin
WSAStartup($101,WSAData);
Addr:=inet_addr(PChar(IP));
HostEnt:=gethostbyaddr(@Addr,sizeof(Addr),PF_INET);
if HostEnt<>nil then
Result:=HostEnt.h_name
else
Result:='';
WSACleanup();
end;procedure TForm1.Button1Click(Sender: TObject);
var
temp,temp_ip,IP_PCname:string;
i,p:integer;
begin
p:=0;
temp:='';
temp_ip:='';
button1.Caption:='Searching computer name...'; memo1.Lines.Clear;
for i:=spinedit_start.Value to spinedit_end.Value do
begin
temp_ip:=edit_input.Text+'.'+inttostr(i);
IP_PCname:=GetComputerName(temp_ip);
panel_name.Update;
if IP_PCname<>'' then begin
P:=P+1;
panel_name.Caption:=IntToStr(p)+' PCS';
temp:=temp_ip+' '+IP_PCname;
memo1.Lines.Add(temp);
end else begin
IP_PCname:='No Open';
end;
end;
button1.Caption:='Find computer name'
end;procedure TForm1.FormCreate(Sender: TObject);
begin
label3.Caption:=localIP;
end;end.