Forcing a User to Change the Logon Password Program Example
This code sample demonstrates how to force a user to change the logon password on the next logon using the NetUserGetInfo() and NetUserSetInfo() functions and the USER_INFO_3 structure. Note that starting with Windows XP, it is recommended that you use the USER_INFO_4 structure instead. Set the usri3_password_expired member of the USER_INFO_3 structure to a nonzero value using the following code example.
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>
// INCL_NET includes all LAN Manager headers if necessary
// #define INCL_NET
#include <stdio.h>
#include <lm.h>
// Use #pragma if you do not include the library in the VS project setting
#pragma comment(lib, netapi32.lib)
// This is just a local user for testing. Change accordingly...
#define USERNAME Lmike spoon
#define SERVER L\\\\nazuri
int wmain(void)
{
PUSER_INFO_3 pUsr = NULL;
NET_API_STATUS netRet = 0;
DWORD dwParmError = 0;
// First, retrieve the user information at level 3. This is
// necessary to prevent resetting other user information when the NetUserSetInfo call is made.
netRet = NetUserGetInfo(SERVER, USERNAME, 3, (LPBYTE *)&pUsr);
if(netRet == NERR_Success)
{
wprintf(LNetUserGetInfo() is OK, return values is %d\n, netRet);
// The function was successful; set the usri3_password_expired value to
// a nonzero value. Call the NetUserSetInfo() function.
pUsr->usri3_password_expired = TRUE;
netRet = NetUserSetInfo( SERVER, USERNAME, 3, (LPBYTE)pUsr, &dwParmError);
// A zero return indicates success.
// If the return value is ERROR_INVALID_PARAMETER,
// the dwParmError parameter will contain a value indicating the
// invalid parameter within the user_info_3 structure. These values are defined in the lmaccess.h file.
if(netRet == NERR_Success)
wprintf(LYou %s will need to change password at next logon!\n, USERNAME);
else
wprintf(LError %d occurred. Parm Error %d returned.\n, netRet, dwParmError);
// Must free the buffer returned by NetUserGetInfo().
NetApiBufferFree(pUsr);
}
else
wprintf(LNetUserGetInfo() failed, error %d\n, netRet);
return 0;
}
Build and run the project. The following screenshot is a sample output.
