急,解决了就给分 在Edit1中输入系统的某个存在的用户(如xxx),在Edit2中输入系统的一个组名(如users),将该用户从现有的隶属的组中去掉,加入到Edit2输入中的组中去。也就是调用windows的系统功能 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你的要求分几步, 1,找到当前的用户所属的 group2, 从当前的 group删除3, 加到指定的 group关键用到如下的几个api:NET_API_STATUS NetGroupDel( LPCWSTR servername, LPCWSTR groupname);NET_API_STATUS NetGroupAddUser( LPCWSTR servername, LPCWSTR GroupName, LPCWSTR username);NET_API_STATUS NetUserGetInfo( LPCWSTR servername, LPCWSTR username, DWORD level, LPBYTE* bufptr);可参考这里:http://www.koders.com/delphi/fidEA41D1B6A7C8E0E82C6F8FD1BAE5CD3572A31F83.aspx unit JclLANMan;{$I jcl.inc}{$WEAKPACKAGEUNIT ON}interfaceuses Windows, Classes;//------------------------------------------------------------------------------// User Management//------------------------------------------------------------------------------type TNetUserFlag = (ufAccountDisable, ufHomedirRequired, ufLockout, ufPasswordNotRequired, ufPasswordCantChange, ufDontExpirePassword, ufMNSLogonAccount); TNetUserFlags = set of TNetUserFlag; TNetUserInfoFlag = (uifScript, uifTempDuplicateAccount, uifNormalAccount, uifInterdomainTrustAccount, uifWorkstationTrustAccount, uifServerTrustAccount); TNetUserInfoFlags = set of TNetUserInfoFlag; TNetUserPriv = (upUnknown, upGuest, upUser, upAdmin); TNetUserAuthFlag = (afOpPrint, afOpComm, afOpServer, afOpAccounts); TNetUserAuthFlags = set of TNetUserAuthFlag; TNetWellKnownRID = (wkrAdmins, wkrUsers, wkrGuests, wkrPowerUsers, wkrBackupOPs, wkrReplicator, wkrEveryone);function CreateAccount(const Server, Username, Fullname, Password, Description, Homedir, Script: string; const PasswordNeverExpires: Boolean {$IFDEF SUPPORTS_DEFAULTPARAMS} = True {$ENDIF}): Boolean;function CreateLocalAccount(const Username, Fullname, Password, Description, Homedir, Script: string; const PasswordNeverExpires: Boolean {$IFDEF SUPPORTS_DEFAULTPARAMS} = True {$ENDIF}): Boolean;function DeleteAccount(const Servername, Username: string): Boolean;function DeleteLocalAccount(Username: string): Boolean;function CreateLocalGroup(const Server, Groupname, Description: string): Boolean;function CreateGlobalGroup(const Server, Groupname, Description: string): Boolean;function DeleteLocalGroup(const Server, Groupname: string): Boolean;function GetLocalGroups(const Server: string; const Groups: TStrings): Boolean;function GetGlobalGroups(const Server: string; const Groups: TStrings): Boolean;function LocalGroupExists(const Group: string): Boolean;function GlobalGroupExists(const Server, Group: string): Boolean;function AddAccountToLocalGroup(const Accountname, Groupname: string): Boolean;function LookupGroupName(const Server: string; const RID: TNetWellKnownRID): string;procedure ParseAccountName(const QualifiedName: string; var Domain, UserName: string);function IsLocalAccount(const AccountName: string): Boolean;implementationuses SysUtils, LM, JclBase, JclStrings, JclWin32;//------------------------------------------------------------------------------// User Management//------------------------------------------------------------------------------function CreateAccount(const Server, Username, Fullname, Password, Description, Homedir, Script: string; const PasswordNeverExpires: Boolean): Boolean;var wServer, wUsername, wFullname, wPassword, wDescription, wHomedir, wScript: WideString; Details: USER_INFO_2; Err: NET_API_STATUS; ParmErr: DWORD;begin wServer := Server; wUsername := Username; wFullname := Fullname; wPassword := Password; wDescription := Description; wScript := Script; wHomedir := Homedir; FillChar (Details, SizeOf(Details), 0); with Details do begin usri2_name := PWideChar(wUsername); usri2_full_name := PWideChar(wFullname); usri2_password := PWideChar(wPassword); usri2_comment := PWideChar(wDescription); usri2_priv := USER_PRIV_USER; usri2_flags := UF_SCRIPT; if PassWordNeverExpires then usri2_flags := usri2_flags or UF_DONT_EXPIRE_PASSWD; usri2_script_path := PWideChar(wScript); usri2_home_dir := PWideChar(wHomedir); usri2_acct_expires := TIMEQ_FOREVER; end; Err := NetUserAdd(PWideChar(wServer), 2, @Details, @ParmErr); Result := (Err = NERR_SUCCESS);end;//------------------------------------------------------------------------------function CreateLocalAccount(const Username, Fullname, Password, Description, Homedir, Script: string; const PasswordNeverExpires: Boolean): Boolean;begin Result := CreateAccount('', Username, Fullname, Password, Description, Homedir, Script, PassWordNeverExpires);end;//------------------------------------------------------------------------------function DeleteAccount(const Servername, Username: string): Boolean;var wServername, wUsername: WideString; Err: NET_API_STATUS;begin wServername := Servername; wUsername := Username; Err := NetUserDel(PWideChar(wServername), PWideChar(wUsername)); Result := (Err = NERR_SUCCESS);end;//------------------------------------------------------------------------------function DeleteLocalAccount(Username: string): Boolean;begin Result := DeleteAccount('', Username);end;//------------------------------------------------------------------------------function CreateGlobalGroup(const Server, Groupname, Description: string): Boolean;var wServer, wGroupname, wDescription: WideString; Details: GROUP_INFO_1; Err: NET_API_STATUS; ParmErr: DWORD;begin wServer := Server; wGroupname := Groupname; wDescription := Description; FillChar (Details, SizeOf(Details), 0); Details.grpi1_name := PWideChar(wGroupName); Details.grpi1_comment := PWideChar(wDescription); Err := NetGroupAdd(PWideChar(wServer), 1, @Details, @ParmErr); Result := (Err = NERR_SUCCESS);end;//------------------------------------------------------------------------------function CreateLocalGroup(const Server, Groupname, Description: string): Boolean;var wServer, wGroupname, wDescription: WideString; Details: LOCALGROUP_INFO_1; Err: NET_API_STATUS; ParmErr: DWORD;begin wServer := Server; wGroupname := Groupname; wDescription := Description; FillChar (Details, SizeOf(Details), 0); Details.lgrpi1_name := PWideChar(wGroupName); Details.lgrpi1_comment := PWideChar(wDescription); Err := NetLocalGroupAdd(PWideChar(wServer), 1, @Details, @ParmErr); Result := (Err = NERR_SUCCESS);end;//------------------------------------------------------------------------------function DeleteLocalGroup(const Server, Groupname: string): Boolean;var wServername, wUsername: WideString; Err: NET_API_STATUS;begin wServername := Server; wUsername := Groupname; Err := NetLocalGroupDel(PWideChar(wServername), PWideChar(wUsername)); Result := (Err = NERR_SUCCESS);end;//------------------------------------------------------------------------------function GetLocalGroups(const Server: string; const Groups: TStrings): Boolean;var Err: NET_API_STATUS; wServername: WideString; Buffer: Pointer; Details: PLocalGroupInfo0; EntriesRead, TotalEntries: Cardinal; I: Integer;begin wServername := Server; Err := NetLocalGroupEnum(PWideChar(wServername), 0, Buffer, MAX_PREFERRED_LENGTH, EntriesRead, TotalEntries, nil); if Err = NERR_SUCCESS then begin Details := PLocalGroupInfo0(Buffer); for I := 0 to EntriesRead - 1 do begin Groups.Add(Details^.lgrpi0_name); Inc(Details); end; end; NetApiBufferFree(@Details); Result := (Err = NERR_SUCCESS);end; function GetGlobalGroups(const Server: string; const Groups: TStrings): Boolean;var Err: NET_API_STATUS; wServername: WideString; Buffer: Pointer; Details: PGroupInfo0; EntriesRead, TotalEntries: Cardinal; I: Integer;begin wServername := Server; Err := NetGroupEnum(PWideChar(wServername), 0, Buffer, MAX_PREFERRED_LENGTH, EntriesRead, TotalEntries, nil); if Err = NERR_SUCCESS then begin Details := PGroupInfo0(Buffer); if (EntriesRead <> 1) or (Details^.grpi0_name <> 'None') then for I := 0 to EntriesRead - 1 do begin Groups.Add(Details^.grpi0_name); Inc(Details); end; end else RaiseLastOSError; NetApiBufferFree(@Details); Result := (Err = NERR_SUCCESS);end;//------------------------------------------------------------------------------function LocalGroupExists(const Group: string): Boolean;var Groups: TStrings;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: TStrings;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 := NetGroupDel(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 := NetLocalGroupAddMembers(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: TStrings;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;begin ParseAccountName(AccountName, Domain, Username); Result := (Domain = '');end;end. delphi 怎么把两个。MPG 合成一个? 在delphi中能否调用SQL Server的DTS包进行数据的导入和导出 delet键,和backspace键 的ANSCII码是多少?在线急等 线程同步问题 我想联系《深入Delphi6网络编程》一书的作者静海,有人有他的email吗? 如何定义自己的数据感知控件 如何打印printdbgrideh总页数 如何实现FTP整目录上传下载等操作?如何做出类似DreamWeaver站点管理那样的窗口? 如何在NT服务器中装两块网卡!! Ado的怪问题 怎么实现监听一个端口?像WPE那个样子的 一个关于连接access数据库小问题!
1,找到当前的用户所属的 group
2, 从当前的 group删除
3, 加到指定的 group关键用到如下的几个api:
NET_API_STATUS NetGroupDel(
LPCWSTR servername,
LPCWSTR groupname
);NET_API_STATUS NetGroupAddUser(
LPCWSTR servername,
LPCWSTR GroupName,
LPCWSTR username
);NET_API_STATUS NetUserGetInfo(
LPCWSTR servername,
LPCWSTR username,
DWORD level,
LPBYTE* bufptr
);可参考这里:
http://www.koders.com/delphi/fidEA41D1B6A7C8E0E82C6F8FD1BAE5CD3572A31F83.aspx
Windows, Classes;//------------------------------------------------------------------------------
// User Management
//------------------------------------------------------------------------------type
TNetUserFlag = (ufAccountDisable, ufHomedirRequired, ufLockout,
ufPasswordNotRequired, ufPasswordCantChange, ufDontExpirePassword,
ufMNSLogonAccount);
TNetUserFlags = set of TNetUserFlag;
TNetUserInfoFlag = (uifScript, uifTempDuplicateAccount, uifNormalAccount,
uifInterdomainTrustAccount, uifWorkstationTrustAccount, uifServerTrustAccount);
TNetUserInfoFlags = set of TNetUserInfoFlag;
TNetUserPriv = (upUnknown, upGuest, upUser, upAdmin);
TNetUserAuthFlag = (afOpPrint, afOpComm, afOpServer, afOpAccounts);
TNetUserAuthFlags = set of TNetUserAuthFlag;
TNetWellKnownRID = (wkrAdmins, wkrUsers, wkrGuests, wkrPowerUsers, wkrBackupOPs,
wkrReplicator, wkrEveryone);function CreateAccount(const Server, Username, Fullname, Password, Description,
Homedir, Script: string;
const PasswordNeverExpires: Boolean {$IFDEF SUPPORTS_DEFAULTPARAMS} = True {$ENDIF}): Boolean;
function CreateLocalAccount(const Username, Fullname, Password, Description,
Homedir, Script: string;
const PasswordNeverExpires: Boolean {$IFDEF SUPPORTS_DEFAULTPARAMS} = True {$ENDIF}): Boolean;
function DeleteAccount(const Servername, Username: string): Boolean;
function DeleteLocalAccount(Username: string): Boolean;
function CreateLocalGroup(const Server, Groupname, Description: string): Boolean;
function CreateGlobalGroup(const Server, Groupname, Description: string): Boolean;
function DeleteLocalGroup(const Server, Groupname: string): Boolean;function GetLocalGroups(const Server: string; const Groups: TStrings): Boolean;
function GetGlobalGroups(const Server: string; const Groups: TStrings): Boolean;
function LocalGroupExists(const Group: string): Boolean;
function GlobalGroupExists(const Server, Group: string): Boolean;function AddAccountToLocalGroup(const Accountname, Groupname: string): Boolean;
function LookupGroupName(const Server: string; const RID: TNetWellKnownRID): string;
procedure ParseAccountName(const QualifiedName: string; var Domain, UserName: string);
function IsLocalAccount(const AccountName: string): Boolean;implementationuses
SysUtils,
LM, JclBase, JclStrings, JclWin32;//------------------------------------------------------------------------------
// User Management
//------------------------------------------------------------------------------function CreateAccount(const Server, Username, Fullname, Password, Description,
Homedir, Script: string; const PasswordNeverExpires: Boolean): Boolean;
var
wServer, wUsername, wFullname,
wPassword, wDescription, wHomedir, wScript: WideString;
Details: USER_INFO_2;
Err: NET_API_STATUS;
ParmErr: DWORD;
begin
wServer := Server;
wUsername := Username;
wFullname := Fullname;
wPassword := Password;
wDescription := Description;
wScript := Script;
wHomedir := Homedir; FillChar (Details, SizeOf(Details), 0);
with Details do
begin
usri2_name := PWideChar(wUsername);
usri2_full_name := PWideChar(wFullname);
usri2_password := PWideChar(wPassword);
usri2_comment := PWideChar(wDescription);
usri2_priv := USER_PRIV_USER;
usri2_flags := UF_SCRIPT;
if PassWordNeverExpires then
usri2_flags := usri2_flags or UF_DONT_EXPIRE_PASSWD;
usri2_script_path := PWideChar(wScript);
usri2_home_dir := PWideChar(wHomedir);
usri2_acct_expires := TIMEQ_FOREVER;
end; Err := NetUserAdd(PWideChar(wServer), 2, @Details, @ParmErr);
Result := (Err = NERR_SUCCESS);
end;//------------------------------------------------------------------------------function CreateLocalAccount(const Username, Fullname, Password, Description,
Homedir, Script: string; const PasswordNeverExpires: Boolean): Boolean;
begin
Result := CreateAccount('', Username, Fullname, Password, Description, Homedir,
Script, PassWordNeverExpires);
end;//------------------------------------------------------------------------------function DeleteAccount(const Servername, Username: string): Boolean;
var
wServername, wUsername: WideString;
Err: NET_API_STATUS;
begin
wServername := Servername;
wUsername := Username;
Err := NetUserDel(PWideChar(wServername), PWideChar(wUsername));
Result := (Err = NERR_SUCCESS);
end;//------------------------------------------------------------------------------function DeleteLocalAccount(Username: string): Boolean;
begin
Result := DeleteAccount('', Username);
end;//------------------------------------------------------------------------------function CreateGlobalGroup(const Server, Groupname, Description: string): Boolean;
var
wServer, wGroupname, wDescription: WideString;
Details: GROUP_INFO_1;
Err: NET_API_STATUS;
ParmErr: DWORD;
begin
wServer := Server;
wGroupname := Groupname;
wDescription := Description; FillChar (Details, SizeOf(Details), 0);
Details.grpi1_name := PWideChar(wGroupName);
Details.grpi1_comment := PWideChar(wDescription); Err := NetGroupAdd(PWideChar(wServer), 1, @Details, @ParmErr);
Result := (Err = NERR_SUCCESS);
end;//------------------------------------------------------------------------------function CreateLocalGroup(const Server, Groupname, Description: string): Boolean;
var
wServer, wGroupname, wDescription: WideString;
Details: LOCALGROUP_INFO_1;
Err: NET_API_STATUS;
ParmErr: DWORD;
begin
wServer := Server;
wGroupname := Groupname;
wDescription := Description; FillChar (Details, SizeOf(Details), 0);
Details.lgrpi1_name := PWideChar(wGroupName);
Details.lgrpi1_comment := PWideChar(wDescription); Err := NetLocalGroupAdd(PWideChar(wServer), 1, @Details, @ParmErr);
Result := (Err = NERR_SUCCESS);
end;//------------------------------------------------------------------------------function DeleteLocalGroup(const Server, Groupname: string): Boolean;
var
wServername, wUsername: WideString;
Err: NET_API_STATUS;
begin
wServername := Server;
wUsername := Groupname;
Err := NetLocalGroupDel(PWideChar(wServername), PWideChar(wUsername));
Result := (Err = NERR_SUCCESS);
end;//------------------------------------------------------------------------------function GetLocalGroups(const Server: string; const Groups: TStrings): Boolean;
var
Err: NET_API_STATUS;
wServername: WideString;
Buffer: Pointer;
Details: PLocalGroupInfo0;
EntriesRead, TotalEntries: Cardinal;
I: Integer;
begin
wServername := Server;
Err := NetLocalGroupEnum(PWideChar(wServername), 0, Buffer, MAX_PREFERRED_LENGTH,
EntriesRead, TotalEntries, nil); if Err = NERR_SUCCESS then
begin
Details := PLocalGroupInfo0(Buffer);
for I := 0 to EntriesRead - 1 do
begin
Groups.Add(Details^.lgrpi0_name);
Inc(Details);
end;
end; NetApiBufferFree(@Details);
Result := (Err = NERR_SUCCESS);
end;
var
Err: NET_API_STATUS;
wServername: WideString;
Buffer: Pointer;
Details: PGroupInfo0;
EntriesRead, TotalEntries: Cardinal;
I: Integer;
begin
wServername := Server;
Err := NetGroupEnum(PWideChar(wServername), 0, Buffer, MAX_PREFERRED_LENGTH,
EntriesRead, TotalEntries, nil); if Err = NERR_SUCCESS then
begin
Details := PGroupInfo0(Buffer);
if (EntriesRead <> 1) or (Details^.grpi0_name <> 'None') then
for I := 0 to EntriesRead - 1 do
begin
Groups.Add(Details^.grpi0_name);
Inc(Details);
end;
end
else
RaiseLastOSError; NetApiBufferFree(@Details);
Result := (Err = NERR_SUCCESS);
end;//------------------------------------------------------------------------------function LocalGroupExists(const Group: string): Boolean;
var
Groups: TStrings;
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: TStrings;
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 := NetGroupDel(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 := NetLocalGroupAddMembers(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: TStrings;
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;
begin
ParseAccountName(AccountName, Domain, Username);
Result := (Domain = '');
end;end.