J'ai deux questions qui récupèrent tous les groupes et tous les utilisateurs d'un domaine, Ce que je voudrais savoir, c'est, MyDomain code>
< / p> Mydomain code> qu'un utilisateur particulier appartient à? strong> p>
Compte tenu du nom du groupe, récupérez tous les utilisateurs p>
5 Réponses :
Le centre de script http://technet.microsoft.com/en-us/scriptCenter /default.aspx p>
Voici un script qui prétend donner exactement ce que vous voulez: p>
http: //gallery.technet .microsoft.com / ScriptCenter / en-US / AB5400E2-489A-4738-9B85-508BCB5B75F8 P>
@Raj: Merci pour ces liens. Je suis allé à travers beaucoup de scripts que j'ai pu le faire par programme, disons en C # ou PowerShell, mais je n'ai pas réussi à les traduire en ldap code> requêtes dans TSQL.
Je pense que c'est l'une des limitations de l'interface AD basée sur T-SQL - vous ne pouvez pas récupérer des attributs multi-valorisés, par ex. Attributs (comme Vous pouvez récupérer des attributs à valeur mono-value comme "sn" (nom de famille = nom) ou "nom donné" et "mail", etc., mais l'interface SQL n'est pas capable de manipuler des attributs tels que "Membre de" plusieurs valeurs qui leur sont attribuées. P>
Donc, j'ai bien peur que vous deviez aller un autre moyen pour ce problème - par exemple. Trouvez et remplissez l'appartenance au groupe dans le code géré (séparément en dehors du serveur SQL, ou éventuellement en tant qu'assemblage CLR à l'intérieur du serveur SQL). P>
Limitations La première limitation est membre de code> pour l'utilisateur) qui ont plus d'une valeur en eux. P>
Le processus d'utilisation de la
Déclaration d'openquery à tirer
Les informations d'un serveur LDAP font
souffrir de certaines limitations. Les
Les limitations peuvent être contournées dans
certains cas, mais dans d'autres la
La conception des applications doit être modifiée. Un
Application externe ou objet COM
qui utilise ADSI pour récupérer le
informations du serveur LDAP et
Ensuite, construisez une table en SQL en utilisant ADO
ou d'autres méthodes d'accès aux données sont
une autre méthode viable. P>
La raison pour laquelle j'ai été déterminée à découvrir à ce sujet était parce que j'ai pu faire exactement le nom du groupe, récupérer tous les utilisateurs appartenant au groupe. (Question mise à jour à cette fin)
Oui, car c'est une liste de toutes les entrées à valeur unique, essentiellement. Le "membre de" pour l'utilisateur est un attribut unique qui est multi-évalué et comporte plusieurs entrées (quelque chose de totalement contraire à 1NF en conception relationnelle)
Avec votre requête, vous récupérez une liste d'objets utilisateur dans AD - et pour chacun d'entre eux, vous n'ayez jamais accès à des attributs à valeur unique (CN, SN, ObjectCategory, etc.)
On dirait que je devrais changer la stratégie en créant une fonction de distinction, CLR et SproC. Merci, Marc_s.
Vous pouvez y parvenir en récupérant tous les groupes contenant l'utilisateur dans leur attribut membre, ou mieux le chemin LDAP de l'utilisateur (distinguéeName). Voici une procédure simple qui fait ce travail.
CREATE PROCEDURE dbo.GetLdapUserGroups ( @LdapUsername NVARCHAR(256) ) AS BEGIN DECLARE @Query NVARCHAR(1024), @Path NVARCHAR(1024) SET @Query = ' SELECT @Path = distinguishedName FROM OPENQUERY(ADSI, '' SELECT distinguishedName FROM ''''LDAP://DC=domain,DC=com'''' WHERE objectClass = ''''user'''' AND sAMAccountName = ''''' + @LdapUsername + ''''' '') ' EXEC SP_EXECUTESQL @Query, N'@Path NVARCHAR(1024) OUTPUT', @Path = @Path OUTPUT SET @Query = ' SELECT name AS LdapGroup FROM OPENQUERY(ADSI,'' SELECT name FROM ''''LDAP://DC=domain,DC=com'''' WHERE objectClass=''''group'''' AND member=''''' + @Path + ''''' '') ORDER BY name ' EXEC SP_EXECUTESQL @Query END
En réalité, reportez-vous à la liste de tous les groupes auxquels un utilisateur appartient n'est pas aussi simple / facile qu'il semble. Pour autant que je ne connaisse ni PowerShell ni d'autres scripts ne peuvent fournir des résultats complètement précis, même lors de la récupération de l'attribut TokenGroups, car afin de faire cette détermination, il faut également envisager l'adhésion à des groupes de construction, qui sont spécifiques à un domaine. P>
Il y a un fil très utile sur ActiveDirSec.org que je pense que vous pourriez trouver utile - Comment énumérer la liste de tous les groupes de sécurité de domaine Active Directory qui appartient à un utilisateur? P>
Dans mon expérience, j'ai appris que ce n'est pas aussi facile qu'il y paraît, et à moins que vous ayez un moyen de vérifier la sortie à coup sûr, il n'est également aucun moyen de savoir si votre script fournit les bons résultats. p>
Procédure stockée ci-dessous, exécutez l'exemple:
get_adgroups_foruser strong> 'beau.holland' --Accountname P> blockQuote>
Remarque: Remplacez LDAP: // DC = Domain, DC = local avec votre propre domaine. P>
CREATE PROCEDURE dbo.Get_ADGroups_ForUser ( @Username NVARCHAR(256) ) AS BEGIN DECLARE @Query NVARCHAR(1024), @Path NVARCHAR(1024) -- Find the fully qualified CN e.g: CN=Beau Holland,OU=Users,OU=Australia,OU=NSO,OU=Company,DC=Domain,DC=local -- replace "LDAP://DC=Domain,DC=local" with your own domain SET @Query = ' SELECT @Path = distinguishedName FROM OPENQUERY(ADSI, '' SELECT distinguishedName FROM ''''LDAP://DC=Domain,DC=local'''' WHERE objectClass = ''''user'''' AND sAMAccountName = ''''' + @Username + ''''' '') ' EXEC SP_EXECUTESQL @Query, N'@Path NVARCHAR(1024) OUTPUT', @Path = @Path OUTPUT -- get all groups for a user -- replace "LDAP://DC=Domain,DC=local" with your own domain SET @Query = ' SELECT cn,AdsPath FROM OPENQUERY (ADSI, ''<LDAP://DC=Domain,DC=local>;(&(objectClass=group)(member:1.2.840.113556.1.4.1941:=' + @Path +'));cn, adspath;subtree'')' EXEC SP_EXECUTESQL @Query END GO
C'est une bonne réponse et mérite plus de votes. Idéalement, vous pourriez obtenir la voie dans une sous-requête, mais cela fonctionne bien, peu importe.
@Elias - convenu. Ce suffixe de sous-arbre est si utile. Pour les autres intéressés, chez support2.microsoft.com/kb/187529 Vous trouverez plus d'informations à propos de définir ce type de chose.