Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 04.12.2022
Сообщений: 4

Программа для управления учтеными записями и контролем доступа в OC Windows, использующую возможности Windows API

10.04.2023, 14:31. Показов 2102. Ответов 9

Студворк — интернет-сервис помощи студентам
Добрый день всем! Пишу программу для управления учтеными записями и контролем доступа в OC Windows, использующую возможности Windows API. Лабораторная работа студента.
У программы определенные требования: 1) Динамическая программа не должна использовать готовые обертки над Windows API. 2) Программа должна выводить списки зарегистрированные в системе пользователей и групп, их SID и привилегии. 3) Программа должна позволять добавлять/изменять/удалять пользователей и группы в ОС, а также удалять и добавлять, включать и выключать им привилегии.
Наваял тут код, в котором взял небольшой готовый кусок, сейчас имеются проблемы с entries_read, total_entries, resume_handle. Visual Studio ругается на то, что аргумент типа "DWORD" несовместим с параметром типа "PDWORD_PTR". Я с этими параметрами особо не дружу и вообще максимально слаб в C++. Прошу помочь, буду сильно благодарен!

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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
#include <Windows.h>
#include <lm.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <lmaccess.h>
#pragma comment (lib, "Netapi32.lib")
 
#define MAX_NAME 256
#define MAX_ACCOUNTS 100
 
void listUsersAndGroups()
{
    printf("Listing Users and Groups...\n");
 
        DWORD entries_read = 0, total_entries = 0, resume_handle = 0;
    LPUSER_INFO_0 user_info = NULL;
 
    // Получить список всех пользователей
    NET_API_STATUS result = NetUserEnum(
        NULL,
        0,
        FILTER_NORMAL_ACCOUNT,
        (LPBYTE*)&user_info,
        MAX_PREFERRED_LENGTH,
        &entries_read,
        &total_entries,
        &resume_handle
    );
 
    if (result == NERR_Success || result == ERROR_MORE_DATA)
    {
        printf("Users:\n");
        for (DWORD i = 0; i < entries_read; i++)
        {
            printf("%S", user_info[i].usri0_name);
        }
        printf("\n");
    }
    else
    {
        printf("Error %d: Unable to retrieve user list", result);
    }
 
    if (user_info != NULL)
    {
        NetApiBufferFree(user_info);
        user_info = NULL;
    }
 
    // Получение списка всех групп
    PGROUP_INFO_0 group_info = NULL;
 
    result = NetGroupEnum(
        NULL,
        1,
        (LPBYTE*)&group_info,
        MAX_PREFERRED_LENGTH,
        entries_read,
        total_entries,
        resume_handle
    );
 
 
    if (result == NERR_Success || result == ERROR_MORE_DATA)
    {
        printf("Groups:\n");
        for (DWORD i = 0; i < entries_read; i++)
        {
            printf("%S", group_info[i].grpi0_name);
        }
        printf("\n");
    }
    else
    {
        printf("Error %d: Unable to retrieve group list", result);
    }
 
    if (group_info != NULL)
    {
        NetApiBufferFree(group_info);
        group_info = NULL;
    }
}
 
void addNewUser()
{
    printf("Adding New User...\n");
 
        WCHAR username[MAX_NAME] = { 0 };
    WCHAR password[MAX_NAME] = { 0 };
 
    printf("Enter new username: ");
    fgetws(username, MAX_NAME, stdin);
    username[wcslen(username) - 1] = '\0';
 
    printf("Enter new password: ");
    fgetws(password, MAX_NAME, stdin);
    password[wcslen(password) - 1] = '\0';
 
    USER_INFO_1 user_info = { 0 };
    user_info.usri1_name = username;
    user_info.usri1_password = password;
    user_info.usri1_priv = USER_PRIV_USER;
    user_info.usri1_home_dir = NULL;
    user_info.usri1_comment = NULL;
    user_info.usri1_flags = UF_SCRIPT;
    user_info.usri1_script_path = NULL;
 
    DWORD parm_err = 0;
    NET_API_STATUS result = NetUserAdd(NULL, 1, (LPBYTE)&user_info, &parm_err);
 
    if (result == NERR_Success)
    {
        printf("User %S added successfully.\n", username);
    }
    else
    {
        printf("Error %d: Unable to add user %S", result, username);
    }
}
 
void deleteUser()
{
    printf("Deleting User...\n");
 
        WCHAR usernameToDelete[MAX_NAME] = { 0 };
 
    printf("Enter username to delete: ");
    fgetws(usernameToDelete, MAX_NAME, stdin);
    usernameToDelete[wcslen(usernameToDelete) - 1] = '\0';
 
    NET_API_STATUS result = NetUserDel(NULL, usernameToDelete);
 
    if (result == NERR_Success)
    {
        printf("User %S deleted successfully.\n", usernameToDelete);
    }
    else
    {
        printf("Error %d: Unable to delete user %S", result, usernameToDelete);
    }
}
 
void addUserToGroup()
{
    printf("Adding User to Group...\n");
 
        WCHAR usernameToAdd[MAX_NAME] = { 0 };
    WCHAR groupName[MAX_NAME] = { 0 };
 
    printf("Enter username to add to group: ");
    fgetws(usernameToAdd, MAX_NAME, stdin);
    usernameToAdd[wcslen(usernameToAdd) - 1] = '\0';
 
    printf("Enter group name: ");
    fgetws(groupName, MAX_NAME, stdin);
    groupName[wcslen(groupName) - 1] = '\0';
 
    LOCALGROUP_MEMBERS_INFO_3 localgroup_membersinfo_3;
    ZeroMemory(&localgroup_membersinfo_3, sizeof(LOCALGROUP_MEMBERS_INFO_3));
    localgroup_membersinfo_3.lgrmi3_domainandname = usernameToAdd;
 
    NET_API_STATUS result = NetLocalGroupAddMembers(
        NULL,
        groupName,
        3,
        (LPBYTE)&localgroup_membersinfo_3,
        1);
 
    if (result == NERR_Success)
    {
        printf("User %S added to group %S successfully.\n", usernameToAdd, groupName);
    }
    else
    {
        printf("Error %d: Unable to add user %S to group %S", result, usernameToAdd, groupName);
    }
 
}
 
void removeUserFromGroup()
{
    printf("Removing User from Group...\n");
 
        WCHAR usernameToRemove[MAX_NAME] = { 0 };
    WCHAR groupName[MAX_NAME] = { 0 };
 
    printf("Enter username to remove from group: ");
    fgetws(usernameToRemove, MAX_NAME, stdin);
    usernameToRemove[wcslen(usernameToRemove) - 1] = '\0';
 
    printf("Enter group name: ");
    fgetws(groupName, MAX_NAME, stdin);
    groupName[wcslen(groupName) - 1] = '\0';
 
    LOCALGROUP_MEMBERS_INFO_3 localgroup_membersinfo_3;
    ZeroMemory(&localgroup_membersinfo_3, sizeof(LOCALGROUP_MEMBERS_INFO_3));
    localgroup_membersinfo_3.lgrmi3_domainandname = usernameToRemove;
 
    NET_API_STATUS result = NetLocalGroupDelMembers(
        NULL,
        groupName,
        3,
        (LPBYTE)&localgroup_membersinfo_3,
        1);
 
    if (result == NERR_Success)
    {
        printf("User %S removed from group %S successfully.\n", usernameToRemove, groupName);
    }
    else
    {
        printf("Error %d: Unable to remove user %S from group %S", result, usernameToRemove, groupName);
    }
 
}
 
void disableUser()
{
    printf("Disabling User...\n");
 
        WCHAR usernameToDisable[MAX_NAME] = { 0 };
 
    printf("Enter username to disable: ");
    fgetws(usernameToDisable, MAX_NAME, stdin);
    usernameToDisable[wcslen(usernameToDisable) - 1] = '\0';
 
    USER_INFO_1 user_info = { 0 };
    user_info.usri1_flags = UF_ACCOUNTDISABLE;
 
    NET_API_STATUS result = NetUserSetInfo(NULL, usernameToDisable, 1, (LPBYTE)&user_info, NULL);
 
    if (result == NERR_Success)
    {
        printf("User %S disabled successfully.\n", usernameToDisable);
    }
    else
    {
        printf("Error %d: Unable to disable user %S", result, usernameToDisable);
    }
}
 
void enableUser()
{
    printf("Enabling User...\n");
 
        WCHAR usernameToEnable[MAX_NAME] = { 0 };
 
    printf("Enter username to enable: ");
    fgetws(usernameToEnable, MAX_NAME, stdin);
    usernameToEnable[wcslen(usernameToEnable) - 1] = '\0';
 
    USER_INFO_1 user_info = { 0 };
    user_info.usri1_flags = UF_SCRIPT;
 
    NET_API_STATUS result = NetUserSetInfo(NULL, usernameToEnable, 1, (LPBYTE)&user_info, NULL);
 
    if (result == NERR_Success)
    {
        printf("User %S enabled successfully.\n", usernameToEnable);
    }
    else
    {
        printf("Error %d: Unable to enable user %S", result, usernameToEnable);
    }
}
 
int main()
{
    DWORD dwEntriesRead = 0;
    DWORD dwTotalEntries = 0;
    DWORD dwResumeHandle = 0;
    DWORD dwSize = 0;
    LPUSER_INFO_0 pBuf = NULL;
 
    const wchar_t* pszServerName = NULL;
    const wchar_t* pszDomainName = NULL;
 
    NET_API_STATUS nStatus = NetUserEnum(pszServerName,
        0,
        FILTER_NORMAL_ACCOUNT,
        (LPBYTE*)&pBuf,
        MAX_PREFERRED_LENGTH,
        &dwEntriesRead,
        &dwTotalEntries,
        &dwResumeHandle);
 
    if (nStatus == NERR_Success || nStatus == ERROR_MORE_DATA)
    {
        if (pBuf != NULL)
        {
            for (DWORD i = 0; i < dwEntriesRead; i++)
            {
                wprintf(L"User account name: %s", pBuf[i].usri0_name);
            }
        }
    }
 
    if (pBuf != NULL)
    {
        NetApiBufferFree(pBuf);
    }
 
    return 0;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.04.2023, 14:31
Ответы с готовыми решениями:

api Windows функции для управления окнами
Здравствуйте мне необходимо найти api Windows функции для управления окнами. В книге по С++ приведены только три функции (CloseWindow(),...

Программа на Python для управления программами Windows
DLE (Python 3.10 64-bit) —————————- Скрипт на Python должен выполнять следующие действия: 1. Запустить (программу 1) на Windows 10 (В...

Нужна программа для управления размерами текста в Windows 10
Уважаемые форумчане, нужна помощь, короче проблема со зрением (близорукость) плохо вижу меленький шрифт Знаю в виндовозе v10 есть, в...

9
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
10.04.2023, 14:39
Цитата Сообщение от Leamistrik Посмотреть сообщение
Лабораторная работа студента.
Факультет какой? Специальность?

Добавлено через 4 минуты
Цитата Сообщение от Leamistrik Посмотреть сообщение
Visual Studio ругается на то, что аргумент типа "DWORD" несовместим с параметром типа "PDWORD_PTR".
В какой строке? на какой параметр?
Номер строки по листингу в этой ветке!!
0
0 / 0 / 0
Регистрация: 04.12.2022
Сообщений: 4
10.04.2023, 14:54  [ТС]
Цитата Сообщение от Leamistrik Посмотреть сообщение
result = NetGroupEnum(
        NULL,
        1,
        (LPBYTE*)&group_info,
        MAX_PREFERRED_LENGTH,
        entries_read,
        total_entries,
        resume_handle
    );
Проблема в этом куске. Факультет информатики.
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
10.04.2023, 15:00
Цитата Сообщение от Leamistrik Посмотреть сообщение
Факультет информатики.
грустновасто

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
    result = NetGroupEnum(
        NULL,
        1,
        (LPBYTE*)&group_info,
        MAX_PREFERRED_LENGTH,
        entries_read,
        total_entries,
        resume_handle
    );
Добавлено через 1 минуту
А вообще - в гугле
<название функции> example
и будет куча примеров, в которые можно подсмотреть
0
0 / 0 / 0
Регистрация: 04.12.2022
Сообщений: 4
10.04.2023, 16:54  [ТС]
Данная вставка не работает: аргумент типа "DWORD *" несовместим с параметром типа "PDWORD_PTR" строка 62 - &resume_handle
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
10.04.2023, 19:27
Попробуйте вот так объявить переменную resume_handle:

C++
1
ULONG_PTR resume_handle= NULL;
Добавлено через 12 минут
Кстати, в MSDN написано следующее:

Функция NetQueryDisplayInformation предоставляет эффективный механизм перечисления глобальных групп. По возможности рекомендуется использовать NetQueryDisplayInformation вместо функции NetGroupEnum.
Возможно это объясняет почему по NetGroupEnum крайне мало встречается в примерах.
0
 Аватар для Morgot
336 / 129 / 18
Регистрация: 26.12.2010
Сообщений: 501
11.04.2023, 02:28
Цитата Сообщение от Leamistrik Посмотреть сообщение
аргумент типа "DWORD *" несовместим с параметром типа "PDWORD_PTR" строка 62 - &resume_handle
Собирайте как 32 битную прогу, ибо на 64 бит есть разница между дворд и указателем на него.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
11.04.2023, 05:51
Лучший ответ Сообщение было отмечено Leamistrik как решение

Решение

Цитата Сообщение от Morgot Посмотреть сообщение
Собирайте как 32 битную прогу
C++
52
53
54
55
56
57
58
59
60
61
62
63
64
    // Получение списка всех групп
    PGROUP_INFO_0 group_info = NULL;
 
    DWORD_PTR group_resume_handle{};
    result = NetGroupEnum(
        NULL,
        1,
        (LPBYTE*)&group_info,
        MAX_PREFERRED_LENGTH,
        &entries_read,
        &total_entries,
        &group_resume_handle
    );
Или дайте NetGroupEnum() свой group_resume_handle подобающего типа.
2
11.04.2023, 19:31

Не по теме:

Цитата Сообщение от KSergey9 Посмотреть сообщение
Последний раз редактировалось sourcerer; Сегодня в 17:41. Причина: Используйте кнопки языков программирования в редакторе сообщений для выделения кода
Товарищ модератор!
Вы зачем исказили моё сообщение?? Там был правильный код, а теперь - неправильный!
И форматирование кода там умышленно не было применено, чтобы акцентировать внимание на нужных моментах

Вы в студенческие портянки добавляйте теги. А когда видно, что кусок текста - даже если он похож на код - по смыслу раскрашен цветами, то вот не надо, пожалуйста.

0
11.04.2023, 23:59

Не по теме:

Цитата Сообщение от KSergey9 Посмотреть сообщение
Вы зачем исказили моё сообщение?? Там был правильный код, а теперь - неправильный!
И форматирование кода там умышленно не было применено, чтобы акцентировать внимание на нужных моментах
Я подскажу почему - при копировании будут скопированы и бб коды, которыми вы раскрасили свой код

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.04.2023, 23:59
Помогаю со студенческими работами здесь

Программа корректировки реестра для управления элементами рабочего стола ОС Windows
Программа корректировки реестра для управления элементами рабочего стола ОС Windows. Задали такое сделать. Вообще не могу разобраться....

Как называется программа для просмотра API функций библиотек Windows?
Забыл название. Подскажите название проги. Добавлено через 18 минут Вспомнил http://www.dependencywalker.com/ - прога для просмотра

Беспроводная сеть Windows XP- Windows 7, Windows 7 подключается но пишет что без доступа к интернету.
Компьютер под управлением Windows XP посредством USB адаптера D-Link (WiFi точка) дает WiFi на ноутбук под управлением Windows 7, Ноут...

Нет общего доступа между Windows XP и Windows 2008R2\Windows 7
Прощу помощи разобраться в проблеме: ПК с установленной windows XP не может открыть папку общего доступа которая открыта на ПЭВМ под...

Компоненты Windows Forms для работы с записями
с# еще только изучаю, поэтому с компонентами ещё мало знаком. нужно написать программу с использованием Windows Forms, с помощью которой...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru