delphi获取局域网内用户IP

function     GetUsers(GroupName:   string;   var   List:   TStringList):   Boolean;
type
TNetResourceArray   =   ^TNetResource;   //网络类型的数组
var
NetResource:   TNetResource;
Buf:   Pointer;
Count,   BufSize,   Res:   DWord;
Ind:   Integer;
lphEnum:   THandle;
Temp:   TNetResourceArray;
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   Ind   :=   0   to   Count   –   1   do   //列举工作组的计算机名称
begin
//获取工作组的计算机名称,+2表示删除”\\”,如\\wangfajun=>wangfajun
List.Add(Temp^.lpRemoteName   +   2);
Inc(Temp);
end;
FreeMem(Buf);
end;
Res   :=   WNetCloseEnum(lphEnum);   //关闭一次列举
if   Res   <>   NO_ERROR   then   exit;   //执行失败
Result   :=   True;
end;

function     GetServerList(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;
//WNetCloseEnum关闭一个列举句柄
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;
//获取IP函数
Function  GetIPAddr : String;
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;
procedure TForm1.Button1Click(Sender: TObject);
begin

label1.caption:=GetIPAddr

end;
procedure TForm1.FormCreate(Sender: TObject);

var//   Owner   :   HWnd;
WSAData:   TWSAData;
HostEnt:   PHostEnt;
sIP:   string;
sz:   dword;
i,   j:   Integer;
list1,   list2:   TStringList;
begin
//   FileListenItemClick(nil);
WSAStartup(2,   WSAData);
list1   :=   TStringList.Create;
list2   :=   TStringList.Create;
servername_combox.Items.Clear;
if   GetServerList(list1)   then
begin
for   i   :=   0   to   list1.Count   –   1   do
begin
//showmessage(list1.Strings[0]);
if   getusers(list1.Strings[i],   list2)   then
begin
for   j   :=   0   to   list2.Count   –   1   do
begin
hostEnt:=nil;
sip:=”;
HostEnt   :=   gethostbyname(PChar(list2.Strings[j]));
if   HostEnt   <>   nil   then
begin
with   HostEnt^   do
sIP   :=   Format(‘%d.%d.%d.%d’,   [Byte(h_addr^[0]),   Byte(h_addr^[1]),   Byte(h_addr^[2]),   Byte(h_addr^[3])]);
end;
servername_combox.Items.Add(list1.Strings[i]+’   ,’+list2.Strings[j]+’   ,’+sIP);
end;
end//
end;
end;
list1.Destroy;
list2.Destroy;
WSACleanup;
end;

本文固定链接: http://www.ccsbbs.com.cn/archives/5983.html | 极限手指

该日志由 极限手指 于2013年03月10日发表在 Delphi 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: delphi获取局域网内用户IP | 极限手指

delphi获取局域网内用户IP:等您坐沙发呢!

发表评论

您必须 [ 登录 ] 才能发表留言!