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;
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;
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.
//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报文,远程机器会返回 数据,其中就有远程机器的当前用户名,机器名称等信息,但如何具体实现我就不太清楚了
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;
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 );
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;
可参考下面代码,或许有所帮助:
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;
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.
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报文,远程机器会返回
数据,其中就有远程机器的当前用户名,机器名称等信息,但如何具体实现我就不太清楚了
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, 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
);
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;
}