В данной теме я бы хотел обсудить способы программного добавления новой учетной записи пользователя в ОС Windows
вот некоторые примеры кода:
здесь мы добавляем новую учетную запись с указанным именем "TestUser" и паролем "123", но не добавляем нашу новую учетку в какую либо группу, например группу "Администраторы", так что учетная запись будет создана но ни в какой группе состоять она не будет...
function NetUserAdd(ServerName: LPCWSTR; Level: DWORD; Buff: PByte; var Parm_Err: DWORD): DWORD; stdcall; external 'netapi32.dll';
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); const NERR_Success = 0; USER_PRIV_USER = 1; UF_SCRIPT = $0001; UF_DONT_EXPIRE_PASSWD = $10000; var UserInfo: TUserInfo2; Parm_Err: DWORD; begin ZeroMemory(@UserInfo, SizeOf(TUserInfo2)); UserInfo.usri2_name := 'TestUser'; UserInfo.usri2_password := '123'; UserInfo.usri2_priv := USER_PRIV_USER; UserInfo.usri2_flags := UF_SCRIPT or UF_DONT_EXPIRE_PASSWD; if NetUserAdd(nil, 2, @UserInfo, Parm_Err) <> NERR_Success then RaiseLastOSError else ShowMessage('Пользователь TestUser с паролем 123 успешно добавлен.'); end;
end.
а вот в этом примере показан почти аналогичный код,с добавлением нашей учетной записи в указанную группу пользователей, но код к сожалению не полный...
Code
implementation uses Dialogs, JwaLmErr, JwaLmApiBuf, JwaLmAccess; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var UI1: USER_INFO_1; pUI4: PUSER_INFO_4; err: DWORD; p: PByte; begin {Да, можно обойтись и только уровнем USER_INFO_4, не работающем в Win2000, но изначально я мучил именно User_Info_1, и переделывать уже было лень... А вообще - в NetUserAdd указываем уровень 4 и пользуем только структуры одного типа...} FillChar(UI1, SizeOf(User_INFO_1), 0); UI1.usri1_name := '___NewUser___'; UI1.usri1_password := '123'; UI1.usri1_priv := USER_PRIV_USER; UI1.usri1_comment := 'только что созданный пользователь'; UI1.usri1_flags := UF_SCRIPT or UF_NORMAL_ACCOUNT or UF_DONT_EXPIRE_PASSWD; if NetUserAdd(nil, 1, @UI1, @err) = NERR_Success then begin ShowMessage('Пользователь добавлен'); // чтобы установить пользователю членство в локальной группе, // задействуем его SecurityIdentificator (SID), // который появляется в структуре PUSER_INFO_4. err := NetUserGetInfo(nil, '___NewUser___', 4, p); if err = NERR_Success then begin ShowMessage('Информация о пользователе получена'); Pointer(pUI4) := Pointer(p); {вообще-то правильно было бы получить локальные группы пользователей с помощью NetLocalGroupEnum, и уже из них выбирать нужную, но лень} err := NetLocalGroupAddMembers(nil, 'Администраторы', 0, @pUI4.usri4_user_sid, 1); if err <> NERR_Success then ShowMessage(IntToStr(err)) else ShowMessage('Пользователь добавлен в группу'); NetApiBufferFree(p); end; end; end;
сам я как не пытался,объединить эти два примера мне не удалось,вот теперь пришлось создать новую тему что бы разобраться в данном примере....
конкретно требуется добавить новую учетную запись в определенную группу пользователей,думаю данный код будет многим полезен и интересен, поэтому прошу вашей помощи,кто может помочь разобраться в примере,буду очень благодарен за вашу помощь по теме...
и еще заранее хотел бы попросить не выкладывать в данной теме код для добавления новой учетной записи через WinExec, и темболее не указывать на то что он гораздо проще в использовании, так как этот код каким бы он не был,в любом случае аналогичен примеру из любого батника...,а меня интересует именно первый вариант,хоть он и более сложный, но нас трудности не пугают так ведь?
вот код о котором идет речь, убедительная просьба на него не ссылаться:
Code
procedure TForm1.Button1Click(Sender: TObject); var s1: PAnsiChar; s2: PAnsiChar; begin s1:=PChar('net user '+ Edit1.Text+ ' '+ Edit2.Text+ ' /add'); s2:=PChar('net localgroup "Администраторы" '+ Edit2.Text+ ' /add'); WinExec(s1, SW_HIDE); WinExec(s2, SW_HIDE); end;
==========================
А если я скажу что на использование функции указанной в первом коде не ругается антивирус, может хоть так народ обратит на это внимание?
PS: по крайней мере Касперский точно не среагировал!
я просто никак не могу сообразить как объединить эти два кода во едино, что бы используя функцию из первого примера добавить учетную запись в группу...
Сообщение отредактировал xXxSh@dowxXx - Суббота, 18.02.2012, 19:02
вот код о котором идет речь, убедительная просьба на него не ссылаться
А чем он впринцепе отличается? Думаю и тот и другой работают только под учёткой админа Система: Windows 10 x64, Kali Linux Среды программирования: Delphi 7, Delphi 10.x
Я не профессионал, я всего лишь любитель Я не вредитель, я всего лишь теоретик
на использование функции указанной в первом коде не ругается антивирус и спокойно пропускает выполнение этой операции, а третий код то же самое что и в обычном батнике написать, перехватывается всеми антивирусными системами...
вот я и прошу помочь, там всего то нужно понять как загнать созданную учетку в группу пользователей...
Сообщение отредактировал xXxSh@dowxXx - Суббота, 17.03.2012, 14:48
Благодарю вас всех за помощь, огромное спасибо, действительно второй код рабочий, модули нашел, все нормально скомпилировалось и отлично работает, еще раз благодарствую с меня +
PS: как уже сказал Neo нехватало:
"jediapilib" - инклуда
и модулей: "JwaLmCons"; "JwaWinType"; "JwaWinNT".
Сообщение отредактировал xXxSh@dowxXx - Суббота, 17.03.2012, 19:59