首页 文章

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

提问于
浏览
36

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

发生了操作错误 . 描述:执行当前Web请求期间发生未处理的异常 . 请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息 . 异常详细信息:System.DirectoryServices.DirectoryServicesCOMException:发生操作错误 . 源错误:在执行当前Web请求期间生成了未处理的异常 . 可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息 . 堆栈跟踪:[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(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 context,Type principalType,Nullable'1 identityType,String identityValue,DateTime refDate)14 System.DirectoryServices .AccountMan agement.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)在D:\ SVN \ STT \ trunk \ 4-0_CodigoFonte_Enterprise \ 4-4_SRC \ Infraero.TINE3.STTEnterprise.Web \ Common \ Seguranca \ ServicoAutenticacao.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 \ Infraero.TINE3.STTEnterprise.Web \ Controllers \ LoginController.cs:92 Infraero.TINE3 . D:\ SVN \ STT \ trunk \ 4-0_CodigoFonte_Enterprise \ 4-4_SRC \ Infraero.TINE3.STTEnterprise.Web \ Controllers \ LoginController.cs中的STTEnterprise.Web.Controllers.LoginController.ValidarUsuario(String matricula,String senha):80 Infraero .TINE3 . D:\ SVN \ STT \ trunk \ 4-0_CodigoFonte_Enterprise \ 4-4_SRC \ Infraero.TINE3.STTEnterprise.Web \ Controllers \ LoginController.cs中的STTEnterprise.Web.Controllers.LoginController.Index(LoginViewModel loginViewModel):54 lambda_method(Closure, ControllerBase,Object [])108 System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller,Object [] parameters)17 System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext,IDictionary'2 parameters)208 System.Web.Mvc .ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext,ActionDescriptor actionDescriptor,IDictionary'2 parameters)27 System.Web.Mvc . <> c__DisplayClass15.b__12()55 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter,ActionExecutingContext preContext,Func'1 (继续)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()62System.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 result)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 回答

  • 6

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

    在IIS中:

    • 选择您网站的应用程序池

    • 选择右侧的“高级设置”

    • 在“高级设置”弹出窗口中,向下滚动到“过程模型”组

    • 将名为Identity的第一个选项更改为NetworkService(我的设置为默认的ApplicationPoolIdentity) .

    我希望这有帮助 .

  • 5

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

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

    在我的情况下,从应用程序池中的ApplicationPoolItentity切换到NetworkService确实有效 BUT 它不是首选的"because services running as Network Service can tamper with other services that run under the same identity"每个链接:(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 .

  • 33

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

    几乎可以肯定,这是因为你的 Application Pool identity does not have permission to access Active Directory .

  • -1

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

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

    经过多次打击和试验研究 . 我修好了它 .

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

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

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

  • 2

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

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

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

    根据堆栈跟踪,该行是问题的开始 . 返回的异常 should 至少有一些其他信息,说明它被抛出的原因 .

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

相关问题