Système.DirectoryServices.DirectoryServicesCOMException: une erreur d'exploitation s'est produite
j'ai la même application web qui fonctionne sur trois autres serveurs. Quelqu'un sait pourquoi le 4ème serveur ne fonctionne pas? Voir l'erreur et stactrace:
une erreur d'exploitation s'est produite.
Description: la demande web actuelle. S'il Vous Plaît, passez en revue la trace de la pile pour plus informations sur l'erreur et son origine code.
Détails De L'Exception:
Système.DirectoryServices.DirectoryServicesCOMException: une opération erreur s'est produite.Source D'Erreur:
une exception non freinée a été générée lors de l'exécution de la demande web actuelle. Informations concernant l'origine et l'emplacement de l'exception peut être identifié en utilisant la trace de la pile d'exceptions ci-dessous.
Trace De La Pile:
[DirectoryServicesCOMException (0x80072020): une erreur d'exploitation produire. ] Système.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail) + 454 système.DirectoryServices.DirectoryEntry.Lier() + 36 système.DirectoryServices.DirectoryEntry.get_AdsObject () + 31 Système.DirectoryServices.PropertyValueCollection.PopulateList() +22
Système.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry entry, String propertyName) +96
Système.DirectoryServices.PropertyCollection.Get_item (chaîne de caractères) propertyName) + 142 Système.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInitNoContainer() +1134 système.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit() + 37 système.DirectoryServices.AccountManagement.PrincipalContext.Initialiser() + 124 système.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx() + 31 système.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper(PrincipalContext contexte, Type principalType, Nullable ' 1 identityType, String identityValue, DateTime refDate) +14
Système.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType(PrincipalContext le contexte, le Type de principalType, Chaîne identityValue) +73
Système.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext contexte, String identityValue) +25
Infraero.TINE3.STTEnterprise.Web.Commun.Seguranca.ServicoAutenticacao.EfetuarLogin(AcessoUsuario acessoUsuario, String senha) en D:SVNSTTtrunk4-0_CodigoFonte_Enterprise4-4_SRCInfraero.TINE3.STTEnterprise.WebCommonSegurancaServicoAutenticacao.cs: 34 Infraero.TINE3.STTEnterprise.Web.Contrôleur.LoginController.ValidarUsuarioAD (Chaîne matricula, String senha, AcessoUsuario acessoUsuario) en D:SVNSTTtrunk4-0_CodigoFonte_Enterprise4-4_SRCInfraero.TINE3.STTEnterprise.WebControllersLoginController.cs: 92 Infraero.TINE3.STTEnterprise.Web.Contrôleur.LoginController.ValidarUsuario (Chaîne matricula, Chaîne senha) D:SVNSTTtrunk4-0_CodigoFonte_Enterprise4-4_SRCInfraero.TINE3.STTEnterprise.WebControllersLoginController.cs: 80 Infraero.TINE3.STTEnterprise.Web.Contrôleur.LoginController.Indice (LoginViewModel loginViewModel) dans D:SVNSTTtrunk4-0_CodigoFonte_Enterprise4-4_SRCInfraero.TINE3.STTEnterprise.WebControllersLoginController.cs: 54 méthode lambda_method(fermeture , base de contrôle , objet)[] ) +108
Système.Web.Mvc.Actionnezmethoddispatcher.Execute(ControllerBase contrôleur, Object[] paramètres) +17
Système.Web.Mvc.ReflectedActionDescriptor.Exécution (ControllerContext controllerContext, IDictionary ' 2 parameters) +208
Système.Web.Mvc.ControllerActionInvoker.Méthode D'Intervention (Controllercontentext) controllerContext, ActionDescriptor actionDescriptor, IDictionary " 2 paramètres) + 27
Système.Web.Mvc. C__DisplayClass15.b _ _ 12() + 55 système.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter (IActionFilter filter, ActionExecutingContext précontext, Func'1 continuation) +263
Système.Web.Mvc. C__DisplayClass17.b _ _ 14() +19 Système.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList ' 1 filtres, ActionDescriptor actionDescriptor, 2 paramètres) + 191
Système.Web.Mvc.ControllerActionInvoker.InvokeAction (ControllerContext controllerContext, String actionName) +343
Système.Web.Mvc.Contrôleur.ExecuteCore () +116
Système.Web.Mvc.ControllerBase.Exécuter (RequestContext requestContext) + 97 système.Web.Mvc.ControllerBase.Système.Web.Mvc.IController.Execute(RequestContext requestContext) +10
Système.Web.Mvc.C__DisplayClassb.b _ _ 5 () +37
Système.Web.Mvc.Asynchrone. C__DisplayClass1.b__0() +21
Système.Web.Mvc.Asynchrone. C__DisplayClass8'1.b _ _ _ 7 (IAsyncResult _ ) +12 Système.Web.Mvc.Asynchrone.WrappedAsyncResult " 1.Fin() +62 Système.Web.Mvc. C__DisplayClasse.b _ _ d() +50
Système.Web.Mvc.SecurityUtil.b _ _ 0 (Action F) +7 Système.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action Action) +22 système.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +60
Système.Web.Mvc.MvcHandler.Système.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult résultat) +9
Système.Web.Callhandlerexécutionstep.Système.Web.HttpApplication.IExecutionStep.Exécuter() +8963149Web.HttpApplication.ExecuteStep (IExecutionStep step, Boolean& completedSynchronously) +184
Méthode EfetuarLogin:
public static bool EfetuarLogin(User user, string password)
{
bool isValid = false;
if (user != null)
{
PrincipalContext context = new PrincipalContext(ContextType.Domain);
using (context)
{
isValid = context.ValidateCredentials(user.Login, password);
if (isValid)
{
UserPrincipal userAD = UserPrincipal.FindByIdentity(context, user.Login);
MySession.CurrentUser = new MyUserSession()
{
Id = user.Id,
ProfileId = user.ProfileId ,
Login = user.Login ,
Name = userAD.Name
};
}
}
}
return isValid;
}
7 réponses
j'ai eu exactement la même erreur et je l'ai corrigée en changeant le pool d'applications du site pour fonctionner sous le service réseau.
In IIS:
- sélectionnez le bassin d'applications de votre site
- sélectionnez Paramètres avancés sur le côté droit
- dans la fenêtre pop-up des paramètres avancés, faites défiler vers le bas jusqu'au groupe de Modèles de processus
- changer la première option appelée Identity en NetworkService (mine a été défini à L'ApplicationPoolIdentity par défaut).
j'espère que cette aide.
je sais que ce sujet est vieux, mais juste pour les futurs gens qui seront à la recherche de ce numéro Il suffit d'utiliser cette méthode pour exécuter le code avec les privilèges Elevate
using (HostingEnvironment.Impersonate()) {
// This code runs as the application pool user
}
dans mon cas, le passage de ApplicationPoolItentity à NetworkService dans le pool d'applications a fonctionné mais il n'a pas préféré "parce que les services qui fonctionnent comme un Service de réseau peuvent trafiquer avec d'autres services qui fonctionnent sous la même identité" par le lien suivant: ( http://www.iis.net/learn/manage/configuring-security/application-pool-identities ).
j'ai lancé le hotfix ( KB2545850 ) sur le serveur et rebooted selon cette réponse:( DirectoryServicesCOMException 80072020 From IIS 7.5 Site Running Under ApplicationPoolIdentity )
Il semble bien fonctionner maintenant.
ma tâche de Fond: Mise à niveau des applications de .net framework 2.0 sur Server 2003 vers .net framework 4.0 sur Server 2008 R2.
il n'y a pas de InnerException
dans ce cas, c'est juste une erreur de communication.
presque certainement parce que votre application Pool identity n'a pas la permission d'accéder à Active Directory .
mon expérience était un peu différente avec cette erreur. J'ai dû passer à L'application sur site à Azure, où L'appel LDAP se passait sur place, mais pas à partir D'Azure même après avoir ouvert le pare-feu requis.
j'ai essayé toutes les solutions mentionnées ci-dessus, mais aucune n'a été utile. Le service réseau était déjà sélectionné sur Azure VM.
après beaucoup de coups, d'essais et de recherches. Je l'ai corrigé.
Solution: Sur Place le serveur avait la permission d'accéder à LDAP et n'avait pas besoin de nom D'Utilisateur et de mot de passe. Mais sur Azure, vous devez spécifiquement faire appel LDAP avec nom d'utilisateur et mot de passe. Ci-dessous est le code qui a aidé.
var directoryEntry= new DirectoryEntry(adspath, Username, Password)
1 - demande de Changement de la piscine à exécuter dans le cadre du Réseau de Service.
2-Cliquez sur L'authentification et désactivez ASP.Net imitation.
donc si vous placez un point de rupture sur la ligne:
UserPrincipal userAD = UserPrincipal.FindByIdentity(context, user.Login);
et passer à travers elle, il génère l'exception ci-dessus qui n'a pas D'InnerExceptions?
, Selon la trace de la pile, c'est le début du problème. L'exception retournée devrait contenir au moins quelques autres renseignements sur la raison pour laquelle elle a été lancée.
InnerException Concatenator
la méthode suivante prend l'exception de haut niveau et retourne un onglet et une ventilation formatée en linebreak des exceptions internes comme une chaîne.
private static string InnerExceptionConcatenator(Exception ex, int tabTracker = 0)
{
string retVal = "";
if (ex.InnerException != null)
{
tabTracker ++;
retVal = string.Format( "{0}\r\n{1}{2}", ex.Message, new String('\t', tabTracker), InnerExceptionConcatenator(ex.InnerException));
}
else
{
retVal = ex.Message;
}
return retVal;
}
vous pouvez l'appeler ainsi:
try
{
}
catch(ex Exception)
{
var exceptionString = InnerExceptionConcatenator(ex);
var path = @"c:\temp\exception.txt";
if (!File.Exists(path))
{
using (StreamWriter sw = File.CreateText(path))
{
sw.WriteLine(exceptionString);
}
}
else
{
using (StreamWriter sw = File.AppendText(path))
{
sw.WriteLine(exceptionString);
}
}
}