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

时间:2012-12-03 16:56:40

标签: .net iis active-directory directoryservices

我在其他三台服务器上使用相同的网络应用程序。任何人都知道为什么不在第四台服务器上工作?请参阅错误和堆栈跟踪:

  

发生了操作错误。

     

描述:执行期间发生了未处理的异常   当前的网络请求。请查看堆栈跟踪了解更多信息   有关错误的信息及其在代码中的起源。

     

例外细节:
  System.DirectoryServices.DirectoryServicesCOMException:一个操作   发生错误。

     

来源错误:

     

执行期间生成了未处理的异常   当前的网络请求。有关的来源和位置的信息   可以使用下面的异常堆栈跟踪来识别异常。

     

堆栈跟踪:

     

[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   entry,String propertyName)+96
  System.DirectoryServices.PropertyCollection.get_Item(字符串   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   context,Type principalType,Nullable' 1 identityType,String   identityValue,DateTime refDate)+14
  System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType(PrincipalContext   context,Type principalType,String identityValue)+73
  System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext   context,String identityValue)+25
  Infraero.TINE3.STTEnterprise.Web.Common.Seguranca.ServicoAutenticacao.EfetuarLogin(AcessoUsuario   acessoUsuario,String senha)in   d:\ SVN \ STT \树干\ 4-0_CodigoFonte_Enterprise \ 4-4_SRC \ Infraero.TINE3.STTEnterprise.Web \共同\ Seguranca \ ServicoAutenticacao.cs:34   Infraero.TINE3.STTEnterprise.Web.Controllers.LoginController.ValidarUsuarioAD(字符串   matricula,String senha,AcessoUsuario acessoUsuario)in   d:\ SVN \ STT \树干\ 4-0_CodigoFonte_Enterprise \ 4-4_SRC \ Infraero.TINE3.STTEnterprise.Web \控制器\ LoginController.cs:92   Infraero.TINE3.STTEnterprise.Web.Controllers.LoginController.ValidarUsuario(字符串   matricula,String senha)in   d:\ SVN \ STT \干线\ 4-0_CodigoFonte_Enterprise \ 4-4_SRC \ Infraero.TINE3.STTEnterprise.Web \ \控制器LoginController.cs:80   Infraero.TINE3.STTEnterprise.Web.Controllers.LoginController.Index(LoginViewModel   loginViewModel)中   d:\ SVN \ STT \树干\ 4-0_CodigoFonte_Enterprise \ 4-4_SRC \ Infraero.TINE3.STTEnterprise.Web \控制器\ LoginController.cs:54   lambda_method(Closure,ControllerBase,Object [])+108
  System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase   controller,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过滤器,ActionDescriptor actionDescriptor,   IDictionary`2参数)+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(动作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;
}

7 个答案:

答案 0 :(得分:65)

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

在IIS中:

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

我希望这会有所帮助。

答案 1 :(得分:34)

我知道这个主题已经陈旧,但仅适用于未来寻找此问题的人 只需使用此方法即可使用Elevate权限执行代码

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

答案 2 :(得分:7)

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

几乎可以肯定,这是因为您的应用程序池标识无权访问Active Directory

答案 3 :(得分:6)

就我而言,在应用程序池中从ApplicationPoolItentity切换到NetworkService确实有效它不是首选"因为作为网络服务运行的服务可以篡改以相同身份运行的其他服务& #34;根据以下链接: (http://www.iis.net/learn/manage/configuring-security/application-pool-identities)。

我在服务器上运行了修补程序(KB2545850)并根据此答案重新启动:(DirectoryServicesCOMException 80072020 From IIS 7.5 Site Running Under ApplicationPoolIdentity

现在似乎运作良好。

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

答案 4 :(得分:3)

我的经历与此错误略有不同。我不得不将内部部署应用程序迁移到Azure,其中LDAP调用是从内部进行的,但是在打开所需的防火墙之后,不会从Azure进行。

我尝试了上面提到的所有解决方案,但没有一个是有用的。已在Azure VM上选择了网络服务。

经过大量的打击和试验研究。我修好了。

解决方案:内部部署服务器具有访问LDAP的权限,并且不需要任何用户名和密码。但是在Azure上,您需要使用用户名和密码专门进行LDAP调用。以下是帮助的代码。

 var directoryEntry= new DirectoryEntry(adspath, Username, Password)

答案 5 :(得分:0)

1 - 更改应用程序池以在网络服务下运行。
2 - 单击身份验证并禁用ASP.Net模拟。

答案 6 :(得分:-1)

因此,如果您在该行上放置一个断点:

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

并逐步执行它,它会生成上面没有任何InnerExceptions的异常吗?

根据堆栈跟踪,该行是问题的开始。返回的异常应该至少包含一些其他信息,以了解它被抛出的原因。

InnerException Concatenator

以下方法采用顶级异常并返回内部异常的制表符和换行符格式细分为字符串。

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