向各位大虾讨教: 怎样取得工作组中的所有计算机名?

解决方案 »

  1.   

    得到所有工作组:function TForm1.GetServerList(var List: TStringList): Boolean;VarNetResource : TNetResource;Buf : Pointer;Count,BufSize,Res : DWORD;lphEnum : THandle;p:TNetResourceArray;i,j : SmallInt;NetworkTypeList : TList;BeginResult := False;NetworkTypeList := TList.Create;List.Clear;Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK,RESOURCEUSAGE_CONTAINER, Nil,lphEnum);//获取整个网络中的文件资源的句柄,lphEnum为返回名柄If Res <> NO_ERROR Then exit;//执行失败,退出//执行成功,开始获取整个网络中的网络类型信息Count := $FFFFFFFF;//不限资源数目BufSize := 8192;//缓冲区大小设置为8KGetMem(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//记录各个网络类型的信息BeginNetworkTypeList.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//列举一个网络类型的所有工作组的信息BeginCount := $FFFFFFFF;//不限资源数目BufSize := 8192;//缓冲区大小设置为8KGetMem(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//列举各个工作组的信息BeginList.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;得到一个工作组中所有用户:Function TForm1.GetUsers(GroupName:string):Boolean;Var  NetResource:TNetResource;  Buf : Pointer;  Count,BufSize,Res : DWord;  Ind : Integer;  lphEnum : THandle;  Temp:TNetResourceArray;  IP:string;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       IP:=copy(Temp^.lpRemoteName,3,length(Temp^.lpRemoteName));       if IP<>mycomputer.IP then         CID.add (IP);            Inc(Temp);     End; End; Res := WNetCloseEnum(lphEnum);//关闭一次列举If Res <> NO_ERROR Then exit;//执行失败  Result:=True;  FreeMem(Buf);end;用用户名得到IP地址:function TForm1.GetIP(Computer: string): string;var  WSAData: TWSAData;  HostEnt: PHostEnt;  sComputerName, sIP: string;begin  sComputername:=Computer;  WSAStartup(2, WSAData);  HostEnt := gethostbyname(PChar(sComputerName));  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;  WSACleanup;  GetIP:=sIP;end;
      

  2.   

    给我mail,我给你一个有关NET的函数库
      

  3.   

    获取计算机名称的完全程序源代码如下://列举出指定工作组GroupName中的计算机名称,返回值为TRUE表示执行成功,//参数List中返回计算机名称Function GetUsers( GroupName : string; var List : TStringList ) : Boolean;VarNetResource : 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//列举指定工作组的网络资源BeginCount := $FFFFFFFF;//不限资源数目BufSize := 8192;//缓冲区大小设置为8KGetMem(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=>wangfajunList.Add(Temp^.lpRemoteName + 2);Inc(Temp);End;End;Res := WNetCloseEnum(lphEnum);//关闭一次列举If Res <> NO_ERROR Then exit;//执行失败Result := True;FreeMem(Buf);End;