NetLocalGroupEnum

Résolu
mathieu57100 Messages postés 103 Date d'inscription jeudi 24 juin 2004 Statut Membre Dernière intervention 9 février 2006 - 9 févr. 2006 à 13:11
mathieu57100 Messages postés 103 Date d'inscription jeudi 24 juin 2004 Statut Membre Dernière intervention 9 février 2006 - 9 févr. 2006 à 13:45
bonjour, je suis sur un projet (c++ builder) dans lequel je doit scanner les groupes locaux des ordinateurs...
j'utilise l'API NetLocalGroupEnum.avec le code suivant:

void __fastcall TfrmPrinc::Button1Click(TObject *Sender)
{
NET_API_STATUS NetStatus = NERR_Success;
LPCWSTR servername = L"f09015";
LPBYTE pbuf = NULL;
DWORD level = 0,
prefmaxlen = 8192,
entriesread = 0,
totalentries = 0,
resumehandle = 0;


// DWORD i;
LOCALGROUP_INFO_1 *GroupInfo;


DWORD dwLastError = 0;
int iRetOp = 0;
BOOL bRet = TRUE;


NetStatus = NetLocalGroupEnum(servername,
level,
&pbuf,
prefmaxlen,
&entriesread,
&totalentries,
&resumehandle);


if (NetStatus !NERR_Success || pbuf NULL)
{
dwLastError = GetLastError();
bRet = FALSE;
}


else//if(NetStatus==NERR_Success)
{
GroupInfo = (LOCALGROUP_INFO_1 *)pbuf;
for (unsigned int i=0; i<totalentries; i++)
{
ShowMessage(GroupInfo->lgrpi1_comment);
GroupInfo++;
if(NetStatus==ERROR_ACCESS_DENIED){ShowMessage("ERROR_ACCESS_DENIED");}
if(NetStatus==ERROR_MORE_DATA){ShowMessage("ERROR_MORE_DATA");}
if(NetStatus==NERR_InvalidComputer){ShowMessage("NERR_InvalidComputer");}
if(NetStatus==NERR_BufTooSmall){ShowMessage("NERR_BufTooSmall");}
}
}


if (pbuf)
{
NetApiBufferFree(pbuf);
}
}

lorsque j'execute cette fonction elle m'affiche un groupe sur deux en commançant par le deuxième et lorsqu'elle arrive au dernier, j'ai un plantage de l'appli qui me dit:
"le projet a provoqué une classe d'exeption EAccessViolation avec le message'Violation à l'adresse 'zzzzzzzzz' dans le module 'kernel32.dll'. Lecture de l'adresse 'yyyyyyyyy'.
Processus stoppé. "

quelqu'un aurait-il une réponse à me donné?
merci d'avance.

2 réponses

mathieu57100 Messages postés 103 Date d'inscription jeudi 24 juin 2004 Statut Membre Dernière intervention 9 février 2006
9 févr. 2006 à 13:45
c'est bon, j'ai trouvé...:

void __fastcall TfrmPrinc::Button1Click(TObject *Sender)
{
NET_API_STATUS NetStatus = NERR_Success;
LOCALGROUP_INFO_0 *GroupInfo;
LPCWSTR servername = L"f09015";
LPBYTE pbuf = NULL;
DWORD level = 0,
prefmaxlen = 8192,//MAX_PREFERRED_LENGTH
entriesread = 0,
totalentries = 0,
resumehandle = 0;


NetStatus = NetLocalGroupEnum(servername,
level,
&pbuf,
prefmaxlen,
&entriesread,
&totalentries,
&resumehandle);


if(NetStatus==NERR_Success)
{
GroupInfo = (LOCALGROUP_INFO_0 *)pbuf;
for (unsigned int i=0; i<totalentries; i++)
{
ShowMessage(GroupInfo->lgrpi0_name);
GroupInfo++;
if(NetStatus==ERROR_ACCESS_DENIED){ShowMessage("ERROR_ACCESS_DENIED");}
if(NetStatus==ERROR_MORE_DATA){ShowMessage("ERROR_MORE_DATA");}
if(NetStatus==NERR_InvalidComputer){ShowMessage("NERR_InvalidComputer");}
if(NetStatus==NERR_BufTooSmall){ShowMessage("NERR_BufTooSmall");}
}
}


if (pbuf)
{
NetApiBufferFree(pbuf);
}
}
3
mathieu57100 Messages postés 103 Date d'inscription jeudi 24 juin 2004 Statut Membre Dernière intervention 9 février 2006
9 févr. 2006 à 13:18
je viens d'essayé un truc...dans la boucle for

comme la focntion ne donne qu'un groupe su deux, je me suis dit qu'elle s'attendait à en trouver d'autre, à cause de la valeur de totalentries mais qu'elle n'en trouvé plus.
donc si je remplace la boucle for par la suivante, je n'ai plus l'erreur de violation j'sais pas quoi...

for (unsigned int i=0; i<totalentries/2-1; i++)
{...}

reste plus qu'à trouvé pourquoi je n'ai qu'un groupe sur deux...
0
Rejoignez-nous