2010-08-12 4 views
4

Je tente d'interroger AD dans une application ASP.Net (4.0) qui s'exécute sur Windows Server 2008 R2 (IIS7 installé). (Il échoue également lors de l'exécution en tant qu'application 2.0)Impossible d'interroger AD (obtenir une exception DirectoryServicesCOMException)

Ce n'est pas nouveau pour moi, comme je l'ai fait plusieurs fois auparavant. J'ai écrit un petit programme ASP.Net qui tourne bien sur ma propre machine (Windows XP avec IIS6), mais échoue lorsqu'il est exécuté sur la boîte 2008.

(Le résultat est que vous voyez une liste des groupes auxquels l'utilisateur est membre dans une zone de texte)

(on button_click) 
var userName = txtUserName.Text; 

if (userName.Trim().Length == 0) 
{ 
    txtResults.Text = "-- MISSING USER NAME --"; 
    return; 
} 

var entry = new DirectoryEntry("LDAP://blah.blah/DC=blah,DC=blah", 
           "cn=acct, dc=blah, dc=blah", 
           "pass"); 

var search = new DirectorySearcher(entry); 
search.Filter = "(SAMAccountName=" + userName + ")"; 
search.PropertiesToLoad.Add("memberOf"); 

var groupsList = new StringBuilder(); 

var result = search.FindOne(); 

if (result != null) 
{ 
    int groupCount = result.Properties["memberOf"].Count; 

    for (int counter = 0; counter < groupCount; counter++) 
    { 
      groupsList.Append((string)result.Properties["memberOf"][counter]); 
      groupsList.Append("\r\n"); 
    } 
} 

txtResults.Text = groupsList.ToString(); 

Quand je lance ce code, je reçois l'erreur suivante sur search.FindOne():

System.DirectoryServices.DirectoryServicesCOMException (0x8007203B): A local error has occurred. 

    at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail) 
    at System.DirectoryServices.DirectoryEntry.Bind() 
    at System.DirectoryServices.DirectoryEntry.get_AdsObject() 
    at System.DirectoryServices.DirectorySearcher.FindAll(Boolean findMoreThanOne) 
    at System.DirectoryServices.DirectorySearcher.FindOne() 
    at WebApplication1._Default.btnSearch_Click(Object sender, EventArgs e) 

Nous avons fait beaucoup de recherches sur ce sujet et nous avons modifié tous les paramètres IIS7 auxquels nous pouvons penser, mais pas pour autant. Des indices?

Répondre

3

Modifiez le paramètre nom d'utilisateur de "cn = xxx, dc = yyy, dc = zzz" à "Domaine \ Nom d'utilisateur"

+0

qui fonctionne! Merci! – KevinDeus

+0

Avait le même problème sur Windows 7, mais il fonctionne très bien sur WinXP. Heureusement, mon collègue m'a envoyé ce post. Merci. – Ghazaly

0

Vous pouvez également modifier le pool d'applications IIS pour exécuter un compte de domaine avec les privilèges de requête que vous recherchez.

J'ai quelques autres commentaires ainsi:

  1. Assurez-vous que la première entrée pour le constructeur DirectoryEntry comprend le conteneur pour les utilisateurs aussi bien. Cela devrait aider DirectorySearcher à travailler de manière plus fiable.
  2. Je crois que le deuxième paramètre dans le constructeur DirectoryEntry devrait être le nom d'utilisateur, pas le chemin de requête AD.
  3. Vous devez également définir la propriété AuthenticationType. Avec Server 2008, par défaut, il doit être défini sur AuthenticationTypes.Secure | AuthenticationTypes.ServerBind | AuthenticationTypes.Sealing. Je suppose que 2008R2 a une exigence similaire.
0

Je vois que la question est assez vieux, mais après avoir lutté avec ce que je pensais pour mentionner qu'il est en effet possible d'utiliser le style LDAP du nom d'utilisateur (contrairement au style DNS). Cela fonctionne bien pour moi:

string connString = "LDAP://MyDomain/CN=blah,DC=blah,DC=blah"; 
    string username = "CN=MyAdmin,CN=Users,CN=blah,DC=blah,DC=blah"; 
    string password = "myLittleSecret"; 
    DirectoryEntry root = new DirectoryEntry(
     connString, 
     username, 
     password, 
     AuthenticationTypes.None); 

MyAdmin est membre dans le rôle Administrators.

Une petite chose qui m'a pris un moment pour trouver est le paramètre AuthenticationTypes.None qui est nécessaire si vous ne voulez pas communiquer via SSL. Sûrement, vous voulez le faire en production, mais à des fins de développement, il peut être OK pour passer le cryptage.

Environnement: Windows 7

0

je suis également obtenir cette exception quand essayé d'interroger le répertoire actif:

SearchResult result = srch.FindOne(); 

Pour résoudre ce problème, il suffit de mettre le code ci-dessus à l'intérieur Security.RunWithElevatedPrivileges().

Solution finale:

SPSecurity.RunWithElevatedPrivileges(delegate() 
{ 
    result = srch.FindOne(); 
}); 
Questions connexes