📄 jcllanman.pas
字号:
function GetGlobalGroups(const Server: string; const Groups: TStrings): Boolean;
var
Err: NET_API_STATUS;
wServername: WideString;
Buffer: PByte;
Details: PGroupInfo0;
EntriesRead, TotalEntries: Cardinal;
I: Integer;
begin
wServername := Server;
Err := RtdlNetGroupEnum(PWideChar(wServername), 0, Buffer, MAX_PREFERRED_LENGTH,
EntriesRead, TotalEntries, nil);
if Err = NERR_SUCCESS then
begin
Details := PGroupInfo0(Buffer);
// (rom) is 'None' locale independent?
if (EntriesRead <> 1) or (Details^.grpi0_name <> 'None') then
begin
Groups.BeginUpdate;
try
for I := 0 to EntriesRead - 1 do
begin
Groups.Add(Details^.grpi0_name);
Inc(Details);
end;
finally
Groups.EndUpdate;
end;
end;
end
else
RaiseLastOSError;
RtdlNetApiBufferFree(Buffer);
Result := (Err = NERR_SUCCESS);
end;
function LocalGroupExists(const Group: string): Boolean;
var
Groups: TStringList;
begin
Groups := TStringList.Create;
try
GetLocalGroups('', Groups);
Result := (Groups.IndexOf(Group) >= 0);
finally
Groups.Free;
end;
end;
function GlobalGroupExists(const Server, Group: string): Boolean;
var
Groups: TStringList;
begin
Groups := TStringList.Create;
try
GetGlobalGroups(Server, Groups);
Result := (Groups.IndexOf(Group) >= 0);
finally
Groups.Free;
end;
end;
function DeleteGlobalGroup(const Server, Groupname: string): Boolean;
var
wServername, wUsername: WideString;
Err: NET_API_STATUS;
begin
wServername := Server;
wUsername := Groupname;
Err := RtdlNetGroupDel(PWideChar(wServername), PWideChar(wUsername));
Result := (Err = NERR_SUCCESS);
end;
function AddAccountToLocalGroup(const Accountname, Groupname: string): Boolean;
var
Err: NET_API_STATUS;
wAccountname, wGroupname: WideString;
Details: LOCALGROUP_MEMBERS_INFO_3;
begin
wGroupname := Groupname;
wAccountname := AccountName;
Details.lgrmi3_domainandname := PWideChar(wAccountname);
Err := RtdlNetLocalGroupAddMembers(nil, PWideChar(wGroupname), 3, @Details, 1);
Result := (Err = NERR_SUCCESS);
end;
function RIDToDWORD(const RID: TNetWellKnownRID): DWORD;
begin
case RID of
wkrAdmins:
Result := DOMAIN_ALIAS_RID_ADMINS;
wkrUsers:
Result := DOMAIN_ALIAS_RID_USERS;
wkrGuests:
Result := DOMAIN_ALIAS_RID_GUESTS;
wkrPowerUsers:
Result := DOMAIN_ALIAS_RID_POWER_USERS;
wkrBackupOPs:
Result := DOMAIN_ALIAS_RID_BACKUP_OPS;
wkrReplicator:
Result := DOMAIN_ALIAS_RID_REPLICATOR;
else // (wkrEveryone)
Result := SECURITY_WORLD_RID;
end;
end;
function DWORDToRID(const RID: DWORD): TNetWellKnownRID;
begin
case RID of
DOMAIN_ALIAS_RID_ADMINS:
Result := wkrAdmins;
DOMAIN_ALIAS_RID_USERS:
Result := wkrUsers;
DOMAIN_ALIAS_RID_GUESTS:
Result := wkrGuests;
DOMAIN_ALIAS_RID_POWER_USERS:
Result := wkrPowerUsers;
DOMAIN_ALIAS_RID_BACKUP_OPS:
Result := wkrBackupOPs;
DOMAIN_ALIAS_RID_REPLICATOR:
Result := wkrReplicator;
else // (SECURITY_WORLD_RID)
Result := wkrEveryone;
end;
end;
function LookupGroupName(const Server: string; const RID: TNetWellKnownRID): string;
var
sia: SID_IDENTIFIER_AUTHORITY;
rd1, rd2: DWORD;
ridCount: Integer;
sd: PSID;
AccountNameLen, DomainNameLen: DWORD;
SidNameUse: SID_NAME_USE;
begin
Result := '';
rd2 := 0;
if RID = wkrEveryOne then
begin
sia := SECURITY_WORLD_SID_AUTHORITY;
rd1 := RIDToDWORD(RID);
ridCount := 1;
end
else
begin
sia := SECURITY_NT_AUTHORITY;
rd1 := SECURITY_BUILTIN_DOMAIN_RID;
rd2 := RIDToDWORD(RID);
ridCount := 2;
end;
if AllocateAndInitializeSid(sia, ridCount, rd1, rd2, 0, 0, 0, 0, 0, 0, sd) then
try
AccountNameLen := 0;
DomainNameLen := 0;
if not LookupAccountSID(PChar(Server), sd, PChar(Result), AccountNameLen,
nil, DomainNameLen, SidNameUse) then
SetLength(Result, AccountNamelen);
if LookupAccountSID(PChar(Server), sd, PChar(Result), AccountNameLen,
nil, DomainNameLen, sidNameUse) then
StrResetLength(Result)
else
RaiseLastOSError;
finally
FreeSID(sd);
end;
end;
procedure ParseAccountName(const QualifiedName: string; var Domain, UserName: string);
var
Parts: TStringList;
begin
Parts := TStringList.Create;
try
StrTokenToStrings(QualifiedName, '\', Parts);
if Parts.Count = 1 then
UserName := Parts[0]
else
begin
Domain := Parts[0];
UserName := Parts[1];
end;
finally
Parts.Free;
end;
end;
function IsLocalAccount(const AccountName: string): Boolean;
var
Domain: string;
UserName: string;
LocalServerName: string;
begin
LocalServerName := GetLocalComputerName;
ParseAccountName(AccountName, Domain, UserName);
Result := (Domain = '') or (Domain = LocalServerName);
end;
// History:
// $Log: JclLANMan.pas,v $
// Revision 1.12 2005/02/25 07:20:15 marquardt
// add section lines
//
// Revision 1.11 2005/02/24 16:34:52 marquardt
// remove divider lines, add section lines (unfinished)
//
// Revision 1.10 2005/02/06 07:45:42 marquardt
// fixed non-compiling IsLocalAccount
//
// Revision 1.9 2005/02/06 03:36:50 mthoma
// Added feature [Code Library 0000805]: IsLocalAccount does not work with names like serveruser.
//
// Revision 1.8 2004/10/17 21:00:15 mthoma
// cleaning
//
// Revision 1.7 2004/07/31 06:21:03 marquardt
// fixing TStringLists, adding BeginUpdate/EndUpdate, finalization improved
//
// Revision 1.6 2004/05/05 07:33:49 rrossmair
// header updated according to new policy: initial developers & contributors listed
//
// Revision 1.5 2004/04/06 04:55:17
// adapt compiler conditions, add log entry
//
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -