谢谢

解决方案 »

  1.   

    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
    // Result := False;  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);
        //Result := True;
        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);
    //    Result := True;
      Finally
        FreeMem(Buf);
      End;
    End;
      

  2.   

    type
      PNetResourceArr=^TNetResource;
    加多这个看看行么
      

  3.   

    unit Unit1;interface uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ExtCtrls, Buttons; type
      Tfwqxz = class(TForm)
        UserList: TListBox;
        procedure FormShow(Sender: TObject);
        Function GetServerList( var List : TStringList ) : Boolean;
        Function GetUsers( GroupName : string; var List : TStringList ) : Boolean;
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end; var
      fwqxz: Tfwqxz;implementation {$R *.DFM} procedure Tfwqxz.FormShow(Sender: TObject); 
    var list1,list2:TStringList;
        i,j:Integer; 
    beginlist1:= TStringList.Create; 
    list2:= TStringList.Create; 
    if GetServerList(list1) then 
    begin
       //showmessage('执行成功');
       for i:=0 to list1.Count-1 do
       begin
          if getusers(list1.Strings[i],list2) then
            begin
              for j:=0 to list2.Count-1 do
              UserList.Items.Add(list2.Strings[j]);
            end;
       end; 
    end; 
    list1.Destroy; 
    list2.Destroy; 
    end; Function Tfwqxz.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; Function Tfwqxz.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;
         End;
         Res := WNetCloseEnum(lphEnum);//关闭一次列举
         If Res <> NO_ERROR Then exit;//执行失败
         Result := True;
         FreeMem(Buf);
    End; procedure Tfwqxz.FormCreate(Sender: TObject); 
    var list1,list2:TStringList;
        i,j:Integer; 
    begin
    list1:= TStringList.Create;
    list2:= TStringList.Create;
    if GetServerList(list1) then
    begin
       for i:=0 to list1.Count-1 do
       begin
          if getusers(list1.Strings[i],list2) then
            begin
              for j:=0 to list2.Count-1 do
              UserList.Items.Add(list2.Strings[j]);
            end;
       end;
    end;
    list1.Destroy; 
    list2.Destroy;
    end;end.完整代码,再2k通过,可以道地结果