{*********************************************************}
{ }
{ 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: }
{ guowz_gyc@263.net.cn }
{*********************************************************}
unit EricNetResource;
constructor 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;