Tester un nom de groupe commencant par un underscore

nicosaurus Messages postés 8 Date d'inscription lundi 26 juillet 2004 Statut Membre Dernière intervention 29 juillet 2004 - 27 juil. 2004 à 15:24
oursenpeluche Messages postés 4 Date d'inscription lundi 18 octobre 2004 Statut Membre Dernière intervention 20 octobre 2004 - 18 oct. 2004 à 22:21
Bonjour, je débute un peu en vbscript, et je me heurte à un petit pb : je teste des noms de groupes globaux dans un domaine, et ces noms de groupe commencent tous par "_" (ex : _compta, _finances...). L'underscore semble poser pb dans le test... Est-ce un caractère spécial, et si oui, comment le faire passer (autre caractère devant)?
Merci de vos réponses!

16 réponses

crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
27 juil. 2004 à 15:35
Normalement non !!! tu fais quoi comme test ? Fait péter du code la !!

Christophe R.
0
nicosaurus Messages postés 8 Date d'inscription lundi 26 juillet 2004 Statut Membre Dernière intervention 29 juillet 2004
27 juil. 2004 à 15:50
Bon, en gros je fais le test suivant :

If MemberOf("_Developpeurs") Then
Set TabMappages = ObjetReseau.EnumNetworkDrives
For i = 0 To TabMappages.Count - 1 Step 2
If (TabMappages(i) = LettrePartageService) Then
ObjetReseau.RemoveNetworkDrive LettrePartageService
End If
Next
ObjetReseau.MapNetworkDrive LettrePartageService, PartageDev
End If

Sachant que ma fonction MemberOf est la suivante :

Function MemberOf(grp)
cmd = "\" & SERVDC & "\netlogon\ifmember " & grp
MemberOf = ObjetShell.run (cmd , 0, True)
end Function

Et bizarrement, dés que le groupe comporte un underscore, mon test échoue (pas de mesg d'erreur, le test renvoie false). C'est vachement chelou, mais étant un novice, je me dis que j'ai dû zapper un truc ENORME!!! ;)
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
27 juil. 2004 à 15:58
C'est quoi ce "ifmember" ??? Un utilitaire en ligne de commande ?? ce serait pas lui qui déconne ?

Christophe R.
0
nicosaurus Messages postés 8 Date d'inscription lundi 26 juillet 2004 Statut Membre Dernière intervention 29 juillet 2004
27 juil. 2004 à 16:42
Bien vu, c'est effectivement un utilitaire en ligne de commande!!! Mais à priori, il fonctionne nickel, je l'utilise actuellement pour le même genre de tests, mais dans des fichiers .cmd. Je pensais en fait au pb de l'underscore vu que c'est un caractère qui permet de couper les lignes de codes vbs trop longues pour les finir à la ligne suivante, mais bon, entre des guillemets ca devrait pas poser de pb... Et ce qui est bizarre, c'est que j'ai rien trouvé à ce sujet sur le net ou dans le forum avant de poser ma question...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
28 juil. 2004 à 08:53
J'ai le même type de nom de groupe au bureau (on travaillerai pas dasn la même administration toi et moi ??) alors je vais tester cela et te redis

Christophe R.
0
nicosaurus Messages postés 8 Date d'inscription lundi 26 juillet 2004 Statut Membre Dernière intervention 29 juillet 2004
28 juil. 2004 à 09:57
Merci de m'accorder un peu de temps, c'est sympa! Tiens, petite info, le ifmember.exe, on le trouve sur les resource kit de Microsoft, donc à priori, c'est un outil plus ou moins officiel. J'en ai trouvé un lègèrement différent (en taille), mais même pb... Mais du coup, tu les testes comment tes groupes toi? J'avais cherché un peu sur le site comment tester l'appartenance aux groupes, mais j'avais rien trouvé de simple et efficace...
Au fait, je ne crois pas qu'on bosse dans les même locaux!!! Ca se saurait!!! Ou alors, vive la communication interne!!!
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
28 juil. 2004 à 10:15
Peut-être pas dasn les mêmes locaux mais je bosse dasn une administration réparti sur 125 centres en france, alors étant normand, si toi tu es de marseille, on s'est sans doute jamais vu !!!

Christophe R.
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
28 juil. 2004 à 10:16
Peut-être pas dasn les mêmes locaux mais je bosse dasn une administration réparti sur 125 centres en france, alors étant normand, si toi tu es de marseille, on s'est sans doute jamais vu !!!

POur tes tests de groupe, as-tu tester via les API !!!
Christophe R.
0
nicosaurus Messages postés 8 Date d'inscription lundi 26 juillet 2004 Statut Membre Dernière intervention 29 juillet 2004
28 juil. 2004 à 10:31
En fait, je bosse pas dans une admin, mais dans une CCI du côté de la "Bretagne Nantaise"!!!
Pour ce qui est de tes "API", ben vu que je suis un petit novice, je vois pas trop de quoi tu parles!!! :(
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
28 juil. 2004 à 12:11
Je vais essayer de te pondre un bout de code avec les API windows pour obtenir la liste des groupe globaux dont fait parti un utilsiateur a partir de son login. Ca te conviendrait ?

Christophe R.
0
nicosaurus Messages postés 8 Date d'inscription lundi 26 juillet 2004 Statut Membre Dernière intervention 29 juillet 2004
28 juil. 2004 à 14:09
Ben, c'est une idée super sympa, d'autant plus que ca me permettrait d'apprendre qqch au sujet de ces bestioles que sont les api windows!!! Mais te prends pas la tête non plus, c'est déjà super cool d'avoir tenté de répondre à mes questions!!! Et ceci dit, j'ai peur que le souci soit le même au final, à savoir qu'il va falloir que je teste l'appartenance au groupe pour effectuer les actions correspondantes à ce groupe (lecteurs réseau, raccourcis etc...), à moins qu'il y ait quelque chose que j'ai pas saisi dans la démarche...
0
nicosaurus Messages postés 8 Date d'inscription lundi 26 juillet 2004 Statut Membre Dernière intervention 29 juillet 2004
28 juil. 2004 à 15:47
Alors là, j'hallucine... En fait, c'est pas forcément l'underscore qui fait chier... Mais ca dépend du nom du groupe!!! Oui, oui, t'as bien entendu (enfin lu!), mon groupe sur lequel je faisais tous mes tests s'appelle "_Abel", alors j'ai tenté sur un autre groupe, et là ô miracle, ca fonctionne... C'est un truc de fou, j'y comprends rien. Donc pas la peine de te casser la tête pour moi, faut que je règle nos pb de fantômes informatiques!!! Je vais essayer de voir avec quels groupes ca fonctionne et quels groupes ca fonctionne pas... C'est super chelou!!!
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
28 juil. 2004 à 18:40
voila le code source :
Option 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


Colles-le dans le code d'une form sur laquelle tu fout un bouton Command1. Modifie ensuite le code de l'EVT pour mettre un nom de domaine et d'utilsiateur qui conviennent et roule ma poule ...

ATTENTION : En cas de déboguage du code, toujours executer l'appel à NetAPIBufferFree après un appel à NetGetUserGroups(), sinon .... gare au plantage de VB par la suite ..........

Christophe R.
0
nicosaurus Messages postés 8 Date d'inscription lundi 26 juillet 2004 Statut Membre Dernière intervention 29 juillet 2004
29 juil. 2004 à 08:40
Merci beaucoup, c'est cool!!! Maintenant, je vais m'isoler pour comprendre tout ce code, et le réutiliser pour mes besoins!!! En tous cas, je me coucherai un peu moins bête ce soir!!! ;)
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
29 juil. 2004 à 08:43
Si tu as des PB sur le code, n'hésites pas, contactes moi

Christophe R.
0
oursenpeluche Messages postés 4 Date d'inscription lundi 18 octobre 2004 Statut Membre Dernière intervention 20 octobre 2004
18 oct. 2004 à 22:21
Salut, et déjà merci pour ce code interessant.
Je cherche a faire quasiment la même chose, mais de mon coté, je voudrais lister TOUS les groupes globaux existant.
Donc, je voudrais savoir si en modifiant un peu le code il y a moyen de faire ça ?
Ou peut-être existe-il une API qui permet de faire ça plus simplement ??

Merci !
0
Rejoignez-nous