Platform SDK: Network Management |
Windows NT/Windows 2000 and Windows NT Server/Windows 2000 Server use the same functions that Microsoft LAN Manager uses to create and maintain user and local group-account information. A member of a Users group can create, maintain, and delete accounts in local groups. For 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.
#define UNICODE 1 #include <windows.h> #include <lmcons.h> #include <lmaccess.h> #include <lmerr.h> #include <lmapibuf.h> #include <stdio.h> #include <stdlib.h> int _CRTAPI1 main( int cArgs, char *pArgs[] ); 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 machine lpszDomain, // Domain name (LPBYTE *)&lpszPrimaryDC ); // Returned PDC if ( err != 0 ) { printf( "Error getting DC name: %d\n", 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("Sample 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: printf("user successfully created.\n"); break; case NERR_UserExists: printf("user already exists.\n"); err = 0; break; case ERROR_INVALID_PARAMETER: printf("Invalid Parameter Error adding user: Parameter Index = %d\n", parm_err); NetApiBufferFree( lpszPrimaryDC ); return( err ); default: printf("Error 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 = TEXT("Sample Local group."); err = NetLocalGroupAdd( lpszPrimaryDC, // PDC name 1, // Level (LPBYTE)&localgroup_info, // Input buffer &parm_err ); // Parameter in error switch ( err ) { case 0: printf("Local Group successfully created.\n"); break; case ERROR_ALIAS_EXISTS: printf("Local Group already exists.\n"); err = 0; break; case ERROR_INVALID_PARAMETER: printf("Invalid Parameter Error adding Local Group: Parameter Index = %d\n", err, parm_err); NetApiBufferFree( lpszPrimaryDC ); return( err ); default: printf("Error 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: printf("User successfully added to Local Group.\n"); break; case ERROR_MEMBER_IN_ALIAS: printf("User already in Local Group.\n"); err = 0; break; default: printf("Error adding User to Local Group: %d\n", err); break; } NetApiBufferFree( lpszPrimaryDC ); return( err ); } int _CRTAPI1 main( int cArgs, char * pArgs[] ) { NET_API_STATUS err = 0; printf( "Calling NetSample.\n" ); err = NetSample( TEXT("SampleDomain"), TEXT("SampleUser"), TEXT("SamplePswd"), TEXT("SampleLG") ); printf( "NetSample returned %d\n", err ); return( 0 ); }