Creating a Local Group and Adding a User Program Example
To create a new local group, call the NetLocalGroupAdd() function. To add a user to that group, call the NetLocalGroupAddMembers() function. The following program allows you to create a user and a local group and add the user to the local group.
Create a new empty Win32 console application project. Give the project name and change the project location is needed.

Then, add the source file. Give it a name.

Then, add the following source code.
#include <windows.h>
#include <lmcons.h>
#include <lmaccess.h>
#include <lmerr.h>
#include <lmapibuf.h>
#include <stdio.h>
#include <stdlib.h>
#pragma comment(lib, netapi32.lib)
NET_API_STATUS NetSample(LPWSTR lpszDomain,LPWSTR lpszUser,LPWSTR lpszPassword,LPWSTR lpszLocalGroup)
{
USER_INFO_1 user_info;
LOCALGROUP_INFO_1 localgroup_info;
LOCALGROUP_MEMBERS_INFO_3 localgroup_members;
LPWSTR lpszPrimaryDC = NULL;
NET_API_STATUS err = 0;
DWORD parm_err = 0;
// First get the name of the primary domain controller.
// Be sure to free the returned buffer.
err = NetGetDCName(NULL, // local computer
lpszDomain, // domain name
(LPBYTE *)&lpszPrimaryDC); // returned PDC
if (err != 0)
{
wprintf(LError getting DC name, error %d\n, err);
return(err);
}
else
wprintf(L%s found!\n, lpszDomain);
// Set up the USER_INFO_1 structure.
user_info.usri1_name = lpszUser;
user_info.usri1_password = lpszPassword;
user_info.usri1_priv = USER_PRIV_USER;
user_info.usri1_home_dir = L;
user_info.usri1_comment = LSample User;
user_info.usri1_flags = UF_SCRIPT;
user_info.usri1_script_path = TEXT();
err = NetUserAdd(lpszPrimaryDC, // PDC name
1, // level
(LPBYTE) &user_info, // input buffer
&parm_err ); // parameter in error
switch (err)
{
case 0:
wprintf(LUser successfully created.\n);
break;
case NERR_UserExists:
wprintf(LUser already exists.\n);
err = 0;
break;
case ERROR_INVALID_PARAMETER:
wprintf(LInvalid parameter error adding user; parameter index = %d\n, parm_err);
NetApiBufferFree( lpszPrimaryDC );
return(err);
default:
wprintf(LError adding user: %d\n, err);
NetApiBufferFree(lpszPrimaryDC);
return(err);
}
// Set up the LOCALGROUP_INFO_1 structure.
localgroup_info.lgrpi1_name = lpszLocalGroup;
localgroup_info.lgrpi1_comment = LSample local group.;
err = NetLocalGroupAdd( lpszPrimaryDC, // PDC name
1, // level
(LPBYTE) &localgroup_info, // input buffer
&parm_err); // parameter in error
switch(err)
{
case 0:
wprintf(LLocal group successfully created.\n);
break;
case ERROR_ALIAS_EXISTS:
wprintf(LLocal group already exists.\n);
err = 0;
break;
case ERROR_INVALID_PARAMETER:
wprintf(LInvalid parameter error adding local group; parameter index = %d\n, err, parm_err);
NetApiBufferFree(lpszPrimaryDC);
return(err);
default:
wprintf(LError adding local group: %d\n, err);
NetApiBufferFree( lpszPrimaryDC );
return( err );
}
// Now add the user to the local group.
localgroup_members.lgrmi3_domainandname = lpszUser;
err = NetLocalGroupAddMembers(lpszPrimaryDC, // PDC name
lpszLocalGroup, // group name
3, // name
(LPBYTE) &localgroup_members, // buffer
1); // count
switch (err)
{
case 0:
wprintf(LUser successfully added to local group.\n);
break;
case ERROR_MEMBER_IN_ALIAS:
wprintf(LUser already in local group.\n);
err = 0;
break;
default:
wprintf(LError adding user to local group: %d\n, err);
break;
}
NetApiBufferFree(lpszPrimaryDC);
return(err);
}
int wmain(int cArgs, char * pArgs[])
{
NET_API_STATUS err = 0;
wprintf(LCalling NetSample...\n);
// Change the following info accordingly...
err = NetSample(LSampleDomainName,LSampleUserName,LSampleUserPswd,LSampleLocalGroup);
wprintf(LNetSample returned %d\n, err);
return(0);
}
Build and run the project. The following screenshot is a sample output. This program must be run in the domain based network.
