Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionOption Explicit ' Libère un buffer pour appel des API de la NetApi32.dll Private Declare Function NetApiBufferFree Lib "NETAPI32.dll" (ByVal Buffer As Long) As Long ' Obtient le nom NETBIOS du Controleur d'un domaine NT Private Declare Function NetGetDCName Lib "NETAPI32.dll" (sName As Byte, domainname As Byte, bufptr As Long) As Long ' Obtient la liste des groupes dont fait partie un utilisateur Private Declare Function NetUserGetGroups Lib "NETAPI32.dll" (servername As Byte, UserName As Byte, ByVal level As Long, bufptr As Long, prefmaxlen As Long, entriesread As Long, totalentries As Long) As Long ' Obtient un Int à partir d'un pointeur Private Declare Function PtrToInt Lib "kernel32" Alias "lstrcpynW" (RetVal As Any, ByVal Ptr As Long, ByVal nCharCount As Long) As Long ' Obtient une chaine de caractères à partir d'un pointeur Private Declare Function PtrToStr Lib "kernel32" Alias "lstrcpyW" (RetVal As Byte, ByVal Ptr As Long) As Long ' Obtient la longueur d'une chaine de caractères à partir d'un pointeur sur cette chaine Private Declare Function StrLen Lib "kernel32" Alias "lstrlenW" (ByVal Ptr As Long) As Long ' Obtient la longueur d'une chaine Unicode Private Declare Function lstrlenW Lib "kernel32" (lpString As Any) As Long ' conversion chaine Unicode en ASCII Private Declare Function WideCharToMultiByte Lib "kernel32" (ByVal codepage As Long, ByVal dwFlags As Long, lpWideCharStr As Any, ByVal cchWideChar As Long, lpMultiByteStr As Any, ByVal cchMultiByte As Long, ByVal lpDefaultChar As String, ByVal lpUsedDefaultChar As Long) As Long Private Const CP_ACP = 0 ' Constante de retour des API Private Const NERR_BASE As Long = 2100 Private Const NERR_Success As Long = 0 Private Const NERR_DCNotFound As Long = (NERR_BASE + 353) Private Const ERROR_INVALID_NAME As Long = 123& Private Const ERROR_MORE_DATA As Long = 234& Private Type MungeInt XLo As Integer XHi As Integer Dummy As Integer End Type Private Type MungeLong X As Long Dummy As Integer End Type '--------------------------------------------------------------------------------------- ' Procédure : GetUserGroupList ' Auteur : Christophe RENAUD ' Objet : Obtient la liste des groupes dont fait partie un utilisateur ' Retour : Renvoie un tableau de String contenant les noms des groupes ' Arguments : - UserName (Entrée) : Contient le nom de l'utilisateur ' - DCName (Entrée) : Nom du controleur de domaine '--------------------------------------------------------------------------------------- ' Private Function GetUserGroupList(UserName As String, DCName As String) As String() Dim ret As Long, entriesread As Long, totalentries As Long, bufptr As Long, BufLen As Long, sName() As Byte, UName() As Byte, i As Long Dim Result() As String Erase Result sName = DCName & vbNullChar UName = UserName & vbNullChar BufLen = 0 ret = NetUserGetGroups(sName(0), UName(0), 0, bufptr, BufLen, entriesread, totalentries) If ret <> NERR_Success And ret <> ERROR_MORE_DATA Then Exit Function End If ReDim Result(entriesread) For i = 1 To entriesread Result(i) = Trim(GetStringFromBuffer(bufptr, i, 1, 4)) Next ret = NetApiBufferFree(bufptr) GetUserGroupList = Result End Function '--------------------------------------------------------------------------------------- ' Procédure : GetStringFromBuffer ' Auteur : Christophe RENAUD ' Objet : Obtient une valeur depuis un buffer NetApi32 ' Retour : Renvoie la chaine attendue ' Arguments : - BufPtr (Entrée) : Adresse du buffer ' - offset (Entrée) : Offset d'enregistrement ' - Valnum (Entrée) : Offset de la valeur dans l'enregistrement ' - recordsize (entrée) : Taille en octet des enregistrements '--------------------------------------------------------------------------------------- ' Private Function GetStringFromBuffer(ByVal bufptr As Long, ByVal offset As Long, ByVal Valnum As Long, ByVal recordsize As Long) As String Dim Result As Long, unarray(1023) As Byte, TempPtr As MungeLong, TempStr As MungeInt Result = PtrToInt(TempStr.XLo, bufptr + (offset - 1) * recordsize + (Valnum - 1) * 2, 2) Result = PtrToInt(TempStr.XHi, bufptr + (offset - 1) * recordsize + (Valnum - 1) * 2 + 2, 2) LSet TempPtr = TempStr Result = PtrToStr(unarray(0), TempPtr.X) GetStringFromBuffer = Left(unarray, StrLen(TempPtr.X)) End Function '--------------------------------------------------------------------------------------- ' Procédure : GetPDC ' Auteur : Christophe RENAUD ' Objet : Obtient le nom du serveur PDC du domaine NT ' Retour : Renvoie True si l'appel a réussi, False sinon ' Arguments : - PDC (Sortie) : Contient le nom du PDC si l'appel a réussi ' - SDomain (Entrée) : Nom du domaine dont on recherche le PDC '--------------------------------------------------------------------------------------- ' Public Function GetPDC(ByRef PDC As String, SDomain As String) As Boolean Dim ret As Long, lpBuf As Long, bServer() As Byte, bDomain() As Byte bServer = "" & vbNullChar bDomain = SDomain & vbNullChar ret = NetGetDCName(bServer(0), bDomain(0), lpBuf) Select Case ret Case NERR_Success PDC = GetStrFromPtrW(lpBuf) GetPDC = True Case NERR_DCNotFound GetPDC = False Case ERROR_INVALID_NAME GetPDC = False End Select Call NetApiBufferFree(ByVal lpBuf) End Function Public Function GetStrFromPtrW(lpszW As Long) As String Dim sRtn As String sRtn = String$(lstrlenW(ByVal lpszW) * 2, 0) Call WideCharToMultiByte(CP_ACP, 0, ByVal lpszW, -1, ByVal sRtn, Len(sRtn), 0, 0) GetStrFromPtrW = GetStrFromBufferA(sRtn) End Function Public Function GetStrFromBufferA(sz As String) As String If InStr(sz, vbNullChar) Then GetStrFromBufferA = Left$(sz, InStr(sz, vbNullChar) - 1) Else GetStrFromBufferA = sz End If End Function Private Sub Command1_Click() Dim DC As String, G() As String, i As Long, Buffer As String If GetPDC(DC, "METTRE ICI LE NOM DU DOMAINE NT") Then G = GetUserGroupList("METTRE ICI LE NOM DE L'UTILISATEUR", DC) For i = LBound(G) To UBound(G) Buffer = Buffer & G(i) & vbCrLf Next MsgBox Buffer End If End Sub