Here is my example creating an account in Windows. If You want to add this account to local users so You could log on current machine it is necessary to call NetLocalGroupAddMembers function. As a local group name You should type just "Users", but it varies on the language version of Windows. On polish version it would be "Użytkownicy" and etc.
If You want to add an account on a remote server then it needed to call NetGetDCName and ass first parameter give it server address. Then use PDC in other functions in this example.
REMEMBER to run this code as Administrator(even IDE if in debug) or You will have access denied error.
#ifndef UNICODE
#define UNICODE
#endif
#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;
// Get the name of the primary domain controller.
// Be sure to free the returned buffer.
// On local machine we don t need to do this
//err = NetGetDCName( NULL, // local computer
// NULL, // domain name
// (LPBYTE *) &lpszPrimaryDC ); // returned PDC
//if ( err != 0 )
//{
// printf( "Error getting DC name: %d
", err );
// return( err );
//}
// 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 = TEXT("");
user_info.usri1_comment = TEXT("");
user_info.usri1_flags = UF_SCRIPT;
user_info.usri1_script_path = TEXT("");
//err = NetUserDel(NULL, L"NowyUse2r"); this will delete user
err = NetUserAdd( NULL/*lpszPrimaryDC*/, // PDC name
1, // level
(LPBYTE) &user_info, // input buffer
&parm_err ); // parameter in error
switch ( err )
{
case 0:
printf("User successfully created.
");
break;
case NERR_UserExists:
printf("User already exists.
");
err = 0;
break;
case ERROR_INVALID_PARAMETER:
printf("Invalid parameter error adding user; parameter index = %d
",
parm_err);
NetApiBufferFree( lpszPrimaryDC );
return( err );
case ERROR_ACCESS_DENIED:
printf("ERROR_ACCESS_DENIED; parameter index = %d
",
parm_err);
NetApiBufferFree( lpszPrimaryDC );
return( err );
default:
printf("Error adding user: %d
", err);
NetApiBufferFree( lpszPrimaryDC );
return( err );
}
// Set up the LOCALGROUP_INFO_1 structure.
localgroup_info.lgrpi1_name = lpszLocalGroup;
localgroup_info.lgrpi1_comment = TEXT("Sample local group.");
err = NetLocalGroupAdd( NULL, // PDC name
1, // level
(LPBYTE) &localgroup_info, // input buffer
&parm_err ); // parameter in error
switch ( err )
{
case 0:
printf("Local group successfully created.
");
break;
case ERROR_ALIAS_EXISTS:
printf("Local group already exists.
");
err = 0;
break;
case ERROR_INVALID_PARAMETER:
printf("Invalid parameter error adding local group; parameter index = %d
",
err, parm_err);
NetApiBufferFree( lpszPrimaryDC );
//return( err );
default:
printf("Error adding local group: %d
", err);
NetApiBufferFree( lpszPrimaryDC );
//return( err );
}
// Now add the user to the local group.
localgroup_members.lgrmi3_domainandname = lpszUser;
err = NetLocalGroupAddMembers( NULL, // PDC name
lpszLocalGroup, // group name
3, // name
(LPBYTE) &localgroup_members, // buffer
1 ); // count
switch ( err )
{
case 0:
printf("User successfully added to local group.
");
break;
case ERROR_MEMBER_IN_ALIAS:
printf("User already in local group.
");
err = 0;
break;
default:
printf("Error adding user to local group: %d
", err);
break;
}
NetApiBufferFree( lpszPrimaryDC );
return( err );
}
int main()
{
NET_API_STATUS err = 0;
printf( "Calling NetSample.
" );
err = NetSample( L"",
L"NewUser",
L"SamplePswd",
L"Users" );
printf( "NetSample returned %d
", err );
return( 0 );
}