怎样获得LAN上的其他计算机名称??????????

解决方案 »

  1.   

    {*********************************************************}
    {                                                         }
    {     TEricNetResource 1.0    CopyRight ?2002 Eric.Kuo    }
    {                                                         }
    {     The Class can find not only NetGroup's name but     }
    {     also all users of the NetGroup.                     }
    {                                                         }
    {                                                         }
    {     Please Contact Eric at this address:                }
    {      [email protected]                               }
    {*********************************************************}
    unit EricNetResource;interfaceuses
      Windows,Classes,SysUtils;type
      TNetResourceArray = ^TNetResource;
      TEricNetResource = Class(TComponent)
      private
        FServers        :TStrings;
        procedure GetServerList;
      public
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
        procedure GetUsers(GroupName:String;UserList:TStrings);
      published
        property Servers: TStrings read FServers;
      end;
    procedure Register;
    implementationconstructor TEricNetResource.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      FServers:=TStringlist.Create;
      GetServerList;
    end;destructor TEricNetResource.Destroy;
    begin
      FServers.Free;
      inherited Destroy;
    end;procedure TEricNetResource.GetServerList;
    Var
      NetResource        : TNetResource;
      Buf                : Pointer;
      Count,BufSize,Res  : DWORD;
      lphEnum            : THandle;
      p                  : TNetResourceArray;
      i,j                : SmallInt;
      NetworkTypeList    : TList;
    Begin
      NetworkTypeList := TList.Create;
      Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
                          RESOURCEUSAGE_CONTAINER, Nil,lphEnum);
      If Res <> NO_ERROR Then exit;
      Count := $FFFFFFFF;
      BufSize := 8192;
      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;
          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
            FServers.Add(StrPAS( P^.lpRemoteName ));//取得一个工作组的名称
            Inc(P);
          End;
        End;
        Res := WNetCloseEnum(lphEnum);
        If Res <> NO_ERROR Then break;
      End;
      FreeMem(Buf);
      NetworkTypeList.Destroy;
    End;Procedure TEricNetResource.GetUsers(GroupName:String;UserList:TStrings);
    Var
      NetResource        : TNetResource;
      Buf                : Pointer;
      Count,BufSize,Res  : DWord;
      Ind                : Integer;
      lphEnum            : THandle;
      Temp               : TNetResourceArray;
    Begin
      UserList.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;
        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表示删除"\\",如\\guoyunchang=>guoyunchang
          UserList.Add(Temp^.lpRemoteName + 2);
          Inc(Temp);
        End;
      End;
      Res := WNetCloseEnum(lphEnum);
      If Res <> NO_ERROR Then exit;
      FreeMem(Buf);
    End;procedure Register;
    begin
      RegisterComponents('Eric',[TEricNetResource]);
    end;end.
      

  2.   

    获得工作组
    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
      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;