2009-07-24 3 views
1

Je tente d'interroger Active Directory à partir d'une procédure stockée à l'aide d'OPENQUERY et d'ajouter les valeurs à une table temporaire. J'ai tout fonctionne, sauf quand j'ajoute le champ 'proxyAddresses' à ma requête, il renvoie cette erreur:Recherche d'adresses électroniques autres que les adresses primaires dans Active Directory

"OLE DB erreur trace [Fournisseur OLE/DB 'ADSDSOOBject' IRowset :: GetData retourné 0x80040e21: Données état renvoyé par le fournisseur: [COLUMN_NAME = proxyAddresses STATUS = DBSTATUS_E_CANTCONVERTVALUE]]. Msg 7346, niveau 16, état 2, ligne 2 Impossible d'obtenir les données de la ligne à partir du fournisseur OLE DB 'ADSDSOOBject'. valeur des données pour des raisons autres que la non-concordance ou le dépassement de signe. "

Est-ce que quelqu'un a déjà eu l'expérience de l'interrogation de la propriété 'ProxyAddresses' de SQL? Je pense que j'ai lu quelque part qu'il a été renvoyé en tant que tableau. Peut-être que c'est le problème?

Merci!

Répondre

2

Je suppose que le problème ici est que proxyAddresses peut être multivalué (c'est-à-dire qu'il contient plusieurs valeurs) et je suppose que OPENQUERY dans SQL Server ne peut pas gérer cela. Je ne sais pas si vous pouvez faire quelque chose pour que cela fonctionne vraiment.

trouvé cela dans un article on CodeProject qui semble confirmer mes soupçons et:

Limits

Unfortunately, there are some Active Directory values that can’t be read with the ADSI linked servers. Those values are called “Array Values”. Array values in the Active Directory are fields that allow to insert unlimited multiple values. For example, if you store multiple phone numbers in the Active Directory General tab under “Telephone numbers/Other…”, you won’t be able to read those via ADSI into your SQL Server.

Pouvez-vous ignorer cette requête et pour les adresses en C#? Je pourrais vous montrer un échantillon de cela.

Marc

MISE À JOUR:
OK, voici la mise à jour avec la méthode pour saisir un attribut à plusieurs valeurs dans une liste de chaînes (en supposant que vous avez déjà un DirectoryEntry qui représente l'utilisateur):

public List<string> GetMultiValues(DirectoryEntry entry, string propertyName) 
{ 
    if(entry == null) 
    { 
    return null; 
    } 

    List<string> results = new List<string>(); 

    if (entry.Properties.Contains(propertyName)) 
    { 
    foreach (object propertValue in entry.Properties[propertyName]) 
    { 
     results.Add(propertValue.ToString()); 
    } 
    } 

    return results; 
} 

Vous pouvez maintenant appelé cette fonction comme ceci:

List<string> proxyAddresses = GetMultiValues(userEntry, "proxyAddresses"); 
+0

Oui. Je pense que je vais devoir le faire en C#. Convient-il de poster cet échantillon s'il vous plaît? Merci. –

0

Avez-vous essayé de CAST le champ proxyAddresses manuellement dans votre déclaration OPENQUERY?

Questions connexes