Использование NetGroupGetUsers

#c #windows #winapi

#c #Windows #winapi

Вопрос:

Я хочу, чтобы пользователи группы использовали NetGroupGetUsers функцию.

 DWORD dwError = 0;
NET_API_STATUS nStatus;
LPDWORD entriesread=0;
LPDWORD totalentries=0;
LPBYTE *buff;
nStatus=NetGroupGetUsers(NULL,L"Users",0,buff,MAX_PREFERRED_LENGTH,
                          entriesread,totalentries,NULL);
 

Когда я использую это, я получаю эту ошибку;

 xC0000005: Access violation reading location 0xffffffffffffffff.
 

И как я могу прочитать buff, когда он работает? А также я попробовал это;

 GROUP_USERS_INFO_0 *buff;
nStatus=NetGroupGetUsers(NULL,L"Users",0,(LPBYTE*)amp;buff,MAX_PREFERRED_LENGTH,
entriesread,totalentries,NULL);
 

но произошла та же ошибка.

РЕДАКТИРОВАТЬ: значение nSTATUS — NERR_GroupNotFound я думаю, что причиной нарушения доступа является попытка чтения буфера, который на самом деле не установлен.

РЕДАКТИРОВАТЬ 2: я использовал эту функцию NetLocalGroupGetMembers . теперь это дает успех, но buff->grui0_name бессмысленно. есть пользователь с именем «ali», но значение buff->grui0_name просто «d». ЧТО Я ДЕЛАЮ НЕ ТАК?

Последний код;

 LPCWSTR TargetGroup = L"group1";

DWORD dwError = 0;
NET_API_STATUS stat;

GROUP_USERS_INFO_0 *buff;
LPDWORD entriesread=new DWORD;
LPDWORD totalentries=new DWORD;

stat=NetGroupGetUsers(NULL,TargetGroup,0,(LPBYTE *)amp;buff,MAX_PREFERRED_LENGTH,
                          entriesread,totalentries,NULL);
 

для РЕДАКТИРОВАНИЯ 2;

 stat=NetLocalGroupGetMembers(NULL,TargetGroup,0,(LPBYTE *)amp;buff,
                  MAX_PREFERRED_LENGTH,entriesread,totalentries,NULL);
 

Пожалуйста, помогите…

Комментарии:

1. Я подозреваю, что вам нужно передать ненулевые значения для entriesread и totalentries.

2. я пробовал так; LPDWORD entriesread=new DWORD; это правда? это все еще не работает.

3. @isokorum Тебе, наверное, лучше с DWORD entriesread=0, totalentries=0; NetGroupGetUsers(..., amp;entriesread, amp;totalentries, ...);

4. да, спасибо, это тоже сработало двумя способами. я понял свою проблему. я управлял переменной nSTATUS, это NERR_GroupNotFound. Теперь я схожу с ума от этого. я также добавляю новую группу как group1 и добавляю одного пользователя. но он снова не смог найти группу. я не знаю, что делать.

5. Вы передаете уровень 0 в NetLocalGroupGetMembers, поэтому вы получаете массив структур SID, а не массив строк. Пройдите уровень 1 и сделайте buff указателем на LOCALGROUP_MEMBERS_INFO_1.

Ответ №1:

Вы не выделили никакой памяти для buff . Вы должны писать

 GROUP_USERS_INFO_0 *buff;
... NetGroupGetUsers(..., (LPBYTE*)amp;buff, ...);
 

в противном случае вы говорите NetGroupGetUsers записать результаты в папку для мусора. Обратите внимание, что bufptr параметр задокументирован как [out] . Это означает, что ответственность за указание, куда должен идти результат, лежит на вызывающей стороне. Вызов функции — это нечто большее, чем просто сопоставление типов.

Я удивлен, что вы не получили предупреждение об использовании инициализированной переменной от компилятора.

Комментарии:

1. Да, я тоже пробовал это. Теперь нарушения доступа нет, но NetGroupGetUsers функция состояния возвращается NERR_GroupNotFound . Спасибо. я думаю, мне следует его отредактировать.

2. И в ссылке MSDN говорится: «Система выделяет память для этого буфера».

3. Правильно, система выделяет память и использует bufptr параметр, чтобы сообщить вам, где находится эта память. Вы, в свою очередь, должны выделить память для хранения этого указателя, чтобы вы могли получить ответ. Вот почему это указатель на указатель. (Помните, что в C все параметры передаются по значению, а не по ссылке.)

4. Да, спасибо и извините, я пытаюсь решить эту бессмысленную проблему часами, поэтому я устал.

Ответ №2:

Вот версия без новых:

 LPCWSTR TargetGroup = L"group1";

NET_API_STATUS stat;

LOCALGROUP_MEMBERS_INFO_1 *buff;
DWORD entriesread;
DWORD totalentries;

stat = NetLocalGroupGetMembers(NULL,TargetGroup,1,(LPBYTE *)amp;buff,
    MAX_PREFERRED_LENGTH,amp;entriesread,amp;totalentries,NULL);

wprintf(buff->lgrmi1_name);
 

Ответ №3:

 LPCWSTR TargetGroup = L"group1";

NET_API_STATUS stat;

LOCALGROUP_MEMBERS_INFO_1 *buff;
LPDWORD entriesread=new DWORD;
LPDWORD totalentries=new DWORD;

stat=NetLocalGroupGetMembers(NULL,TargetGroup,1,(LPBYTE *)amp;buff,
                        MAX_PREFERRED_LENGTH,entriesread,totalentries,NULL);



wprintf(buff->lgrmi1_name);
 

Сейчас этот код работает отлично. Спасибо всем.

Комментарии:

1. Этот код не следует копировать, потому что он протекает и new DWORD не является необходимым. Я добавлю фиксированную версию в качестве ответа.