NetLocalGroupEnum [Résolu]

Signaler
Messages postés
103
Date d'inscription
jeudi 24 juin 2004
Statut
Membre
Dernière intervention
9 février 2006
-
Messages postés
103
Date d'inscription
jeudi 24 juin 2004
Statut
Membre
Dernière intervention
9 février 2006
-
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

Messages postés
103
Date d'inscription
jeudi 24 juin 2004
Statut
Membre
Dernière intervention
9 février 2006

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);
}
}
Messages postés
103
Date d'inscription
jeudi 24 juin 2004
Statut
Membre
Dernière intervention
9 février 2006

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...