{*********************************************************} { } { 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.
获得工作组 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;
{ }
{ 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.
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;