#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
не является необходимым. Я добавлю фиксированную версию в качестве ответа.