Существует замечательный и простой способ менять свойства учетных записей по средством вызвова NetUserSetInfo.. Для изменения флагов существует структура USER_INFO_1008
Вот ссылочка на статью в MSDN на счет NetUserSetInfo., где в качестве примера как раз используется USER_INFO_1008: http://msdn.microsoft.com/en-us/library/aa370659(v=VS.85).aspx
В примере мы видим как учетной записи задается: ui.usri1008_flags = UF_SCRIPT | UF_ACCOUNTDISABLE;
Ручками в Windows данные флаги выставляются, если нажать правой кнопкой на Мой Компьютер, выбрать пункт manage(управление) вот здесь: http://ipicture.ru/
И действительно, после выполнения данной программы вставляется галочка "account is disabled" .
Но все мои попытки выставить галочку User mast change password at next logon посредством флага UF_PASSWORD_EXPIRED привели к неудаче :-( . Хотя если ручками выставить эту галку - данный флаг у уч. записи появляется. Не могу понять, в чем дело?
Вот я составил тестовую программу в которой все наглядно показано:
Код | // 09_07_2010_UF_PASSWORD_EXPIRED.cpp : Defines the entry point for the console application. //
#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()); } }
|
Если создать консольное приложение и вставить туда этот код - должно заработать (в VS2005 - уж точно).
Посмотрите пожалуйста, в чем же может быть загвостка ? =) |