août
2011
Il est possible d’utiliser l’Active Directory (AD) comme source de données, pour mettre à jour des tables d’une base de données SQL SERVER. Les tables en question peuvent contenir des informations relatives aux :
¤ employés
¤ ordinateurs d’une entreprise (ou d’une organisation)
¤ …
Dans ce billet nous allons voir comment utiliser l’AD comme source pour mettre à jour une table de la base de données.
Dans mon contexte l’AD est sous WINDOWS 2003 et le serveur SQL 2005 tourne sur WINDOWS 2008.
le serveur SQL 2005 est intégré dans le domaine AD.
Supposons qu’on désire mettre à jour la table EMPLOYE dans la base de donnée.
EMPLOYE ( FirstName ,Initials ,LastName ,Company ,BusinessPhone ,EmailAddress)
=> Créer un link vers l’AD
EXEC master.dbo.sp_addlinkedserver @server = N'ADSI',
@srvproduct=N'Active Directory Services', @provider=N'ADsDSOObject',
@datasrc=N'NomDuServeurActiveDirectory.MonDomaine.com'
=> Activer l’option avancée et configurer l’exécution des requêtes distribuées sous le serveur SQL SERVER
USE master;
GO
EXEC sp_configure 'show advanced option', '1';
GO
RECONFIGURE
GO
EXEC sp_configure 'Ad Hoc Distributed Queries', '1';
GO
RECONFIGURE
GO
=> Test
SELECT objectGUID,givenName,initials ,sn,company,telephoneNumber,mail
FROM OPENQUERY
(
ADSI,'SELECT objectGUID,givenName,initials ,sn,company,telephoneNumber,mail
FROM ''LDAP://NomDuServeurActiveDirectory.MonDomaine.com''
WHERE objectCategory = ''Person'' AND objectClass = ''user''
')
On peut donc créer une vue SQL avec le SELECT ci-dessus pour alimenter une table temporaire TMP_EMPLOYE.
Cette dernière servira donc à mettre à jour la table EMPLOYE.
Voici une petite liste des correspondances entre les informations de l’IHM de l’AD et les attributs (utiliser dans la requête SQL)
Comment obtenir la liste exhaustive des attributs de l’AD ? les types ? les description,… ?
Richard L. Mueller a fait un excellent travail sur le sujet. Que vous pouvez télécharger ici
En situation de production,il peut y avoir quelques limitations côté AD.
=> Limitation AD
Si la requête doit renvoyer plus de 1 000 éléments de l’Active Directory il faut configurer le MaxPageSize de l’AD. Par défaut MaxPageSize est fixé à 1000. Cette valeur contrôle le nombre maximal d’objets de l’Active Directory retournés par la requête. Ce nombre est indépendant de la taille des objets retournés. Ainsi si plus de 1 000 éléments sont renvoyés, Active Directory voit cette valeur maximale et ne renvoie rien et SQL SERVER va vous renvoyer un message d’erreur très vague… du genre « échec lors de la préparation de la requête SELECT … ».
Dans ce cas il faut donc configurer le MaxPageSize .
Deux possibilités pour configurer le MaxPageSize. En utilisant l’IHM de ADSIEdit ou en ligne de commande avec ntdsutil
=> Modifier MaxPageSize en utilisant ADSIEdit
1. Cliquez sur Démarrer, puis sur Exécuter.
2. Dans la zone Ouvrir, tapez adsiedit.msc, puis appuyez sur ENTRÉE
3. Allez dans Configuration > Services > Windows NT > Directory Service > Query Policies
4. Dans la fenêtre à droite clique droit sur l’objet Default Query Policy object
6. Double-cliquez sur l’attribut lDAPAdminLimits
7. Cliquez sur MaxPageSize
8. Cliquez sur le bouton Remove.
9. Changer la valeur qui s’affiche et cliquez sur le bouton Add
10. Cliquez sur OK puis OK.
/!\ Attention, la valeur par défaut de MaxPageSize est bien 1000, dans mes copies d’écran on voit 100. A vous d’imposer la valeur qui vous convient même si MS suggère de ne pas changer cette valeur sans le consulter. Mais bon …
=> Modifier MaxPageSize en utilisant ntdsutil
Cliquez sur Démarrer, puis sur Exécuter.
Dans la zone Ouvrir, tapez ntdsutil, puis appuyez sur ENTRÉE
A l’invite de commande, tapez LDAP Policies
Ensuite, exécuter les commandes ci-dessous
ldap policy: connections
server connections: connect to server NomDuServeurActiveDirectory.MonDomaine.com
Binding to NomDuServeurActiveDirectory.MonDomaine.com …
Connected to NomDuServeurActiveDirectory.MonDomaine.com using credentials of locally logged on user.
server connections: q
ldap policy: show values
— Résultat
Policy Current(New)
MaxPoolThreads 4
MaxDatagramRecv 4096
MaxReceiveBuffer 10485760
InitRecvTimeout 120
MaxConnections 5000
MaxConnIdleTime 900
MaxPageSize 1000
MaxQueryDuration 120
MaxTempTableSize 10000
MaxResultSetSize 262144
MaxNotificationPerConn 5
MaxValRange 1500
ldap policy: set MaxPageSize to 10000
ldap policy: show values
— Résultat : Noter que la valeur entre parenthèse n’est pas encore appliqué. Il faut ensuite commiter
Policy Current(New)
MaxPoolThreads 4
MaxDatagramRecv 4096
MaxReceiveBuffer 10485760
InitRecvTimeout 120
MaxConnections 5000
MaxConnIdleTime 900
MaxPageSize 1000 (10000)
MaxQueryDuration 120
MaxTempTableSize 10000
MaxResultSetSize 262144
MaxNotificationPerConn 5
MaxValRange 1500
ldap policy: commit changes
ldap policy: show values
–Résultat
Policy Current(New)
MaxPoolThreads 4
MaxDatagramRecv 4096
MaxReceiveBuffer 10485760
InitRecvTimeout 120
MaxConnections 5000
MaxConnIdleTime 900
MaxPageSize 10000
MaxQueryDuration 120
MaxTempTableSize 10000
MaxResultSetSize 262144
MaxNotificationPerConn 5
MaxValRange 1500
–Et pour sortir
ldap policy: q
C:\WINDOWS\system32\ntdsutil.exe:
Happy queries to all !
———————————–
Etienne ZINZINDOHOUE
———————————–