-
July 15th, 2010, 07:45 AM
#1
Why doesn't the flag UF_PASSWORD_EXPIRED get set?
Hello everyone!
We have a good way to change attributes in windows-accounts:
using the function: NetUserSetInfo.
This is article on MSDN-protal is about its issue: http://msdn.microsoft.com/en-us/libr...(v=VS.85).aspx
That to change attributes we can use the structure USER_INFO_1008.
And I find it very cool, that the example in its arcticle uses this structure.
The example code changes the attribute UF_ACCOUNTDISABLE - it works very fine.
But I want to change another attribute: UF_PASSWORD_EXPIRED - it works very bad. I can't change this flag =(
If after setting this flag I call the NetUserGetInfo(), the account does not get this flag set.
But I set "password expired" in windows snap-in (means: the password must be changed in the next logon):
After calling NetUserGetInfo() I can see that the account has this flag.
Why doesn't it work?
I have made the evident code, below (MS VS2005, cmd-appl):
Code:
#include "stdafx.h"
#include "windows.h"
#include "atlstr.h"
#include <lm.h>
#include <iostream>
#include "conio.h"
#pragma comment(lib, "Wldap32.lib")
#pragma comment(lib, "netapi32.lib")
using namespace std;
CString GetStrFlags(DWORD nflags);
void PrintUsers();
CString Input(CString str);
void PrintFlagsUser(CString sName);
int _tmain(int argc, _TCHAR* argv[])
{
CString sName;
PrintUsers();
sName = Input(L"Input name ->");
PrintFlagsUser(sName);
CString m_sServerName = getenv("COMPUTERNAME");
DWORD dwLevel = 1008;
USER_INFO_1008 ui;
NET_API_STATUS nStatus;
ui.usri1008_flags = UF_PASSWORD_EXPIRED | UF_SCRIPT;
nStatus = NetUserSetInfo(m_sServerName, sName, dwLevel, (LPBYTE)&ui, NULL);
if (nStatus == NERR_Success)
{
fwprintf(stderr, L"Operation complеte:\n", sName);
PrintFlagsUser(sName);
} else wprintf(L"A system error has occurred: %d\n", nStatus);
return 0;
}
CString GetStrFlags(DWORD nflags)
{
CString str;
str.Format(L"flag: %d\n",nflags);
if(nflags&UF_SCRIPT) str += L"UF_SCRIPT\n";
if(nflags&UF_ACCOUNTDISABLE) str += L"UF_ACCOUNTDISABLE\n";
if(nflags&UF_HOMEDIR_REQUIRED) str += L"UF_HOMEDIR_REQUIRED\n";
if(nflags&UF_PASSWD_NOTREQD) str += L"UF_PASSWD_NOTREQD\n";
if(nflags&UF_PASSWD_CANT_CHANGE) str += L"UF_PASSWD_CANT_CHANGE\n";
if(nflags&UF_LOCKOUT) str += L"UF_LOCKOUT\n";
if(nflags&UF_DONT_EXPIRE_PASSWD) str += L"UF_DONT_EXPIRE_PASSWD\n";
if(nflags&UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED) str += L"UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED\n";
if(nflags&UF_NOT_DELEGATED) str += L"UF_NOT_DELEGATED\n";
if(nflags&UF_SMARTCARD_REQUIRED) str += L"UF_SMARTCARD_REQUIRED\n";
if(nflags&UF_USE_DES_KEY_ONLY) str += L"UF_USE_DES_KEY_ONLY\n";
if(nflags&UF_DONT_REQUIRE_PREAUTH) str += L"UF_DONT_REQUIRE_PREAUTH\n";
if(nflags&UF_TRUSTED_FOR_DELEGATION) str += L"UF_TRUSTED_FOR_DELEGATION\n";
if(nflags&UF_PASSWORD_EXPIRED) str += L"UF_PASSWORD_EXPIRED\n";
if(nflags&UF_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION) str += L"UF_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION\n";
if(nflags&UF_NORMAL_ACCOUNT) str += L"UF_NORMAL_ACCOUNT\n";
if(nflags&UF_TEMP_DUPLICATE_ACCOUNT) str += L"UF_TEMP_DUPLICATE_ACCOUNT\n";
if(nflags&UF_WORKSTATION_TRUST_ACCOUNT) str += L"UF_WORKSTATION_TRUST_ACCOUNT\n";
if(nflags&UF_SERVER_TRUST_ACCOUNT) str += L"UF_SERVER_TRUST_ACCOUNT\n";
if(nflags&UF_INTERDOMAIN_TRUST_ACCOUNT) str += L"UF_INTERDOMAIN_TRUST_ACCOUNT\n";
return str;
};
void PrintUsers()
{
CString m_sServerName = getenv("COMPUTERNAME");
CString sOutStr;
DWORD entries_read;
DWORD total_entries;
NET_API_STATUS ret_status;
USER_INFO_0 *ui=NULL;
ret_status = NetUserEnum(m_sServerName,0,FILTER_NORMAL_ACCOUNT,(LPBYTE*)&ui,MAX_PREFERRED_LENGTH, &entries_read,&total_entries,NULL);
switch(ret_status)
{
case NERR_Success: sOutStr=L"NERR_Success"; break;
case ERROR_ACCESS_DENIED: sOutStr=L"ERROR_ACCESS_DENIED"; break;
case NERR_InvalidComputer: sOutStr=L"NERR_InvalidComputer"; break;
case ERROR_MORE_DATA: sOutStr=L"ERROR_MORE_DATA"; break;
default: sOutStr=L"NetUserEnum";
}
wprintf(L"\n%s\n",sOutStr.GetBuffer());
if(ret_status==NERR_Success)
{
sOutStr.Format(L"Number of accounts: %d of %d\n\n",entries_read, total_entries);
for(int i = 0; i < entries_read; i++)
{
if(ui[i].usri0_name)
{
sOutStr += ui[i].usri0_name;
sOutStr += L"\n";
}
}
}
wprintf(L"\n%s\n",sOutStr.GetBuffer());
};
CString Input(CString str)
{
char buf[250];
wprintf(str.GetBuffer());
cin >> buf;
return buf;
}
void PrintFlagsUser(CString sName)
{
CString sOutStr;
CString m_sServerName = getenv("COMPUTERNAME");
USER_INFO_1 *ui;
NET_API_STATUS ret_status;
ret_status = NetUserGetInfo(m_sServerName,sName,1,(LPBYTE*)&ui);
if(!ret_status)
{
sOutStr=GetStrFlags(ui->usri1_flags);
wprintf(L"\n%s\n",sOutStr.GetBuffer());
}
}
-
July 16th, 2010, 02:35 AM
#2
Re: Why doesn't the flag UF_PASSWORD_EXPIRED get set?
UF_PASSWORD_EXPIRED only good for win xp.
UF_PASSWORD_EXPIRED Windows XP: The user 's password has expired.
Tags for this Thread
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|