Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Изменение свойств учетной записи пользователя, почему не работает: UF_PASSWORD_EXPIRED? 
:(
    Опции темы
racner
  Дата 10.7.2010, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 6.10.2009

Репутация: нет
Всего: нет



Существует замечательный и простой способ менять свойства учетных записей по средством вызвова NetUserSetInfo.
Для изменения флагов существует структура USER_INFO_1008

Вот ссылочка на статью в MSDN на счет NetUserSetInfo., где в качестве примера как раз используется  USER_INFO_1008:
http://msdn.microsoft.com/en-us/library/aa...9(v=VS.85).aspx

В примере мы видим как учетной записи задается:
  ui.usri1008_flags = UF_SCRIPT | UF_ACCOUNTDISABLE;

Ручками в Windows данные флаги выставляются, если нажать правой кнопкой на Мой Компьютер, выбрать пункт manage(управление) вот здесь:
user posted image

И действительно, после выполнения данной программы вставляется галочка "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 - уж точно).

Посмотрите пожалуйста, в чем же может быть загвостка ? =)

Это сообщение отредактировал(а) racner - 10.7.2010, 15:39
PM MAIL   Вверх
xvr
Дата 11.7.2010, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



NetUserSetInfo завершается успешно? Если нет, то что возвращает GetLastError?

PM MAIL   Вверх
racner
  Дата 12.7.2010, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 6.10.2009

Репутация: нет
Всего: нет



Да, NetUserSetInfo возвращает NERR_Success.

Вот что выводится на консоль у меня на компьютере в результатае выполнения программы:

NERR_Success

Number of accounts: 5 of 5

Administrator
Guest1
John
nnn136
__vmware_user__

Input name ->Guest1
flag: 513
UF_SCRIPT
UF_NORMAL_ACCOUNT

Operation complite:

flag: 513
UF_SCRIPT
UF_NORMAL_ACCOUNT


Как видно, после выполнения операции флаг остался таким же. Хотя если вместо  UF_PASSWORD_EXPIRED указать UF_ACCOUNTDISABLE (как в примере в MSDN) в результате выполняния флаг добавляется.  

Я вот думаю, может на англоязычном форуме спросить, только я точно не знаю, на каком и как лучше? smile 

Это сообщение отредактировал(а) racner - 12.7.2010, 09:32
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0672 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.