Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/08/2011, 18h34   #1
Invité de passage
 
Homme Antoine TAVERNIER
Ingénieur développement logiciels
Inscription : mars 2006
Messages : 5
Détails du profil
Informations personnelles :
Nom : Homme Antoine TAVERNIER
Âge : 29
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Industrie

Informations forums :
Inscription : mars 2006
Messages : 5
Points : 1
Points : 1
Envoyer un message via MSN à ToNu$
Par défaut Problème avec le provider ADSDSOObject sur SQL Server 2005 hosté sur HyperV

Bonjour à tous,

Depuis quelques temps déjà, j'utilise un serveur lié vers Active Directory depuis un serveur SQL 2005. Ainsi, je suis en mesure d'envoyer des requêtes à l'Active Directory sous la forme suivante :
Citation:
SELECT
*
FROM OPENQUERY(LinkedServerName, '
SELECT
sAMAccountName
, manager
, company
, department
, givenname
, sn
, usncreated
, mail
FROM ''LDAP://ServerName/DC=DNSDomainName''
where objectClass = ''User'' ORDER BY usncreated')
WHERE sn IS NOT NULL OR GIVENNAME IS NOT NULL
order by sn
Or je possède actuellement 2 serveurs SQL. Le premier est un serveur physique et ne me pose aucun soucis. Par contre, le second est un Windows server 2008 virtuel hébergé sur une couche HyperV, elle même gérée par Windows server 2008. Ce dernier possède un serveur SQL 2005.

J'ai alors voulu créer mon serveur lié vers Active Directory avec un script SQL:
Citation:
EXEC master.dbo.sp_addlinkedserver @server = N'ServerName', @srvproduct=N'Active Directory Services 2.5', @provider=N'ADSDSOObject', @datasrc=N'adsdatasource'
/* For security reasons the linked server remote logins password is changed with ######## */
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'ServerName', @useself=N'False', @locallogin=NULL, @rmtuser=N'Domain\CompteService', @rmtpassword='########'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'ServerName', @useself=N'False', @locallogin=N'Domain\CompteService', @rmtuser=N'CN=CompteService,DC=ServerName,DC=DNSDomainName,DC=net',
@rmtpassword='########'

GO
EXEC master.dbo.sp_serveroption @server=N'ServerName', @optname=N'collation compatible', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ServerName', @optname=N'data access', @optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption @server=N'ServerName', @optname=N'dist', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ServerName', @optname=N'pub', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ServerName', @optname=N'rpc', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ServerName', @optname=N'rpc out', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ServerName', @optname=N'sub', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ServerName', @optname=N'connect timeout', @optvalue=N'0'
GO
EXEC master.dbo.sp_serveroption @server=N'ServerName', @optname=N'collation name', @optvalue=null
GO
EXEC master.dbo.sp_serveroption @server=N'ServerName', @optname=N'lazy schema validation', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ServerName', @optname=N'query timeout', @optvalue=N'0'
GO
EXEC master.dbo.sp_serveroption @server=N'ServerName', @optname=N'use remote collation', @optvalue=N'true'
Le script de création du serveur lié s'exécute correctement et le test de connexion depuis SQL Management Studio s'effectue correctement, donc le compte de service que j'utilise pour interroger l'AD est correct

Par contre, lorsque j'envoie la requête SQL citée en haut de ce post, j'obtiens les différentes colonnes stipulées dans la clause de 'Select' et aucune ligne n'est remontée.
De plus, j'obtiens le message d'erreur suivant:
Citation:
Msg 7330, Niveau 16, État 2, Ligne 1
Impossible d'extraire une ligne du fournisseur OLE DB 'ADSDSOObject' du serveur lié 'LinkedServerName'.
Quelqu'un aurait-t-il une idée ? configuration du serveur SQL manquante ? couche HyperV pouvant poser soucis ? Incompatibilité entre SQL server 2005 et Windows server 2008 ?

J'avoue ne plus savoir où chercher donc si vous avez la moindre piste, d'avance, MERCI !

NB : pas la peine de me sortir un truc du genre 'demande à google', ça fait 3 jours que je cherche ... merci
ToNu$ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2011, 00h03   #2
Membre Expert
 
Homme Etienne ZINZINDOHOUE
Ingénieur développement
Inscription : mars 2010
Messages : 1 139
Détails du profil
Informations personnelles :
Nom : Homme Etienne ZINZINDOHOUE
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur développement
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2010
Messages : 1 139
Points : 2 467
Points : 2 467
Envoyer un message via Yahoo à zinzineti
1. Que donne la requête suivante :

Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT 
givenname
, sn
, mail 
FROM OPENQUERY(LinkedServerName, '
SELECT 
givenname
, sn
, mail 
FROM ''LDAP://ServerName/DC=DNSDomainName'' 
where objectClass = ''User'' ')

2. Attention aux limitations de l'AD : Vérifier la valeur de MaxPageSize de l'AD

Par défaut MaxPageSize de l'AD a pour valeur 1000. Si ta requête doit ramener plus de 1000 lignes alors tu dois modifier la valeur du MaxPageSize de l'AD. Pour plus de détails voir ici

3. l'AD est hébergé sous du WINDOWS 2003 ou WINDOWS 2008 ?
__________________
Etienne ZINZINDOHOUE
Billets-Articles
zinzineti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2011, 08h44   #3
Invité de passage
 
Homme Antoine TAVERNIER
Ingénieur développement logiciels
Inscription : mars 2006
Messages : 5
Détails du profil
Informations personnelles :
Nom : Homme Antoine TAVERNIER
Âge : 29
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Industrie

Informations forums :
Inscription : mars 2006
Messages : 5
Points : 1
Points : 1
Envoyer un message via MSN à ToNu$
Salut,

1. La requète que tu me fournis renvoie 901 lignes, mais se terminent par exactement le même message d'erreur.

2. J'étais au courant que l'AD possédait une limitation concernant le nombre de liignes mais ceci ne devrait pour autant pas me fournir ce message d'erreur.

3. Le serveur AD est hébergé sous Windows server 2003.

Merci pour ton aide.
ToNu$ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2011, 10h13   #4
Membre Expert
 
Homme Etienne ZINZINDOHOUE
Ingénieur développement
Inscription : mars 2010
Messages : 1 139
Détails du profil
Informations personnelles :
Nom : Homme Etienne ZINZINDOHOUE
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur développement
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2010
Messages : 1 139
Points : 2 467
Points : 2 467
Envoyer un message via Yahoo à zinzineti
Citation:
Envoyé par ToNu$ Voir le message
Salut,

1. La requète que tu me fournis renvoie 901 lignes, mais se terminent par exactement le même message d'erreur.

2. J'étais au courant que l'AD possédait une limitation concernant le nombre de liignes mais ceci ne devrait pour autant pas me fournir ce message d'erreur.

3. Le serveur AD est hébergé sous Windows server 2003.

Merci pour ton aide.

--> Dans mon cas autour de 950 lignes, j'étais obligé de changer le MaxPageSize pour obtenir normalement mes résultats.

--> Il faut respecter la casse, dans ta requête tu as :
"givenname" dans ton SELECT et "GIVENNAME" dans ton WHERE

--> Aussi si mes souvenirs sont bons les IS NOT NULL ou IS NULL ne marchent pas directement dans le query avec l'AD.

Tu peux contourner ces prolèmes en créant une vue SQL. (create view ...)

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE VIEW MaVue
AS 
SELECT 
givenname
, sn
, mail 
FROM OPENQUERY(LinkedServerName, '
SELECT 
givenname
, sn
, mail 
FROM ''LDAP://ServerName/DC=DNSDomainName'' 
where objectClass = ''User'' ')
et après faire tes requête SQL normalement sur cette vue là
Code :
1
2
3
4
5
SELECT givenname
, sn
, mail  
FROM MaVue
WHERE sn IS NOT NULL OR givenname IS NOT NULL
--> As-tu essayer de faire un filtre dans ta requête histoire de tester un user particulier ? Exemple

Code :
1
2
3
4
5
6
7
8
9
10
11
12
SELECT 
givenname
, sn
, mail 
FROM OPENQUERY(LinkedServerName, '
SELECT 
givenname
, sn
, mail 
FROM ''LDAP://ServerName/DC=DNSDomainName'' 
where objectClass = ''User'' AND objectCategory = ''Person'' AND sn = 'toto' ')
__________________
Etienne ZINZINDOHOUE
Billets-Articles
zinzineti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2011, 10h50   #5
Invité de passage
 
Homme Antoine TAVERNIER
Ingénieur développement logiciels
Inscription : mars 2006
Messages : 5
Détails du profil
Informations personnelles :
Nom : Homme Antoine TAVERNIER
Âge : 29
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Industrie

Informations forums :
Inscription : mars 2006
Messages : 5
Points : 1
Points : 1
Envoyer un message via MSN à ToNu$
Citation:
Envoyé par zinzineti Voir le message
--> Il faut respecter la casse, dans ta requête tu as :
"givenname" dans ton SELECT et "GIVENNAME" dans ton WHERE

[...]

--> As-tu essayer de faire un filtre dans ta requête histoire de tester un user particulier ? Exemple

Code :
1
2
3
4
5
6
7
8
9
10
11
12
SELECT 
givenname
, sn
, mail 
FROM OPENQUERY(LinkedServerName, '
SELECT 
givenname
, sn
, mail 
FROM ''LDAP://ServerName/DC=DNSDomainName'' 
where objectClass = ''User'' AND objectCategory = ''Person'' AND sn = 'toto' ')
Je crois savoir que, dans le cas de ma query, la casse ne change rien, car la clause :
Code :
WHERE sn IS NOT NULL OR GIVENNAME IS NOT NULL
Cette dernière est appliquée par SQL Server et n'est pas envoyé à l'AD. Seul le contenu du OPENQUERY est envoyée auprès de l'AD, le reste, la clause WHERE et ORDER, est appliqué en mémoire par SQL Server lorsque ce dernier reçoit le résultat.

Par contre, comme tu me l'a souligné, j'ai essayé d'appliquer un filtre directement dans la clause 'where' envoyé auprès de l'AD, un truc du genre :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
SELECT 
givenname
, sn
, mail 
FROM OPENQUERY(LinkedServerName, '
SELECT 
givenname
, sn
, mail 
FROM ''LDAP://ServerName/DC=DNSDomainName'' 
where objectClass = ''User'' and sn= ''myNTName''')
J'obtiens un résultat correct, et SANS message d'erreur !
Par conséquent, je pense que le soucis doit directement provenir des données renvoyées par l'AD. Un caractère spécial non reconnu par le provider qui le fait d'ailleurs planté ...

Je vais continuer à investiguer dans ce sens. Et encore pour ton aide !!!
ToNu$ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2011, 12h00   #6
Membre Expert
 
Homme Etienne ZINZINDOHOUE
Ingénieur développement
Inscription : mars 2010
Messages : 1 139
Détails du profil
Informations personnelles :
Nom : Homme Etienne ZINZINDOHOUE
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur développement
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2010
Messages : 1 139
Points : 2 467
Points : 2 467
Envoyer un message via Yahoo à zinzineti
Quel est le résultat de la requête ci-dessous ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SELECT 
sAMAccountName
, manager
, company
, department
, givenname
, sn
, usncreated
, mail 
FROM OPENQUERY(LinkedServerName, '
SELECT 
sAMAccountName
, manager
, company
, department
, givenname
, sn
, usncreated
, mail 
FROM ''LDAP://ServerName/DC=DNSDomainName'' 
where objectClass = ''User'' and sn= ''myNTName''')
__________________
Etienne ZINZINDOHOUE
Billets-Articles
zinzineti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2011, 12h17   #7
Invité de passage
 
Homme Antoine TAVERNIER
Ingénieur développement logiciels
Inscription : mars 2006
Messages : 5
Détails du profil
Informations personnelles :
Nom : Homme Antoine TAVERNIER
Âge : 29
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Industrie

Informations forums :
Inscription : mars 2006
Messages : 5
Points : 1
Points : 1
Envoyer un message via MSN à ToNu$
ben j'obtiens une ligne correctement formatée avec les informations correspondantes à mon compte AD.

Et sans message d'erreur.

Voilà pourquoi je pense que l'AD possède une ligne qui fait totalement explosé le provider ADSDSOObject, pourquoi, je ne sais pas encore. Ma première impression s'orienterait vers un caractère spécial, mais ce n'est qu'une impression.

Je posterai dès que je trouve.
ToNu$ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2011, 14h29   #8
Membre Expert
 
Homme Etienne ZINZINDOHOUE
Ingénieur développement
Inscription : mars 2010
Messages : 1 139
Détails du profil
Informations personnelles :
Nom : Homme Etienne ZINZINDOHOUE
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur développement
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2010
Messages : 1 139
Points : 2 467
Points : 2 467
Envoyer un message via Yahoo à zinzineti
Citation:
Envoyé par ToNu$ Voir le message
ben j'obtiens une ligne correctement formatée avec les informations correspondantes à mon compte AD.

Et sans message d'erreur.

Voilà pourquoi je pense que l'AD possède une ligne qui fait totalement explosé le provider ADSDSOObject, pourquoi, je ne sais pas encore. Ma première impression s'orienterait vers un caractère spécial, mais ce n'est qu'une impression.

Je posterai dès que je trouve.
Possible qu'il y ait des caractères qui bloquent l'exécution du query. [une extraction des infos de l'AD dans un fichier Excel peut permettre de rechercher la (les) bête(s) noire(s) ]

Mais avant si tu as la main sur l'AD augmente la valeur du MaxPageSize puis exécute ton query pour voir ...

Si l'augmentation de la valeur du MaxPageSize ne change rien tu peux toujours remettre la valeur initiale.

Du courage
__________________
Etienne ZINZINDOHOUE
Billets-Articles
zinzineti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2011, 10h56   #9
Invité de passage
 
Homme Antoine TAVERNIER
Ingénieur développement logiciels
Inscription : mars 2006
Messages : 5
Détails du profil
Informations personnelles :
Nom : Homme Antoine TAVERNIER
Âge : 29
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Industrie

Informations forums :
Inscription : mars 2006
Messages : 5
Points : 1
Points : 1
Envoyer un message via MSN à ToNu$
Alors je n'ai finalement pas réussi à identifier le(s) caractère(s) qui pouvait m'empêcher de faire fonctionner cette requête.

La seule parade que j'ai pu mettre en place a été de filtrer ma requête suivant l'adresse email. Ainsi, je me suis assuré de ne récupérer dans le résultat que les comptes correspondants aux employés de l'entreprise.

Encore merci pour l'aide apportée
ToNu$ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2011, 16h13   #10
Membre Expert
 
Homme Etienne ZINZINDOHOUE
Ingénieur développement
Inscription : mars 2010
Messages : 1 139
Détails du profil
Informations personnelles :
Nom : Homme Etienne ZINZINDOHOUE
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur développement
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2010
Messages : 1 139
Points : 2 467
Points : 2 467
Envoyer un message via Yahoo à zinzineti
Citation:
Envoyé par ToNu$ Voir le message
Alors je n'ai finalement pas réussi à identifier le(s) caractère(s) qui pouvait m'empêcher de faire fonctionner cette requête.

La seule parade que j'ai pu mettre en place a été de filtrer ma requête suivant l'adresse email. Ainsi, je me suis assuré de ne récupérer dans le résultat que les comptes correspondants aux employés de l'entreprise.

Encore merci pour l'aide apportée

Tu peux aussi charger progressivement tous les employés par ordre alphabétique en fonction du nom de famille (sn) dans une table en faisant :

Code :
1
2
.....
WHERE objectClass = ''User'' AND objectCategory = ''Person'' AND sn LIKE ''a%'' '
ensuite

Code :
1
2
.....
WHERE objectClass = ''User'' AND objectCategory = ''Person'' AND sn LIKE ''b%'' '
....

Code :
1
2
.....
WHERE objectClass = ''User'' AND objectCategory = ''Person'' AND sn LIKE ''z%'' '
Puis enfin mettre en place juste un Update (quotidien par exemple) de cette table.
__________________
Etienne ZINZINDOHOUE
Billets-Articles
zinzineti est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h47.


 
 
 
 
Partenaires

Hébergement Web