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;
*************
请问怎样获取所有能访问的网上邻居中的计算机名称列表?
通过Windows Shell API
用SHGetSpecialFolderLocation获得Neighborhood的PIDL,然后将一个IShellFolder接
口绑定到这个PIDL,再然后就可以用这个接口的EnumObjects函数枚举其中的对象了。
因我不会Delphi,所以不知道用Delphi应该具体如何做,下面一段C++代码列出了"我
的电脑"下的所有项目(我的计算机没有安装网络邻居,所以用这个代替,方法应该是
一样的)#include <stdio.h>
#include <iostream.h>
#include <comdef.h>
#include <windows.h>
#include <shellapi.h>
#include <shlobj.h>
#include <shlguid.h>
#include <shlwapi.h>void _inline error(){ cerr<<"ERROR!"<<endl; _exit(1); }void main(int argc, char* argv[])
{
 IMallocPtr pMalloc;
 IShellFolderPtr pShellFolder,pFolder;
 LPITEMIDLIST pidl;
 IEnumIDListPtr pEnum;
 HRESULT hr;
 STRRET Name;
 ULONG celtFetched; SHGetMalloc(&pMalloc); if (!SUCCEEDED(SHGetDesktopFolder(&pShellFolder)))
  error();
 if (!SUCCEEDED(SHGetSpecialFolderLocation(NULL,CSIDL_DRIVES,&pidl)))
  error();
 pShellFolder->BindToObject(pidl,NULL,IID_IShellFolder,(LPVOID*)&pFolder); hr=pFolder->EnumObjects(NULL,SHCONTF_FOLDERS|SHCONTF_NONFOLDERS|
  SHCONTF_INCLUDEHIDDEN,&pEnum); while ((hr = pEnum->Next (1, &pidl, &celtFetched)) != S_FALSE &&
celtFetched == 1)
 {
  hr = pFolder->GetDisplayNameOf (pidl, SHGDN_NORMAL , &Name);
  if (FAILED (hr))
  {
   error();
   break;
  }
  printf("%s\n",Name.cStr);
 } if (!pidl)
  pMalloc->Free(pidl);
}**************
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  
);