Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как программно создать новую учётную запись? Нужно добавить нового пользователя 
:(
    Опции темы
Sfdef
Дата 20.11.2010, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добавляю задание в планировщик. Чтобы процесс проходил в фоне (не мешал юзеру), добавляю от его имени нового пользователя. Во-вторых, чтобы не зависеть от пароля текущего пользователя (которого порой вообще не бывает).
Собственно поэтому и возник вопрос - как программно создать новую учётную запись?
PM MAIL   Вверх
kami
Дата 21.11.2010, 00:23 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



Смотря что проще:
из консоли
или WinAPI
PM MAIL WWW   Вверх
Sfdef
Дата 22.11.2010, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо, НО:
1) NetUserAdd помогает завести новую учётку, и даже эта запись создаётся скрытой - что, в принципе, и нужно! Однако, если вопрос с "окончанием срока действия учётной записи" (созданной с помощью этой функции) я решить смог, то с правами... А толку от учётки, под которой ничего нельзя делать?
2) С помощью консоли "доделываю" за NetUserAdd, однако - это как-то несерьёзно получается: заводим учётку из Delphi, а шлефуем консолью (пусть даже с помощью ShellExecute, но SW_HIDE для консоли не работают, и начинают всплывать различные окна).

Так что - вопрос решён? В принципе - да. Но если Вы знаете - как в процедуре с NetUserAdd прописать этого пользователя в группу админов, - расскажите!
PM MAIL   Вверх
kami
Дата 22.11.2010, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



Цитата(Sfdef @  22.11.2010,  19:38 Найти цитируемый пост)
как в процедуре с NetUserAdd прописать этого пользователя в группу админов

В NetUserAdd - никак, судя по первоисточнику. Смотрю по структуре USER_INFO_1, как самой простой:
usri1_priv DWORD
Цитата

The level of privilege assigned to the usri1_name member. When you call the NetUserAdd function, this member must be USER_PRIV_USER. When you call the NetUserSetInfo function, this member must be the value returned by the NetUserGetInfo function or the NetUserEnum function. This member can be one of the following values. For more information about user and group account rights, see Privileges.


итого - при создании нужно делать обычного пользователя.
Далее - либо через netUserGetInfo, либо через NetUserEnum получаем структуру, меняем что нужно, и - NetUserSetInfo. Не забываем про NetApiBufferFree в конце.

Завтра попробую набросать рабочий пример, если будет время...
PM MAIL WWW   Вверх
Sfdef
Дата 24.11.2010, 07:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(kami @  22.11.2010,  22:50 Найти цитируемый пост)
Далее - либо через netUserGetInfo, либо через NetUserEnum получаем структуру, меняем что нужно, и - NetUserSetInfo. Не забываем про NetApiBufferFree в конце.
Завтра попробую набросать рабочий пример, если будет время... 

kami, я был бы Вам крайне признателен!
Если примеров использования NetUserAdd в сети я нашёл достаточно, то по NetUserSetInfo только справочные материалы. Delphi функцию NetUserSetInfo не знает, и, по-аналогии с NetUserAdd, нужно наверно что-то типа:
Код
function NetUserAdd(ServerName: LPCWSTR; Level: DWORD;
   Buff: PByte; var Parm_Err: DWORD): DWORD; stdcall;
   external 'netapi32.dll';

перед implementation.
Но мне, как новичку, не реально догадаться что написать для NetUserSetInfo! Так что за пример скажу огромное - спасибо!
PM MAIL   Вверх
kami
Дата 25.11.2010, 01:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



Перепробовав много функций в попытке зачислить тестового пользователя в админы, мне надоело каждый раз объявлять всё новые и новые функции из Netapi32.dll.
Посему - предлагаю воспользоваться готовым решением по всему и вся из MSDN, портированному в Delphi, а именно - JEDI API Library.
Дописывал уже засыпая, посему за оформление и упущения в обработке ошибок - не ругаться.  smile 

Код

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;



Это сообщение отредактировал(а) kami - 25.11.2010, 02:00
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

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


 




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


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

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