System.DirectoryServices.DirectoryServicesCOMException:发生操作错误

我有三个其他服务器上的相同的Web应用程序工作。 任何人都知道为什么不在第四台服务器上工作? 看到错误和堆栈跟踪:

发生操作错误。

说明:执行当前Web请求期间发生未处理的exception。 请查看堆栈跟踪,了解有关错误的更多信息以及源代码的位置。

exception详情:
System.DirectoryServices.DirectoryServicesCOMException:发生操作错误。

源错误:

在执行当前Web请求期间生成未处理的exception。 有关exception的来源和位置的信息可以使用下面的exception堆栈跟踪来标识。

堆栈跟踪:

[DirectoryServicesCOMException(0x80072020):发生操作错误。 ] System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)+454 System.DirectoryServices.DirectoryEntry.Bind()+36 System.DirectoryServices.DirectoryEntry.get_AdsObject()+31 System.DirectoryServices.PropertyValueCollection.PopulateList()+22
System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry项,stringpropertyName)+96
System.DirectoryServices.PropertyCollection.get_Item(String propertyName)+142 System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInitNoContainer()+1134 System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit()+37 System.DirectoryServices.AccountManagement.PrincipalContext.Initialize() +124 System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx()+31 System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper(PrincipalContext上下文,typesprincipalType,Nullable'1标识types,stringidentityValue,DateTime refDate)+14
System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType(PrincipalContext上下文,typesprincipalType,stringidentityValue)+73
System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext上下文,stringidentityValue)+25
Infraero.TINE3.STTEnterprise.Web.Common.Seguranca.ServicoAutenticacao.EfetuarLogin(AcessoUsuario acessoUsuario,string senha)in D:\ SVN \ STT \ trunk \ 4-0_CodigoFonte_Enterprise \ 4-4_SRC \ Infraero.TINE3.STTEnterprise.Web \ Common \在D:\ SVN \ STT \ trunk \ 4-0_CodigoFonte_Enterprise \ 4-4_SRC \ Infraero中的Seguranca \ ServicoAntinticacao.cs:34 Infraero.TINE3.STTEnterprise.Web.Controllers.LoginController.ValidarUsuarioAD(String matricula,String senha,AcessoUsuario acessoUsuario)。 D:\ SVN \ STT \ trunk \ 4-0_CodigoFonte_Enterprise \ 4-4_SRC中的TINE3.STTEnterprise.Web \ Controllers \ LoginController.cs:92 Infraero.TINE3.STTEnterprise.Web.Controllers.LoginController.ValidarUsuario(String matricula,String senha) D:\ SVN \ STT \ trunk \ 4-0_CodigoFonte_Enterprise \ 4-4_SRC中的Infraero.TINE3.STTEnterprise.Web \ Controllers \ LoginController.cs:80 Infraero.TINE3.STTEnterprise.Web.Controllers.LoginController.Index(LoginViewModel loginViewModel) \ Infraero.TINE3.STTEnterprise.Web \ Controllers \ LoginController.cs:54 lambda_method(Closure,Controll erBase,Object [])+108
System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase控制器,Object []参数)+17
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext,IDictionary'2参数)+208
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext,ActionDescriptor actionDescriptor,IDictionary'2参数)+27
System.Web.Mvc。<> c__DisplayClass15.b__12()+55 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter,ActionExecutingContext preContext,Func'1 continuation)+263
System.Web.Mvc。<> c__DisplayClass17.b__14()+19 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext,IList'1 filters,ActionDescriptor actionDescriptor,IDictionary`2 parameters)+191
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext,String actionName)+343
System.Web.Mvc.Controller.ExecuteCore()+116
System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext)+97 System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext)+10
System.Web.Mvc。<> c__DisplayClassb.b__5()+37
System.Web.Mvc.Async。<> c__DisplayClass1.b__0()+21
System.Web.Mvc.Async。<> c__DisplayClass8'1.b__7(IAsyncResult _)+12 System.Web.Mvc.Async.WrappedAsyncResult'1.End()+62 System.Web.Mvc。<> c__DisplayClasse.b__d( )+50
System.Web.Mvc.SecurityUtil.b__0(Action f)+7 System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action)+22 System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)+60
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult结果)+9
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+8963149 System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean&completedSynchronously)+184

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; } 

我有完全相同的错误,并通过更改网站的应用程序池在networking服务下运行来修复它。

在IIS中:

  • select您的网站的应用程序池
  • select右侧的高级设置
  • 在“高级设置”popup窗口中,向下滚动到“过程模型”组
  • 将名为Identity的第一个选项更改为NetworkService(我的设置为默认的ApplicationPoolIdentity)。

我希望这有帮助。

我知道这个话题是旧的,但只为未来的人谁将会寻找这个问题只要使用这种方法来执行代码与提高特权

 using (HostingEnvironment.Impersonate()) { // This code runs as the application pool user } 

在我的情况下,从应用程序池中的ApplicationPoolItentity切换到NetworkService确实可行, 不是首选的,因为作为networking服务运行的服务可以篡改以相同身份运行的其他服务。 iis.net/learn/manage/configuring-security/application-pool-identities )。

我运行了服务器上的修复程序( KB2545850 ),并根据此答案重新启动:( DirectoryServicesCOMException 80072020从IIS 7.5站点下运行ApplicationPoolIdentity )

现在看起来运行良好。

我的任务背景:从Server 2003上的.net framework 2.0升级到Server 2008 R2上的.net framework 4.0。

在这种情况下没有InnerException ,它只是包装一个COM错误。

几乎肯定是因为您的应用程序池标识没有访问Active Directory的权限

1 – 将应用程序池更改为在networking服务下运行。
2 – 单击身份validation并禁用ASP.Net模拟。

所以,如果你在线上放置一个断点:

 UserPrincipal userAD = UserPrincipal.FindByIdentity(context, user.Login); 

并通过它,它会产生上述exception,没有任何InnerExceptions?

根据堆栈跟踪,这条线是问题的开始。 返回的exception至less应该包含一些其他的信息,为什么它被抛出。

InnerException连接器

以下方法采用顶级exception,并将内部exception的选项卡和换行符格式化为一个string。

  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; } 

你可以这样调用它:

 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); } } }