Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как сменить пароль для пользователя [D7, WinXP]


Still Swamp ©   (2005-09-05 20:16:00) 

Как сменить пароль для пользователя w2k или вызвать стандартный диалог смены пароля.


Still Swamp   (2005-09-10 01:21:00) [1]

это прошу прощения... хм....


user51   (2005-09-09 10:14:00) [2]

администратор имя пользователя
xxxxx пароль


user51   (2005-09-09 10:12:00) [3]

Может так
winexec('cmd.exe /c net user администратор xxxxx',0);
                                ^^^^      ^^^^
                        имя пользователя  пароль

У меня крутится сервис слушает порт
присылаю ему комманды он их выполнят
пароли меняет без проблем


Still Swamp   (2005-09-08 22:29:00) [4]

Спасибо...
Вот мое...

procedure TVFormChangePassword.ActOkExecute(Sender: TObject);
var
Rs:DWORD;
DomainName:PWideChar;
UserName:PWideChar;
OldPassword:PWideChar;
NewPassword:PWideChar;
begin
Rs:=0;

DomainName:=PWideChar(WideString(VDomainName.Text));
UserName:=PWideChar(WideString(VUserName.Text));
OldPassword:=PWideChar(WideString(VOldPassword.Text));
NewPassword:=PWideChar(WideString(VNewPassword.Text));

if Trim(VNewPassword.Text)<>Trim(VNewPasswordConfirm.Text) then begin
 LogError('Не совпадают введенные пароли')
end else begin
 Rs:=NetUserChangePassword(DomainName,UserName,OldPassword,NewPassword);
 case Rs of
  ERROR_ACCESS_DENIED:LogError('Пользователь не имеет доступа к запрашиваемой информации');
  NERR_InvalidComputer:LogError('Неверное имя домена или компьютера');
  NERR_NotPrimary:LogError('Операция разрешена только для домена');
  NERR_UserNotFound:LogError('Имя пользователя не найдено');
  NERR_PasswordTooShort:LogError('Пароль содержит слишком мало символов');
  NERR_Success:begin
   LogInfo('Ваш пароль был успешно изменен');
   Close;
  end;
 else
  LogError('Непредвиденная ошибка '+IntToStr(Rs));
 end;
end;
end;


Ботвин Дмитрий   (2005-09-08 08:27:00) [5]

Примерно так: на форме ставишь 3 TEdit-а с именами
1. CompName - имя компа на котором меняем пароль пользователя
2. UserName - имя пользователя
3. UserPassword - новый пароль

procedure TForm1.ChangePasswordClick(Sender: TObject);
 
  const
     NERR_BASE = 2100;
     NERR_InvalidComputer = NERR_BASE+251;
     NERR_NotPrimary = NERR_BASE+126;
     NERR_PasswordTooShort = NERR_BASE+145;
     NERR_SpeGroupOp = NERR_BASE+134;
     NERR_LastAdmin  = NERR_BASE+352;
     NERR_BadPassword = NERR_BASE+103;
     NERR_UserNotFound = NERR_BASE+121;

 type
   TChangePasswInfo = record
     usri1003_password: PWideChar;
   end;

 var buf: Pointer;
     UserInfo: TChangePasswInfo;
     HostName,User_Name, Passw: WideString;
     parm_err: DWORD;
     error: longint;
 begin
   HostName:=WideString('\\'+CompName.Text);
   User_Name:=WideString(UserName.Text);
   Passw:=WideString(UserPassword.Text);
   UserInfo.usri1003_password:=PWideChar(Passw);
   buf:=@UserInfo;
   error:=NetUserSetInfo(PWideChar(HostName),PWideChar(User_Name),1003,buf,parm_err);
   NetApiBufferFree(buf);
   case error of
     ERROR_ACCESS_DENIED: Application.MessageBox('Пользователю недостаточно прав для выполнения функции!',
                          'Ошибка',MB_OK+MB_ICONSTOP);
     NERR_InvalidComputer: Application.MessageBox('Неверное имя компьютера!',
                          'Ошибка',MB_OK+MB_ICONSTOP);
     NERR_NotPrimary: Application.MessageBox('Операция разрешена только для главного контроллера домена!',
                          'Ошибка',MB_OK+MB_ICONSTOP);
     NERR_SpeGroupOp: Application.MessageBox('Недопустимое действие для группы пользователей!',
                          'Ошибка',MB_OK+MB_ICONSTOP);
     NERR_PasswordTooShort: Application.MessageBox('Слишком короткий пароль!',
                          'Ошибка',MB_OK+MB_ICONSTOP);
     NERR_LastAdmin: Application.MessageBox('Действие не допустимо для данной учетной записи!',
                          'Ошибка',MB_OK+MB_ICONSTOP);
     NERR_BadPassword: Application.MessageBox('Недопустимый пароль!',
                          'Ошибка',MB_OK+MB_ICONSTOP);
     NERR_UserNotFound: Application.MessageBox('Имя пользователя не найдено!',
                          'Ошибка',MB_OK+MB_ICONSTOP);
   else
     Application.MessageBox('Пароль успешно изменён!','Изменение пароля',
                        MB_OK+MB_ICONINFORMATION);
   end;
 end;

Если меняешь пароль на локальном компе, то первым параметром в
NetUserSetInfo должен быть nil.
Вот и всё, с диалоговыми формами я думаю сам разберёшься...


begin...end   (2005-09-07 21:33:00) [6]

> Still Swamp   (07.09.05 19:36) [8]

У меня сейчас сишных хидеров нету, но гугл говорит, что 1351 -- это ERROR_CANT_ACCESS_DOMAIN_INFO: "Configuration information could not be read from the domain controller, either because the machine is unavailable, or access has been denied".


begin...end   (2005-09-07 21:18:00) [7]

> Still Swamp   (07.09.05 19:36) [8]
> Still Swamp   (07.09.05 19:57) [9]

86 -- это ERROR_INVALID_PASSWORD (см. выше). Насчёт 1351 -- не в курсе.

А на код использования функции можно взглянуть?


Still Swamp   (2005-09-07 19:57:00) [8]

А еще 86... так же бывает.


Still Swamp   (2005-09-07 19:36:00) [9]

???

Возвращает в DWord 1351... это как?


Still Swamp   (2005-09-07 19:31:00) [10]

Оки... сенкс... удочка тоже не плохо.


begin...end   (2005-09-07 19:22:00) [11]

> Still Swamp   (07.09.05 19:06) [5]

ERROR_ACCESS_DENIED и ERROR_INVALID_PASSWORD уже импортированы (см. модуль Windows).

Остальное:

сonst
 NERR_InvalidComputer = 2351;
 NERR_NotPrimary = 2226;
 NERR_UserNotFound = 2221;
 NERR_PasswordTooShort = 2245;


Still Swamp   (2005-09-07 19:06:00) [12]

Согласен - не проблема... только там еще ворох ошибок... их тоже надо переводить.
ERROR_ACCESS_DENIED
NERR_InvalidComputer
NERR_NotPrimary
.....
И так далее. Самому придется делать... но может у кого все же есть?


begin...end   (2005-09-07 19:03:00) [13]

> Still Swamp   (07.09.05 18:56) [3]

В справке (Windows SDK) написано... Остаётся только перевести сишные типы на дельфийские:

function NetUserChangePassword(DomainName: PWideChar; UserName: PWideChar; OldPassword: PWideChar;
  NewPassword: PWideChar): Cardinal; stdcall; external 'netapi32.dll' name 'NetUserChangePassword';


Still Swamp   (2005-09-07 18:56:00) [14]

А есть ли у кого заголовки к этой DLL? Поделитесь плс


Lamer@fools.ua   (2005-09-05 20:33:00) [15]

Сменить: NetUserChangePassword()


begin...end   (2005-09-05 20:32:00) [16]

Функция NetUserChangePassword (библиотека Netapi32.dll).


Наверх

Титульная страница Поиск, карта сайта Написать письмо