Re: NetUserEnum |
Sujet: Re: NetUserEnum par Lolo sur 17/3/2004 11:03:02 Ne cherchez plus, le problème est que sous WinDev nous n'avons pas le fabuleux opérateur -> (contenu pointé par). Il faut utiliser la fonction transfert pour cela. Voir le code joint (et documenté) pour la solution complète. ------------------------------------------------------- Y-a pas de mal à se faire du fric http://www.eurexcelpartners.com/index.php/rep/lf20486 ------------------------------------------------------- Le code : chDomaine, chServeur est une chaîne // Noms du domaine et du CPD (Contrôleur Principal du Domaine) pDomaine, pServeur est une chaîne UNICODE // Les mêmes en UNICODE hInst est un entier // Instance de l'API pInfos est un entier // Pointeur sur les infos retournées par l'API res est un entier // Résultat de l'appel à l'API EntreesLues, TotalEntrees, ResumeHandle sont des entiers // Pour NetUserEnum boolEncoreDesInfos est un booléen // Structure USER_INFO_10 (Il existe : USER_INFO_0,1 à 4,10,11,20 à 23,1003,1005 à 1014,1017,1018,1020,1023 à 1025,1051 à 1053 USER_INFO_10 est une structure p_name est un entier // Pointeur sur une chaine UNICODE : login p_comment est un entier // Pointeur sur une chaine UNICODE : commentaires p_usr_comment est un entier // Pointeur sur une chaine UNICODE : commentaires p_full_name est un entier // Pointeur sur une chaine UNICODE : nom complet FIN InfoUtilisateur est une USER_INFO_10 NiveauInformation est un entier =10 // Niveau d'informations de NetUserEnum, correspond à la structure USER_INFO_10 nbInfos est un entier = 1 // Nombre d'infos à retourner, si on met plus, il faut récupérer un tableau de structure // Filtre de recherche pour NetUserEnum FILTER_TEMP_DUPLICATE_ACCOUNT est un entier = 1 FILTER_NORMAL_ACCOUNT est un entier = 2 FILTER_INTERDOMAIN_TRUST_ACCOUNT est un entier = 8 FILTER_WORKSTATION_TRUST_ACCOUNT est un entier = 16 FILTER_SERVER_TRUST_ACCOUNT est un entier = 32 USER_INFO_CH est une structure // J'utilise une structure de chaine, on pourrait prendre autre chose ch_name est une chaîne ch_comment est une chaîne ch_usr_comment est une chaîne ch_full_name est une chaîne FIN InfoUtilisateurCH est une USER_INFO_CH // Récupération du nom de domaine sur lequel est connecté le poste chDomaine = SansEspace(SysEnvironnement("USERDOMAIN")[[12 A ]]) // Conversion en UNICODE pDomaine = AnsiVersUnicode(chDomaine,alphabetAnsi) // Chargement de l'API adéquate hInst = ChargeDLL("Netapi32.dll") SI hInst = 0 ALORS Erreur("Impossible de charger la DLL") SINON // Récupération du nom du CPD res = API("NetApi32.dll","NetGetDCName",Null,&pDomaine,&pInfos) // Récupération de l'info retournée par NetGetDCName en UNICODE chServeur = SansEspace(ChaîneRécupère(pInfos,crAdresseUNICODE)) // Conversion en UNICODE pServeur = AnsiVersUnicode(chServeur,alphabetAnsi) // Libération de la mémoire réservée par NetGetDCName res = API("NetApi32.dll","NetApiBufferFree",pInfos) Info("Domaine : "+chDomaine+RC+"Serveur : "+chServeur) // Enumération des utilisateurs ResumeHandle = 0 // Pour récupérer la première info BOUCLE res = API("NetApi32.dll","NetUserEnum", pServeur, NiveauInformation, FILTER_NORMAL_ACCOUNT, &pInfos, nbInfos , &EntreesLues, &TotalEntrees, &ResumeHandle) boolEncoreDesInfos = ( TotalEntrees > 1 ) // Récupération des informations, l'opérateur C -> n'existant pas sous WinDev, on utilise la fonction Transfert Transfert(&InfoUtilisateur,pInfos,16) // On transfert le contenu de la mémoire réservée par NetUserEnum dans notre structure. // 16 c'est la taille de ma structure ( 4 entiers = 4 * 4 octets ) // Les infos récupérées sont des chaines UNICODE, il convient donc de les convertir InfoUtilisateurCH:ch_name = ChaîneRécupère(InfoUtilisateur:p_name,crAdresseUNICODE) InfoUtilisateurCH:ch_comment = ChaîneRécupère(InfoUtilisateur:p_comment,crAdresseUNICODE) InfoUtilisateurCH:ch_usr_comment = ChaîneRécupère(InfoUtilisateur:p_usr_comment,crAdresseUNICODE) InfoUtilisateurCH:ch_full_name = ChaîneRécupère(InfoUtilisateur:p_full_name,crAdresseUNICODE) Info(InfoUtilisateurCH:ch_name+RC+InfoUtilisateurCH:ch_full_name+RC+InfoUtilisateurCH:ch_comment+RC+InfoUtilisateurCH:ch_usr_comment) // Libération de la mémoire réservée par NetUserEnum res = API("NetApi32.dll","NetApiBufferFree",pInfos) SI PAS boolEncoreDesInfos ALORS SORTIR FIN DéchargeDLL(hInst) FIN Citation :
|