![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как сменить пароль для пользователя [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).