can anyone tell me how can I (programatically) add the current/selected user to a group (like power user, backup opetarors)
any function/info/code is welcomed
Here you an example using the Jedi JCL
program Delphi_AdduserToGroup;
{$APPTYPE CONSOLE}
uses
Windows,
JclWin32,
SysUtils;
Procedure AddUsertoGroup(aUser,aGroup:PWideChar);
var
GroupMembersInfo : PLocalGroupMembersInfo3;
ResInt : Integer;
begin
GetMem(GroupMembersInfo,sizeof(TLocalGroupMembersInfo3));
try
//Writeln(aUser+'->'+aGroup);
GroupMembersInfo^.lgrmi3_domainandname :=aUser;
ResInt:=NetLocalGroupAddMembers(nil,aGroup,3,pointer(GroupMembersInfo),1);
case ResInt of
NERR_Success : Writeln('User added to group '+aGroup);
ERROR_ACCESS_DENIED : Writeln('The user does not have access to the requested information.');
ERROR_NO_SUCH_MEMBER : Writeln('One or more of the members specified do not exist. Therefore, no new members were added.');
ERROR_MEMBER_IN_ALIAS: Writeln('One or more of the members specified were already members of the local group. No new members were added.');
ERROR_INVALID_MEMBER : Writeln('One or more of the members cannot be added because their account type is invalid. No new members were added.');
else
Writeln('Error '+IntToStr(ResInt));
end;
finally
FreeMem(GroupMembersInfo);
end;
end;
begin
try
AddUsertoGroup('myuser','Administrators');
Readln;
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
end.
Bye.
You can use the NetLocalGroupAddMembers function in the Windows API.
The JEDI API Library includes a Lan Manager Access API interface Unit, for use with Delphi.
Well if all you want to do is add a user to a local group then you want the NetLocalGroupAddMembers API (to do it in C anyway).
As a simple example:
LOCALGROUP_MEMBERS_INFO_3 member[1];
// Add using fully qualified name, could also use SID with LOCALGROUP_MEMBERS_INFO_0
member[0].lgrmi3_domainandname = L"MAIN\\username";
status = NetLocalGroupAddMembers(NULL, L"Power Users", 3, (LPBYTE)member, 1);
The group name is just the textual name of the group on the system which you can determine programatically using something like:
PLOCALGROUP_INFO_0 groups = NULL;
DWORD dwCount = 0;
DWORD dwTotalCount = 0;
NET_API_STATUS status = NetLocalGroupEnum(NULL, 0, (LPBYTE*)&groups, MAX_PREFERRED_LENGTH, &dwCount, &dwTotalCount, NULL);
if(status == NERR_Success)
{
for(DWORD i = 0; i < dwCount; i++)
{
printf("%ls\n", groups[i].lgrpi0_name);
}
NetApiBufferFree(groups);
}
else
{
printf("Error %d\n", status);
}
Adding to global group you will need to instead use the NetGroupAddUser API.