Option Explicit
Private Const ERROR_SUCCESS As Long = 0
Private Type USER_INFO_3
usri3_name As Long
usri3_password As Long
usri3_password_age As Long
usri3_priv As Long
usri3_home_dir As Long
usri3_comment As Long
usri3_flags As Long
usri3_script_path As Long
usri3_auth_flags As Long
usri3_full_name As Long
usri3_usr_comment As Long
usri3_parms As Long
usri3_workstations As Long
usri3_last_logon As Long
usri3_last_logoff As Long
usri3_acct_expires As Long
usri3_max_storage As Long
usri3_units_per_week As Long
usri3_logon_hours As Long
usri3_bad_pw_count As Long
usri3_num_logons As Long
usri3_logon_server As Long
usri3_country_code As Long
usri3_code_page As Long
usri3_user_id As Long
usri3_primary_group_id As Long
usri3_profile As Long
usri3_home_dir_drive As Long
usri3_password_expired As Long
End Type
Private Declare Function NetUserGetInfo Lib "Netapi32" _
(servername As Byte, username As Byte, _
ByVal level As Long, bufptr As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(pTo As Any, uFrom As Any, ByVal lSize As Long)
Private Sub Command1_Click()
Dim success As Long
Dim buff As Long
Dim bServer() As Byte
Dim bUser() As Byte
Dim ui3 As USER_INFO_3
Dim lPwdDaysSoFar As Long
bUser = "validuser" & vbNullChar '<<--- provide valid user
bServer = "\\some.domain.info" & vbNullChar '<<--- provide valid domain
'retrieve the user info into a buffer
success = NetUserGetInfo(bServer(0), bUser(0), 3, buff)
If success = ERROR_SUCCESS Then
'copy it to a USER_INFO_3 structure
CopyMemory ui3, ByVal buff, Len(ui3)
Debug.Print ui3.usri3_acct_expires 'true/false
Debug.Print ui3.usri3_password_expired 'true/false
Debug.Print ui3.usri3_password_age 'long (most probably seconds ellapsed since the last change)
lPwdDaysSoFar = ui3.usri3_password_age \ 86400
Debug.Print "Days since pwd last changed: " & lPwdDaysSoFar
End If
End Sub