IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Problème avec le provider ADSDSOObject sur SQL Server 2005 hosté sur HyperV


Sujet :

Développement SQL Server

  1. #1
    Candidat au Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2006
    Messages : 5
    Points : 2
    Points
    2
    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 :
    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:
    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:
    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

  2. #2
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    1. Que donne la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  3. #3
    Candidat au Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    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.

  4. #4
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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' ')

  5. #5
    Candidat au Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !!!

  6. #6
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    Quel est le résultat de la requête ci-dessous ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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''')

  7. #7
    Candidat au Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    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.

  8. #8
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    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

  9. #9
    Candidat au Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    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

  10. #10
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    .....
    where objectClass = ''User'' AND objectCategory = ''Person'' AND sn LIKE ''a%'' '
    ensuite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    .....
    where objectClass = ''User'' AND objectCategory = ''Person'' AND sn LIKE ''b%'' '
    ....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

Discussions similaires

  1. Travailler sur SQL Server en connecté, sur sql compact en nomade
    Par laumon dans le forum Entity Framework
    Réponses: 7
    Dernier message: 02/02/2012, 12h18
  2. sauvegarde sur sql server express restauration sur sql server
    Par denisa dans le forum Administration
    Réponses: 5
    Dernier message: 30/06/2010, 19h10
  3. Réponses: 8
    Dernier message: 09/02/2007, 13h58
  4. sql-server 2000 généralités sur sql-server ( débutant)
    Par ducho dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 28/02/2006, 19h10
  5. [SQL-Server] Problème avec odbc et ma connexion SQL Server
    Par vodevil dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 09/12/2005, 11h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo