Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3

Метод NetLocalGroupAddMembers() как с ним работать?

25.09.2012, 17:26. Показов 3904. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Ребята подскажите по такому вопросу?
Хочу программно внести пользователя в группу администраторов. Мне здесь на форме подсказали, что можно воспользоаться методом NetLocalGroupAddMembers().

Вот код

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 LOCALGROUP_MEMBERS_INFO_3 lgmi3;
 DWORD dwLevel = 3;
 DWORD totalEntries = 1;
 NET_API_STATUS nStatus;
 LPCWSTR TargetGroup = L"Administrators";
 
 lgmi3.lgrmi3_domainandname = L"root";
 
 nStatus = NetLocalGroupAddMembers(NULL, TargetGroup, 3, (LPBYTE)&lgmi3, totalEntries);
}
//---------------------------------------------------------------------------
Но этот код не работает в смысле ошибок нет, но и пользователь не добавляется в группу администраторов.

По какому параметру этого метода следует отлавливать ошибку?

Заранее благодарен за помощь
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.09.2012, 17:26
Ответы с готовыми решениями:

PlayGround SDK как работать с ним?
Есть инсталяха PlayGround SDK. Установил его, а что дальше делать не знаю. Документацию читаю на английском так там сходу какие-то примеры...

OleContainer1->LoadFromFile как с ним работать?
OleContainer1->LoadFromFile("1.doc") ошибка Invalid stream format А як мне загрузить в него документ?

Загрузить изображение формата bmp и работать с ним побитово
Мне нужно загрузить изображение формата bmp, чтоб потом работать с его битами. Пробовал так. #define _CRT_SECURE_NO_WARNINGS ...

20
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33404 / 21514 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 12
25.09.2012, 18:49
Я бы все-таки переписал метод вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    WideString TargetGroup = L"Administrators";
    WideString TargetAcc = L"yourusername";
 
    LOCALGROUP_MEMBERS_INFO_3 lgmi3;
    DWORD dwLevel = 3;
    DWORD totalEntries = 1;
    NET_API_STATUS nStatus;
    lgmi3.lgrmi3_domainandname = TargetAcc.c_bstr();
    nStatus = NetLocalGroupAddMembers(NULL, TargetGroup.c_bstr(), 3, (LPBYTE)&lgmi3, totalEntries);
    if(nStatus == NERR_Success)
    {
        ShowMessage("good");
    }
    else
    {
        ShowMessage("something wrong");
    }
Запускать из-под администратора (Run as administrator), иначе вылетит nStatus == ERROR_ACCESS_DENIED. А из-под админа прекрасно добавляет пользователя в эту группу.
1
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
25.09.2012, 22:25  [ТС]
У меня записано так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    WideString TargetGroup = L"Administrators";
    WideString TargetAcc = L"root";
 
    LOCALGROUP_MEMBERS_INFO_3 lgmi3;
    DWORD dwLevel = 3;
    DWORD totalEntries = 1;
    NET_API_STATUS nStatus;
    lgmi3.lgrmi3_domainandname = TargetAcc.c_bstr();
    nStatus = NetLocalGroupAddMembers(NULL, TargetGroup.c_bstr(), dwLevel, (LPBYTE)&lgmi3, totalEntries);
    if(nStatus == NERR_Success)
    {
        ShowMessage("good");
    }
    else
    {
        ShowMessage("something wrong");
    }
}
Но права администратора пользователю не даются. Вылетает сообщение "something wrong"

В чём может быть причина?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33404 / 21514 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 12
25.09.2012, 22:38
Еще раз. С какими правами запускалось приложение? Если не через Run as admin - то вылетаешь с запретом доступа. Того, что ты, возможно, работаешь из-под админской учетки - недостаточно.
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
25.09.2012, 22:44  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
Если не через Run as admin - то вылетаешь с запретом доступа
Да не через него. А как в коде прописать Run as admin?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33404 / 21514 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 12
25.09.2012, 23:17
Ты не можешь выполнить часть кода от админа. Только весь код (манифестом). Если не хочешь делать, чтобы всё приложение работало с админскими правами - вынеси создание аккаунта и его перенос в группу админов в отдельное приложение и запускай его как процесс от админа через CreateProcessWithLogonW, я тебе уже показывал, как это делается
1
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
27.09.2012, 11:57  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
Если не хочешь делать, чтобы всё приложение работало с админскими правами - вынеси создание аккаунта и его перенос в группу админов в отдельное приложение и запускай его как процесс от админа через CreateProcessWithLogonW, я тебе уже показывал, как это делается
Делал не получается.

Уточняю. Ты говоришь, что нужно создание пользователя и давание ему админских прав вынести в отдельное приложение т.е в консольный вариант.

Так вот, а как тогда запустить это приложение от логина того пользователя который ещё по факту не создан?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33404 / 21514 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 12
27.09.2012, 12:26
Ты не понял. Это приложение, которое будет создавать пользователя, а тем более, давать ему права Админа - оно должно быть запущено от имени того, у кого уже сейчас есть админские привилегии. Если у тебя нет привилегий админа - ты просто не сможешь добавить пользователя в группу Administrators.
1
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
27.09.2012, 12:44  [ТС]
Я в принципе так и думал просто решил перестраховаться с этим вопросом.

Ну вобщем у меня админские права и я пытаюсь создать пользователя в админскими правами, то пользователь создаётся, а вот админские права к сожалению установить ему не удаётся.

Как-то это можно объяснить?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33404 / 21514 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 12
27.09.2012, 12:48
По второму кругу начнем? Ты запускал программу через RunAsAdmin? Того, что ты работаешь под учеткой администратора - недостаточно. Мне например, Windows не дает назначить права, до тех пор, пока я не запущу программу через Run as admin под Win7.
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
27.09.2012, 12:52  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
Ты запускал программу через RunAsAdmin? Того, что ты работаешь под учеткой администратора - недостаточно.
Да нахожусь под админом и запускал приложение создания пользователя и дача ему админских привелегий через функцию CreateProcessWithLogonW(), пользователя создаёт, а вот права этому пользователю не назначает
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33404 / 21514 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 12
27.09.2012, 12:54
Код - в студию. Само приложение, которое создает нового админа и его запуск из основной программы.
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
27.09.2012, 13:18  [ТС]
Запуск

C++
1
2
3
4
5
6
7
void __fastcall TForm1::Button2Click(TObject *Sender)
{
        PROCESS_INFORMATION pi = {0};
    STARTUPINFOW si = {0};
    si.cb = sizeof(STARTUPINFO);
        CreateProcessWithLogonW(L"Логин моей админской учётки", NULL, L"пароль моей админской учётки", 0 ,L"D:\\CreateUser\\AdminPRAV.exe",NULL, 0, NULL, NULL, &si, &pi);
}
Создание

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <vcl.h>
#include <lmaccess.h>
#include <lm.h>
#pragma hdrstop
WideString TargetAcc = L"User1";
//---------------------------------------------------------------------------
 
#pragma argsused
int main(int argc, char* argv[])
{
 
 bool amh = false;
 LPUSER_INFO_3  un = NULL;
 (LPBYTE *)un = NULL;
 DWORD dwRead = 0;
 DWORD dwTotal = 0;
 NetUserEnum( NULL, 3, FILTER_NORMAL_ACCOUNT,(LPBYTE *)&un, (DWORD)-1, &dwRead, &dwTotal, NULL);
 for (DWORD i = 0; i < dwRead; i++)
 {
 if(!wcscmp(un->usri3_name, TargetAcc))
   {
     amh = true;
   }
     un++;
 }
  if(amh)
 {
  ShowMessage("Пользователь с таким именем существует");
 }
  else
 {
  USER_INFO_1 ui;
  DWORD dwLevel = 1;
  DWORD dwError = 0;
  NET_API_STATUS nStatus;
  ui.usri1_name = TargetAcc;
  ui.usri1_password = L"1";
  // Привилегии: Гость, Пользователь или Админ
  ui.usri1_priv = USER_PRIV_USER;
  ui.usri1_home_dir = NULL;
  ui.usri1_comment = NULL;
  ui.usri1_flags = UF_SCRIPT;
  ui.usri1_script_path = NULL;
  // Создаем пользователя
  nStatus = NetUserAdd(NULL,/*NULL - создается локально*/dwLevel, (LPBYTE)&ui, &dwError);
  // Если все хорошо, то сообщаем об этом
  if(nStatus == NERR_Success)
  {
     ShowMessage("Пользователь создан!");
     WideString TargetGroup = L"Administrators";
     LOCALGROUP_MEMBERS_INFO_3 lgmi3;
     DWORD dwL = 3;
     DWORD totalEntries = 1;
     NET_API_STATUS nStatus;
     lgmi3.lgrmi3_domainandname = TargetAcc.c_bstr();
     nStatus = NetLocalGroupAddMembers(NULL, TargetGroup.c_bstr(), dwL, (LPBYTE)&lgmi3, totalEntries);
     if(nStatus == NERR_Success)
     {
        ShowMessage("good");
     }
     else
     {
        ShowMessage("something wrong");
     }
  }
   else
   {
     ShowMessage("Код ошибки создания пользователя: "+IntToStr(dwError));
   }
 }
 
       return 0;
}
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33404 / 21514 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 12
27.09.2012, 13:43
Нормально под XP отрабатывает, правда, чтоб оно откомпилировалось на Builder-е 2009-ом, пришлось в 2-х местах добавить c_bstr() к строкам. Под 7-кой сейчас проверить не могу, но причин не работать не вижу.
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
27.09.2012, 14:24  [ТС]
А как можно отловить ошибку чтобы не выдавало "something wrong", а высвечивало конкретную ошибку?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33404 / 21514 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 12
27.09.2012, 15:04
Все ошибки, которые может вернуть NetLocalGroupAddMembers, корректно переводятся в сообщение через SysErrorMessage, поэтому можешь сделать:
C++
1
2
3
4
5
6
7
8
    if(nStatus == NERR_Success)
    {
        ShowMessage("good");
    }
    else
    {
        ShowMessage(SysErrorMessage(nStatus));
    }
1
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
27.09.2012, 16:15  [ТС]
Прописал я проверку в коде (см. скриншот) сообщение ввело меня в некоторое недоумение.
Изображения
 
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
27.09.2012, 16:32  [ТС]
Урааааааааааааааааа!!! Я нашёл в чём затык. Надо было писать не L"Administrators", а L"Администраторы" на русском языке.

У меня ещё вопрос из этой темы можно ли как-то программно пользователю поставить галочки:

1.Запретить смену пароля пользователем
2.Срок действия пароля не ограничен

?????????????
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33404 / 21514 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 12
27.09.2012, 16:41
Цитата Сообщение от Sasha Посмотреть сообщение
Надо было писать не L"Administrators", а L"Администраторы" на русском языке.
В таком случае программа не будет работать на нерусифицированной Windows

Цитата Сообщение от Sasha Посмотреть сообщение
можно ли как-то программно у поставить галочки
Перед созданием пользователя заполнить поле usri1_flags структуры. А именно - добавить UF_PASSWD_CANT_CHANGE | UF_DONT_EXPIRE_PASSWD
2
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
27.09.2012, 16:59  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
В таком случае программа не будет работать на нерусифицированной Windows
Это я понял

Добавлено через 8 минут
Самое характерное, что можно пользователя создавать и давать ему админские права без использования метода CreateProcessWithLogonW, но это в ХР
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.09.2012, 16:59
Помогаю со студенческими работами здесь

Метод Fill у DataAdapter. Как с ним работать?
Здравствуйте все! Помогите разобраться, пожалуйста. Я использую в своей программе для заполнения таблиц OracleDataAdapter. Когда я...

Where и как с ним работать?
не могу разобраться с расширением Where на майкрофте пишут int numbers = { 0, 30, 20, 15, 90, 85, 40, 75 }; ...

ADOQuery, как с ним работать?
Слабо знаком с делфи, но нужно создать клиент серверную программу! В общем столкнулся с той проблемой, что не могу понять как именно...

Лицензионное ПО и как с ним работать =)
Приветствую форумчане. В этот раз обращаюсь с наиглупейшими вопросами =) 1) Windows 7 started возможна ли установка...

DaraGridView - как с ним работать
Вот кусок кода в котором я получаю нужные данные (переменная result), записываю в двумерный массив mResult = result;. Хочу получить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru