如果可以的话,请给点代码。另外,有办法得到所有组及下面的机器名吗

解决方案 »

  1.   

    Function GetNameByIP(MIP:string; var Name:string):boolean;
    var
      PHt:PHostEnt;
      WSData: TWSAData;
      i:Word;
      j:integer;
      k:u_long;
    begin
      result:=false;
      i:=MAKEWORD(1,1);
      if WSAStartup(i,WSData)<>0 then exit;
      k:=inet_addr(PChar(MIP));
      PHt:=gethostbyaddr(@k,4,PF_INET);
      if PHt=nil then begin
         j:=WSAGetLastError;
         Name:='Error:'+inttostr(j-WSABASEERR);
      end else begin
         Name:=PHt.h_name;
         result:=true;
      end;
      WSACleanup;
    end;
      

  2.   

    triton 时间:00-4-7 21:40:51 ID:215229  
    可参考下面代码,或许有所帮助:
    procedure GetDomainList(TV:TTreeView);
    var
    a : Integer;
    ErrCode : Integer;
    NetRes : Array[0..1023] of TNetResource;
    EnumHandle : THandle;
    EnumEntries : DWord;
    BufferSize : DWord;
    s : string;
    itm : TTreeNode;
    begin
    { Start here }
    try
    With NetRes[0] do begin
    dwScope :=RESOURCE_GLOBALNET;
    dwType :=RESOURCETYPE_ANY;
    dwDisplayType :=RESOURCEDISPLAYTYPE_DOMAIN;
    dwUsage :=RESOURCEUSAGE_CONTAINER;
    lpLocalName :=NIL;
    lpRemoteName :=NIL;
    lpComment :=NIL;
    lpProvider :=NIL;
    end;
    { get net root }
    ErrCode:=WNetOpenEnum(
    RESOURCE_GLOBALNET,
    RESOURCETYPE_ANY,
    RESOURCEUSAGE_CONTAINER,
    @NetRes[0],
    EnumHandle
    );
    If ErrCode=NO_ERROR then begin
    EnumEntries:=1;
    BufferSize:=SizeOf(NetRes);
    ErrCode:=WNetEnumResource(
    EnumHandle,
    EnumEntries,
    @NetRes[0],
    BufferSize
    );
    WNetCloseEnum(EnumHandle);
    ErrCode:=WNetOpenEnum(
    RESOURCE_GLOBALNET,
    RESOURCETYPE_ANY,
    RESOURCEUSAGE_CONTAINER,
    @NetRes[0],
    EnumHandle
    );
    EnumEntries:=1024;
    BufferSize:=SizeOf(NetRes);
    ErrCode:=WNetEnumResource(
    EnumHandle,
    EnumEntries,
    @NetRes[0],
    BufferSize
    );
    IF ErrCode=No_Error then with TV do try
    a:=0;
    Items.BeginUpDate;
    Items.Clear;
    Itm:=Items.Add(TV.Selected,string(NetRes[0].lpProvider));
    Itm.ImageIndex:=0;
    Itm.SelectedIndex:=0;
    { get domains }
    下面的一个单元定义了一个组件. TNetworkBrowser, 可以枚举hierachical树上所有的网络资源. 实际上浏览是要花费很长时间的,这您可以通过在WINDOWS资源管理器中打开"整个网络" 来比较一下. 如果你设置SCOPE属性 为nsContext , 你就可以看到和网络邻居中一样的机器列表.
    unit NetBrwsr;
    interface
    uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
    type
    TNetScope = (nsConnected, nsGlobal, nsRemembered, nsContext);
    TNetResourceType = (nrAny, nrDisk, nrPrint);
    TNetDisplay = (ndDomain, ndGeneric, ndServer, ndShare, ndFile, ndGroup,
    ndNetwork, ndRoot, ndShareAdmin, ndDirectory, ndTree, ndNDSContainer);
    TNetUsage = set of (nuConnectable, nuContainer);
    TNetworkItems = class;
    TNetworkItem = class
    private
    FScope: TNetScope;
    FResourceType: TNetResourceType;
    FDisplay: TNetDisplay;
    FUsage: TNetUsage;
    FLocalName: string;
    FRemoteName: string;
    FComment: string;
    FProvider: string;
    FSubItems: TNetworkItems;
    public
    constructor Create;
    destructor Destroy; override;
    property Scope: TNetScope read FScope;
    property ResourceType: TNetResourceType read FResourceType;
    property Display: TNetDisplay read FDisplay;
    property Usage: TNetUsage read FUsage;
    property LocalName: string read FLocalName;
    property RemoteName: string read FRemoteName;
    property Comment: string read FComment;
    property Provider: string read FProvider;
    property SubItems: TNetworkItems read FSubItems;
    end;
    TNetworkItems = class
    private
    FList: TList;
    procedure SetItem(Index: Integer; Value: TNetworkItem);
    function GetItem(Index: Integer): TNetworkItem;
    function GetCount: Integer;
    public
    constructor Create;
    destructor Destroy; override;
    procedure Clear;
    procedure Add(Item: TNetworkItem);
    procedure Delete(Index: Integer);
    property Items[Index: Integer]: TNetworkItem read GetItem write
    SetItem; default;
    property Count: Integer read GetCount;
    end;
    TNetworkBrowser = class(TComponent)
    private
    FItems: TNetworkItems;
    FScope: TNetScope;
    FResourceType: TNetResourceType;
    FUsage: TNetUsage;
    FActive: Boolean;
    procedure Refresh;
    procedure SetActive(Value: Boolean);
    procedure SetScope(Value: TNetScope);
    procedure SetResourceType(Value: TNetResourceType);
    procedure SetUsage(Value: TNetUsage);
    procedure EnumerateNet(NetItems: TNetworkItems; lpnr: PNetResource);
    protected
    public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure Open;
    procedure Close;
    property Items: TNetworkItems read FItems;
    published
    property Scope: TNetScope read FScope write SetScope default nsGlobal;
    property ResourceType: TNetResourceType read FResourceType
    write SetResourceType default nrAny;
    property Usage: TNetUsage read FUsage write SetUsage default [];
    property Active: Boolean read FActive write SetActive default False;
    end;
    implementation
    type
    PNetResourceArray = ^TNetResourceArray;TNetResourceArray = array[0..0] of TNetResource;
    { TNetworkItem }
    constructor TNetworkItem.Create;
    begin
    inherited;
    FSubItems := TNetworkItems.Create;
    end;
    destructor TNetworkItem.Destroy;
    begin
    if FSubItems <> nil then
    FSubItems.Free;
    inherited;
    end;
    { TNetworkItems }
    constructor TNetworkItems.Create;
    begin
    inherited;
    FList := TList.Create;
    end;
    destructor TNetworkItems.Destroy;
    begin
    Clear;
    if FList <> nil then
    FList.Free;
    inherited;
    end;
    procedure TNetworkItems.SetItem(Index: Integer; Value: TNetworkItem);
    begin
    if (FList.Items[Index] <> nil) and (FList.Items[Index] <> Value) then
    TNetworkItem(FList.Items[Index]).Free;
    FList.Items[Index] := Value;
    end;
    function TNetworkItems.GetItem(Index: Integer): TNetworkItem;
    begin
    Result := TNetworkItem(FList.Items[Index]);
    end;
    procedure TNetworkItems.Clear;
    begin
    while Count > 0 do
    Delete(0);
    end;
    procedure TNetworkItems.Add(Item: TNetworkItem);
    begin
    FList.Add(Item);
    end;
      

  3.   

    procedure TNetworkItems.Delete(Index: Integer);
    begin
    if FList.Items[Index] <> nil then
    TNetworkItem(FList.Items[Index]).Free;
    FList.Delete(Index);
    end;
    function TNetworkItems.GetCount: Integer;
    begin
    if FList <> nil then
    Result := FList.Count
    else
    Result := 0;
    end;
    { TNetworkBrowser }
    constructor TNetworkBrowser.Create(AOwner: TComponent);
    begin
    inherited Create(AOwner);
    FItems := TNetworkItems.Create;
    FScope := nsGlobal;
    FResourceType := nrAny;
    FUsage := [];
    end;
    destructor TNetworkBrowser.Destroy;
    begin
    if FItems <> nil then
    FItems.Free;
    inherited;
    end;
    procedure TNetworkBrowser.EnumerateNet(NetItems: TNetworkItems; lpnr:
    PNetResource);
    var
    dwResult, dwResultEnum: Integer;
    hEnum: THandle;
    cbBuffer, cEntries, i: Integer;
    nrArray: PNetResourceArray;
    NewItem: TNetworkItem;
    dwScope, dwType, dwUsage: Integer;
    begin
    cbBuffer := 16384;
    cEntries := $FFFFFFFF;
    case FScope of
    nsConnected: dwScope := RESOURCE_CONNECTED;
    nsGlobal: dwScope := RESOURCE_GLOBALNET;
    nsRemembered: dwScope := RESOURCE_REMEMBERED;
    nsContext: dwScope := RESOURCE_CONTEXT;
    else
    dwScope := RESOURCE_GLOBALNET;
    end;
    case FResourceType of
    nrAny: dwType := RESOURCETYPE_ANY;
    nrDisk: dwType := RESOURCETYPE_DISK;
    nrPrint: dwType := RESOURCETYPE_PRINT;
    else
    dwType := RESOURCETYPE_ANY;
    end;
    dwUsage := 0;
    if nuConnectable in FUsage then
    dwUsage := dwUsage or RESOURCEUSAGE_CONNECTABLE;
    if nuContainer in FUsage then
    dwUsage := dwUsage or RESOURCEUSAGE_CONTAINER;
    dwResult := WNetOpenEnum(dwScope, dwType, dwUsage, lpnr, hEnum);
    if dwResult <> NO_ERROR then Exit;
    GetMem(nrArray, cbBuffer);
    repeat
    dwResultEnum := WNetEnumResource(hEnum, cEntries, nrArray, cbBuffer);
    if dwResultEnum = NO_ERROR then
    for i := 0 to cEntries-1 do
    begin
    NewItem := TNetworkItem.Create;
    case nrArray[i].dwScope of
    RESOURCE_CONNECTED: NewItem.FScope := nsConnected;
    RESOURCE_GLOBALNET: NewItem.FScope := nsGlobal;
    RESOURCE_REMEMBERED: NewItem.FScope := nsRemembered;
    RESOURCE_CONTEXT: NewItem.FScope := nsContext;
    else
    NewItem.FScope := nsGlobal;
    end;
    case nrArray[i].dwType of
    RESOURCETYPE_ANY: NewItem.FResourceType := nrAny;
    RESOURCETYPE_DISK: NewItem.FResourceType := nrDisk;
    RESOURCETYPE_PRINT: NewItem.FResourceType := nrPrint;
    else
    NewItem.FResourceType := nrAny;
    end;
    case nrArray[i].dwDisplayType of
    RESOURCEDISPLAYTYPE_GENERIC: NewItem.FDisplay := ndGeneric;
    RESOURCEDISPLAYTYPE_DOMAIN: NewItem.FDisplay := ndDomain;
    RESOURCEDISPLAYTYPE_SERVER: NewItem.FDisplay := ndServer;
    RESOURCEDISPLAYTYPE_SHARE: NewItem.FDisplay := ndShare;
    RESOURCEDISPLAYTYPE_FILE: NewItem.FDisplay := ndFile;
    RESOURCEDISPLAYTYPE_GROUP: NewItem.FDisplay := ndGroup;
    RESOURCEDISPLAYTYPE_NETWORK: NewItem.FDisplay := ndNetwork;
    RESOURCEDISPLAYTYPE_ROOT: NewItem.FDisplay := ndRoot;
    RESOURCEDISPLAYTYPE_SHAREADMIN: NewItem.FDisplay :=
    ndShareAdmin;
    RESOURCEDISPLAYTYPE_DIRECTORY: NewItem.FDisplay :=
    ndDirectory;
    RESOURCEDISPLAYTYPE_TREE: NewItem.FDisplay := ndTree;
    RESOURCEDISPLAYTYPE_NDSCONTAINER: NewItem.FDisplay :=
    ndNDSContainer;
    else
    NewItem.FDisplay := ndGeneric;
    end;
    NewItem.FUsage := [];
    if nrArray[i].dwUsage and RESOURCEUSAGE_CONNECTABLE <> 0 then
    Include(NewItem.FUsage, nuConnectable);
    if nrArray[i].dwUsage and RESOURCEUSAGE_CONTAINER <> 0 then
    Include(NewItem.FUsage, nuContainer);
    NewItem.FLocalName := StrPas(nrArray[i].lpLocalName);
    NewItem.FRemoteName := StrPas(nrArray[i].lpRemoteName);
    NewItem.FComment := StrPas(nrArray[i].lpComment);
    NewItem.FProvider := StrPas(nrArray[i].lpProvider);
    NetItems.Add(NewItem);
    // if container, call recursively
    if (nuContainer in NewItem.FUsage) and (FScope <> nsContext) then
    EnumerateNet(NewItem.FSubItems, @nrArray[i])
    end;
    until dwResultEnum = ERROR_NO_MORE_ITEMS;
    FreeMem(nrArray);
    WNetCloseEnum(hEnum);
    end;
    procedure TNetworkBrowser.Refresh;
    begin
    FItems.Clear;
    if FActive then
    EnumerateNet(FItems, nil);
    end;
    procedure TNetworkBrowser.SetActive(Value: Boolean);
    begin
    if Value <> FActive then
    begin
    FActive := Value;
    Refresh;
    end;
    end;
    procedure TNetworkBrowser.SetScope(Value: TNetScope);
    begin
    if Value <> FScope then
    begin
    FScope := Value;
    Refresh;
    end;
    end;
    procedure TNetworkBrowser.SetResourceType(Value: TNetResourceType);
    begin
    if Value <> FResourceType then
    begin
    FResourceType := Value;
    Refresh;
    end;
    end;
    procedure TNetworkBrowser.SetUsage(Value: TNetUsage);
    begin
    if Value <> FUsage then
    begin
    FUsage := Value;
    Refresh;
    end;
    end;
    procedure TNetworkBrowser.Open;
    begin
    Active := True;
    end;
    procedure TNetworkBrowser.Close;
    begin
    Active := False;
    end;
    end.
      

  4.   

    //uses winsock; 通过IP地址得到机器名 
    function  iptoname(ip:string):string; 
    var 
       WSAData:TWSAData; 
       p:PHostEnt; 
       InetAddr:dword; 
    begin 
       result:=''''; 
       WSAStartup(2,  WSAData); 
       InetAddr:=  inet_addr(PChar(IP)); 
       try 
       p:=GetHostByAddr(@InetAddr,  Length(IP),  PF_Inet); 
       if p<> nil then result:=p^.h_name; 
       except 
         result:=''''; 
       end; 
    end; 
    这段代码我试过, 不过只对局域网的机器有效,对internet上的机器不行,且速度不太快我有看到相关的资料,是通过udp协议,往远程机器的137端口发送UDP报文,远程机器会返回
    数据,其中就有远程机器的当前用户名,机器名称等信息,但如何具体实现我就不太清楚了
      

  5.   

    type
      PnetResourceArr = ^TNetResource;implementation
    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;这程序是网上来的,我整理了一个,就变成现在这样了。
    procedure oncreate;
    begin GetServerList(Listbox1.Items);end;
    procedure Listbox1.Onclick
    begin
      GetUserList(Listbox1.Items[Listbox1.ItemIndex],Listbox2.Items);
    end;
    **************************************
    获得网上邻居列表的程序
    程序如下:
    var
    i : Integer;
    ErrCode : Integer;
    NetRes : Array[0..1023] of TNetResource;
    EnumHandle : Thandle;
    EnumEntries : Dword;
    BufferSize : Dword;
    ComputerIP,ComputerName:String;
    begin
    //try
    With NetRes[0] do begin
      dwScope :=RESOURCE_GLOBALNET;
      dwType :=RESOURCETYPE_ANY;
      dwDisplayType :=RESOURCEDISPLAYTYPE_DOMAIN;
      dwUsage :=RESOURCEUSAGE_CONNECTABLE;
      lpLocalName :=NIL;
      lpRemoteName :=NIL;
      lpComment :=NIL;
      lpProvider :=NIL;
      end;
    { get net root }
    ErrCode:=WNetOpenEnum(
    RESOURCE_GLOBALNET,
    RESOURCETYPE_ANY,
    RESOURCEUSAGE_CONTAINER,
    @NetRes[0],
    EnumHandle
    );If ErrCode=NO_ERROR then begin
      EnumEntries:=1;
      BufferSize:=SizeOf(NetRes);
      ErrCode:=WNetEnumResource(EnumHandle,EnumEntries,@NetRes[0],BufferSize);
      WNetCloseEnum(EnumHandle);
      ErrCode:=WNetOpenEnum(
      RESOURCE_GLOBALNET,
      RESOURCETYPE_ANY,
      RESOURCEUSAGE_CONNECTABLE,
      @NetRes[0],
      EnumHandle
      );
      EnumEntries:=1024;
      BufferSize:=SizeOf(NetRes);
      ErrCode:=WNetEnumResource(
      EnumHandle,
      EnumEntries,
      @NetRes,
      BufferSize
      );  for i:=0 to 1023 do
          if NetRes[i].lpRemoteName='' then Exit
          else begin
            ComputerName:=Copy(NetRes[i].lpRemoteName,3,Length(NetRes[i].lpRemoteName)-2);
            ComputerIP:=GetIP(ComputerName);
            ShowMessage('计算机名' + NetRes[i].lpRemoteName + chr(13)
            + '计算机说明:' + NetRes[i].lpComment + chr(13)
            + 'IP地址:' + ComputerIP);
      end;
      end;
      

  6.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ComCtrls, ImgList, ExtCtrls, ToolWin;type
      TForm1 = class(TForm)
        ImageList1: TImageList;
        ToolBar1: TToolBar;
        ToolButton1: TToolButton;
        Panel1: TPanel;
        ResourceTree: TTreeView;
        Splitter1: TSplitter;
        ResourceList: TListView;
        Panel2: TPanel;
        lbScope: TLabel;
        lbType: TLabel;
        lbDisplayType: TLabel;
        lbUsage: TLabel;
        lbLocalName: TLabel;
        lbRemoteName: TLabel;
        lbComment: TLabel;
        lbProvider: TLabel;
        ToolButton2: TToolButton;
        procedure Button1Click(Sender: TObject);
        procedure ResourceTreeChange(Sender: TObject; Node: TTreeNode);
        procedure ToolButton2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        function AddTreeItem(nr:NETRESOURCE;node:TTreeNode):TTreeNode;
        function EnumNetWorkResource(lpnr:PNetResource;node:TTreeNode):Boolean;
        procedure ConnectResource(pnr:PNetResource);
      end;var
      Form1: TForm1;implementation{$R *.DFM}{ TForm1 }
    function GetLastErrorText:string;
    var
       dwSize:DWORD;
       lpszTemp:LPSTR;
    begin
         dwSize:=512;
         lpszTemp:=nil;
         try
            GetMem(lpszTemp,dwSize);
            FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_ARGUMENT_ARRAY,
            nil,GetLastError,LANG_NEUTRAL,lpszTemp,dwSize,nil);
         finally
                Result:=StrPas(lpszTemp);
                FreeMem(lpszTemp);
         end;
    end;function TForm1.EnumNetWorkResource(lpnr:PNetResource;node:TTreeNode):Boolean;
    var
    nr:NetResource;
    hEnum:THandle;
    lpnrLocal: PNETRESOURCE;
    cbBuffer:DWORD;
    cEntries,dwEnumResult:DWORD;
    i:Integer;
    LocalNode:TTreeNode;
    begin
    Result:=False;
    cbBuffer:=163840;
    cEntries:=$ffffffff;
    lpnrLocal:=nil;
    if(WNetOpenEnum(RESOURCE_GLOBALNET,
    RESOURCETYPE_ANY,
       0,
       lpnr,
       hEnum)<>NO_ERROR)then
       begin
       ShowMessage('Open enum error,node='+lpnr^.lpRemoteName);
       ShowMessage(GetLastErrorText);
       Result:=False;
       Exit;
       end;
    try
       repeat
    lpnrLocal:=PNetResource(GlobalAlloc(GPTR,cbBuffer));
        dwEnumResult:=WNetEnumResource(hEnum,
            cEntries,
               lpnrLocal,
               cbBuffer);
           if(dwEnumResult=NO_ERROR)then
            begin
               for i:=0 to cEntries-1 do
                begin
                   nr:=(PNetResource(PChar(lpnrLocal)+sizeOf(NetResource)*i))^;
                   LocalNode:=AddTreeItem(nr,node);
                   if(RESOURCEUSAGE_CONTAINER=
                    nr.dwUsage and RESOURCEUSAGE_CONTAINER)then
                       begin
                       if(not EnumNetWorkResource(@nr,LocalNode))then
                        begin
                        ShowMessage('Error enum,Parent='+lpnr^.lpRemoteName);
    ShowMessage(GetLastErrorText);
                           end;
                       end;
                   end;
               end;
       until (dwEnumResult=ERROR_NO_MORE_ITEMS);
       if(dwEnumResult=ERROR_NO_MORE_ITEMS)then
        Result:=True;
    Except
    GlobalFree(Cardinal(lpnrLocal));
    WNetCloseEnum(hEnum);
       Raise;
       end;
    GlobalFree(Cardinal(lpnrLocal));
    WNetCloseEnum(hEnum);
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
    EnumNetWorkResource(nil,ResourceTree.Items[0]);
    end;function TForm1.AddTreeItem(nr: NETRESOURCE; node: TTreeNode): TTreeNode;
    var
    pnr:PNetResource;
    begin
    GetMem(pnr,SizeOf(NetResource));
    pnr^:=nr;
    Result:=ResourceTree.Items.AddChildObject(node,nr.lpRemoteName,pnr);
    if(nr.dwUsage=RESOURCEUSAGE_CONTAINER)then
    Result.ImageIndex:=0
    else Result.ImageIndex:=1;
    end;procedure TForm1.ResourceTreeChange(Sender: TObject; Node: TTreeNode);
    var
    pnr:PNetResource;
    begin
    pnr:=PNetResource(Node.Data);
    if(pnr=nil)then Exit;
    case pnr^.dwScope of
    RESOURCE_CONNECTED:
       lbScope.Caption:='Connetted';
       RESOURCE_GLOBALNET:
       lbScope.Caption:='GlobalNet';
       RESOURCE_REMEMBERED:
       lbScope.Caption:='Remembered';
       else
       lbScope.Caption:='else scope:'+IntToStr(pnr^.dwScope);
       end;case pnr^.dwType of
    RESOURCETYPE_DISK:
       lbType.Caption:='Disk';
       RESOURCETYPE_PRINT:
       lbType.Caption:='Printer';
       else
       lbType.Caption:=IntToStr(pnr^.dwType);
       end;case pnr^.dwDisplayType of
    RESOURCEDISPLAYTYPE_DOMAIN:
       lbDisplayType.Caption:='Domain';
       RESOURCEDISPLAYTYPE_GENERIC:
       lbDisplayType.Caption:='Generic';
       RESOURCEDISPLAYTYPE_SERVER:
       lbDisplayType.Caption:='Server';
       RESOURCEDISPLAYTYPE_SHARE:
       lbDisplayType.Caption:='Shared';
       else
       lbDisplayType.Caption:='else type:'+IntToStr(pnr^.dwDisplayType);
       end;case pnr^.dwUsage of
    RESOURCEUSAGE_CONTAINER:
       lbUsage.Caption:='Container';
       RESOURCEUSAGE_CONNECTABLE:
       lbUsage.Caption:='Connectable';
       else
       lbUsage.Caption:='else Usage:'+IntToStr(pnr^.dwUsage);
       end;lbLocalName.Caption:=pnr^.lpLocalName;
    lbRemoteName.Caption:=pnr^.lpRemoteName;
    lbComment.Caption:=pnr^.lpComment;
    lbProvider.Caption:=pnr^.lpProvider;//ConnectResource(pnr);
    end;procedure TForm1.ConnectResource(pnr: PNetResource);
    begin
    if((pnr^.dwUsage and RESOURCEUSAGE_CONNECTABLE)
    =RESOURCEUSAGE_CONNECTABLE)then
       begin
    {   if(WNetAddConnection2(pnr^,PChar(''),'wuwei',0)<>NO_ERROR)then
        ShowMessage(GetLastErrorText);}
    if(WNetAddConnection(pnr^.lpRemoteName,'','h:')<>NO_ERROR)then
        ShowMessage(GetLastErrorText);
       end;
    end;procedure TForm1.ToolButton2Click(Sender: TObject);
    var
    p:PNetResource;
    begin
    p:=PNetResource(ResourceTree.Selected.Data);
    ConnectResource(p);
    end;end.*******
    查询局域网中NT服务器的计算机名
    You should use API functionNET_API_STATUS NetServerEnum(
      LPWSTR servername,     
      DWORD level,           
      LPBYTE *bufptr,        
      DWORD prefmaxlen,      
      LPDWORD entriesread,   
      LPDWORD totalentries,  
      DWORD servertype,      
      LPWSTR domain,         
      LPDWORD resume_handle  
    );
      

  7.   

    //==============================================================================
    bool EnumNetResource(TStrings *rcList,LPNETRESOURCE lpNR, DWORD dwScope,DWORD dwType)
    {                        //获取网上邻居的列表,存储在串表中
    HANDLE hEnum = 0;
    DWORD dwResult = WNetOpenEnum(dwScope,dwType, 0,lpNR,&hEnum) ;
    if( dwResult != NO_ERROR )
    return false;
    bool bRet=true;
    DWORD dwEntries = 0xFFFFFFFF ;    //1. enumerate all possible entries
    NETRESOURCE NR[1024];
    DWORD dwBuffer=1024*sizeof(NETRESOURCE);
    while(1)
    {
    dwResult = WNetEnumResource(hEnum,&dwEntries,(LPVOID)NR,&dwBuffer) ; // 1.resource-handle
    if( dwResult == ERROR_NO_MORE_ITEMS ) break;
    else if( dwResult != NO_ERROR ) { bRet=false; break;}
     for(DWORD i = 0 ; i < dwEntries ; i++ )
     {
    if(NR[i].dwDisplayType==RESOURCEDISPLAYTYPE_SERVER)
    {
      char *p=NR[i].lpRemoteName;
      while(*p=='\\') p++;
      if(*p) rcList->Add(p);
     }
    else if((NR[i].dwUsage&RESOURCEUSAGE_CONTAINER)==RESOURCEUSAGE_CONTAINER)
    {
    bRet=EnumNetResource(rcList,&NR[i],dwScope,dwType);
    if(bRet==false) break;
     }
      }
    if(bRet==false) break;
      }
      WNetCloseEnum(hEnum) ;
      return bRet;
    }