Message de rapport:
 

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 :

Lolo a écrit :
Bonjour, j'essaye d'utiliser la fonction 'NetUserEnum' de l'API 'Netapi32.dll'.
Le but étant de récupérer la liste des utilisateurs (plus fullname, ...) déclarés sur un controleur de domaine (NT4, mais devrait être identique sut 2000 ou 2003 d'après la doc Microsoft).

A priori j'obtiens le bon nombre d'infos, mais impossible d'obtenir des chaines de caractères lisibles ! Je ne sais pas si mon soucis vient de moi, ou du fonctionnement des fonctions WinDev 'ChaîneRécupère' et 'Transfert'.

Quelqu'un a-t-il réussi à utiliser la fonction 'NetUserEnum' ? Si oui, pourrais-t-il mettre son code en ligne ? Merci.

PS : ce qui est rageant, c'est que la même chose en Visual C ou Delphi fonctionne parfaitement...

Connexion
Menu
Chercher WDForge
Chercher Web
Partenaires
Visualiser tous les Partenaires...
WinDev, WebDev, WinDev Mobile et HyperFile sont des marques déposées par PCSoft. |  Voter |  Legal |  Contact |   XOOPS 2.0.13.2