Comment prévenir DirectoryOperationException - Le serveur ne peut pas traiter les requêtes de répertoire

J'essaie d'écrire une méthode utilitaire pour mettre à jour les attributs de l'ANNONCE (juste valeur unique attributs de la chaîne pour le moment) en C#. C'est un utilitaire autonome qui ne dépend pas de IIS. Cette méthode sera utilisée pour charger des données à partir de nos systèmes de RH dans notre ANNONCE.

Je suis capable de lire, d'objets et d'attributs de l'utilisation efficace de Système.DirectoryServices.Les protocoles. mais quand je l'appelle la ModifyRequest méthode, j'obtiens un DirectoryOperationException avec le message "Le serveur ne peut pas traiter les requêtes de répertoire".

Basé sur un autre Débordement de Pile question:
.Net Annuaire des Services lance une étrange exception

J'ai essayé d'utiliser le port 636 pour SSL LDAP, mais il ne change pas le comportement.

Je ne suis pas à l'aide de IIS et je suis sur .NET 4.5, donc le patch Microsoft pour .NET/IIS ne devrait pas s'appliquer.

Googler sur ce qui a été vains.

Si vous savez pourquoi cette erreur se produit, et comment le résoudre, je vous en serais très reconnaissant.

Code ci-dessous.. veuillez supposer que Conn contient un valide et l'authentification de la connexion LDAP à partir de l'affichage de l'utilitaire de classe--je peux fournir la source complète de l'affichage de l'utilitaire de classe, si elle est nécessaire.

L'exception se produit sur la SendRequest ligne dans ModifyStringAttributeValues:

using System;
using System.Collections.Generic;
using System.DirectoryServices.Protocols;
using System.Net;
namespace MyOrganization.Common.Ldap
{
public class LdapSession
{
public bool UseKerberos { set; get; }
public String Host { set; get; }
public String UserId { set; get; }
public String Password { set; get; }
public String Tag { set; get; }
public int Port { set; get; }
public const int DefaultLdapPort = 389;
protected LdapConnection Conn;
public void EstablishV2()
{
}
public void Establish()
{
var effectivePort = Port == 0 ? DefaultLdapPort : Port;
Console.WriteLine("EffectivePort={0}", effectivePort);
var identifier = new LdapDirectoryIdentifier(Host, effectivePort);
if (UseKerberos)
{
Conn = new LdapConnection(identifier)
{
AuthType = AuthType.Kerberos,
Timeout = new TimeSpan(0, 10, 0, 0),
SessionOptions =
{
ProtocolVersion = 3,
VerifyServerCertificate =
new VerifyServerCertificateCallback((con, cer) => true),
SecureSocketLayer = true
}
};
}
else
{
Conn = new LdapConnection(identifier)
{
AuthType = AuthType.Basic,
Timeout = new TimeSpan(0, 10, 0, 0)
};
//Console.WriteLine("LPA:  Binding with {0}, {1}", UserId, Password); //QUARTZ
Conn.Bind(new NetworkCredential(UserId, Password));
}
}
public IEnumerable<SearchResultEntry> Search(string cx, string filter, SearchScope searchScope, params string[] attrib)
{
var s = new SearchRequest(cx, filter, searchScope, attrib)
{
SizeLimit = 0,
TimeLimit = new TimeSpan(1, 0, 0) //One hour, zero minutes, zero seconds
};
var raw = Conn.SendRequest(s);
if (raw == null)
{
throw new Exception("null response");
}
var r = raw as SearchResponse;
if (r != null)
{
//Console.WriteLine(Tag + "Search response entries: {0}", r.Entries.Count); //QUARTZ
foreach (SearchResultEntry e in r.Entries)
{
yield return e;
}
}
else
{
//Console.WriteLine(Tag + "Search response was null" ); //QUARTZ
}
yield break;
}
public ResultCode ModifyStringAttributeValues(string dn, IDictionary<string, string> modifications)
{
//declare the request and response objects here
//they are used in two blocks
ModifyRequest modRequest;
ModifyResponse modResponse;
try
{
//initialize the modRequest object 
modRequest =
new ModifyRequest(dn);
modRequest.Controls.Add(new PermissiveModifyControl());
var mods = new DirectoryAttributeModification[modifications.Count];
int z = 0;
foreach (var pair in modifications)
{
var mod = new DirectoryAttributeModification();
mod.Operation = DirectoryAttributeOperation.Replace;
mod.Name = pair.Key;
mod.Add(pair.Value);
mods[z] = mod;
z += 1;
}
//cast the returned directory response into a ModifyResponse type 
//named modResponse
modResponse =
(ModifyResponse)Conn.SendRequest(modRequest);
return modResponse.ResultCode;
}
catch (Exception e)
{
Console.WriteLine("\nUnexpected exception occured:\n\t{0}: {1}",
e.GetType().Name, e.Message);
return ResultCode.Unavailable;
}
}
}
}

Je sais que le code est un peu maladroit, et plein d'étranges commentaires--il est coupé, collé et modifié à partir de l'exemple de code sur le site de Microsoft, alors que je reçois ce travail.

Je me demandais aussi pourquoi vous avez besoin de la PermissiveModifyControl. Avez-vous essayé sans elle ? stackoverflow.com/q/3450732/1236044
Avez-vous trouvé la réponse à votre problème ? (La finition d'un C# - redhat LDAP DS et je pourrais avoir une ANNONCE LDAP projet à venir, donc je suis à la recherches des infos 😉 Certaines personnes des conseils pour augmenter, si possible, le niveau de log sur le serveur de publicité comme "Le serveur ne peut pas traiter les requêtes de répertoire" comme dirait une ANNONCE générique d'erreur

OriginalL'auteur SAJ14SAJ | 2012-11-21