В данной теме я бы хотел обсудить способы программного добавления новой учетной записи пользователя в ОС 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, Windows XP
Среды программирования: Delphi 7, Delphi 10 Seattle
Я не профессионал, я всего лишь любитель
Я не вредитель, я всего лишь теоретик
на использование функции указанной в первом коде не ругается антивирус и спокойно пропускает выполнение этой операции, а третий код то же самое что и в обычном батнике написать, перехватывается всеми антивирусными системами...
вот я и прошу помочь, там всего то нужно понять как загнать созданную учетку в группу пользователей...
Сообщение отредактировал xXxSh@dowxXx - Суббота, 17.03.2012, 14:48
Благодарю вас всех за помощь, огромное спасибо, действительно второй код рабочий, модули нашел, все нормально скомпилировалось и отлично работает, еще раз благодарствую с меня +
PS: как уже сказал Neo нехватало:
"jediapilib" - инклуда
и модулей: "JwaLmCons"; "JwaWinType"; "JwaWinNT".
Сообщение отредактировал xXxSh@dowxXx - Суббота, 17.03.2012, 19:59