web-dev-qa-db-fra.com

Quelle est la syntaxe de la requête annonce pour énumérer tous les utilisateurs d'un groupe particulier?

Voici ce qui ne signifie pas Travailler jusqu'à présent;

(& (ObjectCategory = Personne) (ObjectClass = Group) (CN = GROUP_IN_QUETION))

(& (ObjectClass = Group) (ObjectCategory = Group) (membre = CN = GROUP_IN_QUESTION))

(& (SamaccountName =% nom d'utilisateur%) (membre de = CN = group_in_question))

(& (objetCategory = personne) (ObjectClass = utilisateur) (membre de = CN = CN = GROUP_QUESTION, OU = Groupes, DC = MyDomain, DC = COM))

4
Greg Meehan

La troisième syntaxe fonctionne bien pour moi dans ldp.exe contre l'un de mes domaines. Je ne pose pas normalement la (ObjectCategory = personne) là-bas, mais cela fonctionne aussi bien avec elle.

Quel type d'erreur revenez-vous lorsque vous essayez d'utiliser cela?

2
Evan Anderson

Il y a plusieurs choses à considérer pour ce type de requête:

  1. Combien d'objets cette requête est-elle susceptible de revenir?
  2. Voulez-vous développer des groupes membres de groupes?
  3. Devez-vous gérer des "grands" groupes (plus de 1500 membres de 1500)?

Vous devriez toujours inclure "(ObjectCategory = personne)" Si votre requête devra rechercher une grande base de données d'utilisateurs. Il y a plusieurs raisons pour lesquelles vous voulez faire cela. ObjectCategory est un attribut indexé dans lequel ObjectClass n'est pas, cela augmentera considérablement la vitesse de votre requête sur de grandes bases de données AD. De plus, en utilisant à la fois les attributs ObjectCategory et ObjectClass empêchera les objets "Contact" d'être renvoyés dans votre requête.

Si votre jeu de résultats va retourner plus de 1000 résultats, vous devez être conscient des problèmes de performance. Dans l'interface graphique ADUC, vous pouvez modifier une limite d'élément de 2000 sur le dialogue "Options", augmenter peut ralentir considérablement votre requête. Si vous allez utiliser VBScript et énumérer sur un résultat GetObject, cela sera également très lent, pour les grands groupes. Pour les cmdlets de Quest PowerShell, vous devez inclure le paramètre "-Sizelimit" pour remplacer la limite d'élément de 1000:

get-qadgroupmember somegroup -sizelimit 0

Si vous utilisez du code (VBScript, JScript, .NET) pour créer un objet de connexion et ajouter une requête LDAP à celle-ci, vous devez définir la propriété "Pagesize" de l'objet de connexion pour obtenir un résultat de la pages car Pour ne pas renvoyer un résultat de la pagaie, mais la limiter à 1000 articles. Je définit habituellement .Pagages à 1000 car c'est le max.

L'expansion des groupes imbriqués est le bit tressant. Le moyen le plus simple d'obtenir des informations de groupe imbriquées est d'utiliser les cmdlets Quest PowerShell:

get-qadgroupmember somegroup -indirect -sizelimit 0

À partir d'un script VBScript/JScript, vous pouvez utiliser "getObject" et énumérer sur la collection de membres, tester chaque membre pour "utilisateur ou groupe", puis recueille dans des groupes imbriqués. C'est lent et vous ne devriez pas le faire, sauf comme un exercice dans la programmation VBScript.

En fin de compte, vous voudrez probablement apprendre à le faire via une requête directe LDAP. Ceci est accompli via le LDAP_MATCHINGING_RULE_IN_CHAIN Opérateur. Cet opérateur peut être difficile à utiliser, et il peut être très coûteux sur le DC Si vous avez une structure de nidification profonde pour vos groupes. Le bonus de cette méthode est que pour de très grands groupes (sur 1500 membres par défaut) Vous pourrez faire une requête pour les utilisateurs qui sont membres du groupe (même indirectement), plutôt que de récupérer le groupe et d'essayer de lire l'attribut membre (qui doit être géré dans Une méthode spéciale pour "grand" groupes .

(&(objectCategory=person)(objectClass=user)(memberof:1.2.840.113556.1.4.1941:=(cn=Group1,OU=groupsOU,DC=x)))

Si vous rencontrez des problèmes avec des groupes "grands", vous pouvez également augmenter la limite utilisée par la publicité lors de la limitation de l'accès à l'attribut .member.

9
Ryan Fisher

Je pensais que la question est de trouver tous les utilisateurs d'un groupe et de ne pas rechercher si un utilisateur fait partie d'un groupe?

si vous voulez trouver tous les membres d'une utilisation de groupe

dsquery group -name "MyGroup" | dsget group -member

Et si vous voulez trouver des membres imbriqués également, utilisez également

dsquery group -name "MyGroup" | dsget group -member -expand

S'il y a plus de 1000 ou 1500 membres, DSQUERY pourrait ne pas fournir de résultats dans ce cas, utilisez Adfinind.exe de Joeware.net

ADFIND -f "&(objectcategory=group)(cn=MyGroup)" member 
1
KAPes

Cela peut être fait le plus facilement dans PowerShell avec la quête Admdlets -

get-QADGroupMember [groupname]

Puis filtrez et triez!

get-QADGroupMember [groupname] | where {$_.[Property] -like [criteria]} | sort-object
0
Doug Chase

Voici quelque chose que j'ai utilisé via VBScript:

Utilisateurs énumérants

   Dim objGroup
   Dim x 

   Set objGroup = Getobject ("LDAP: //CN=LocalGrp,OU=Staff, DC=net, DC=dom")
   For Each x In objGroup.Members
      WScript.Echo x.Class
      WScript.Echo x.Name
      WScript.Echo x.ADsPath
      WScript.Echo x.distinguishedName + vbCrLf
   Next
0
JFV