Подтвердить что ты не робот

System.DirectoryServices.DirectoryServicesCOMException: произошла ошибка операций

У меня есть одно и то же веб-приложение, работающее на трех других серверах. Кто-нибудь знает, почему не работает на 4-м сервере? См. Сообщение об ошибке и stacktrace:

Произошла операционная ошибка.

Описание: Необработанное исключение произошло во время выполнения текущий веб-запрос. Просмотрите трассировку стека информацию об ошибке и где она возникла в коде.

Сведения об исключении:
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 (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 Система. Драйвер. context, Тип mainType, Nullable'1 identityType, String identityValue, DateTime refDate) +14
System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType(PrincipalContext контекст, тип mainType, String identityValue) +73
System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext контекст, String identityValue) +25
Infraero.TINE3.STTEnterprise.Web.Common.Seguranca.ServicoAutenticacao.EfetuarLogin(AcessoUsuario acessoUsuario, String senha) в D:\SVN\STT\ствол\4-0_CodigoFonte_Enterprise\4-4_SRC\Infraero.TINE3.STTEnterprise.Web\Common\Segurança\ServicoAutenticacao.cs: 34 Infraero.TINE3.STTEnterprise.Web.Controllers.LoginController.ValidarUsuarioAD(String Матрица, Струнный сена, AcessoUsuario acessoUsuario) в D:\SVN\STT\ствол\4-0_CodigoFonte_Enterprise\4-4_SRC\Infraero.TINE3.STTEnterprise.Web\Контроллеры\LoginController.cs: 92 Infraero.TINE3.STTEnterprise.Web.Controllers.LoginController.ValidarUsuario(String математика, String senha) в 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 контроллер, объект []) +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 фильтр, ActionExecutingContext preContext, продолжение Func'1) +263
System.Web.Mvc <. > C__DisplayClass17.b__14() +19 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controlContext, 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(действие действия) +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, Boolean & завершен синхронно) +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;
}
4b9b3361

Ответ 1

У меня была точно такая же ошибка и исправлена ​​ее, изменив пул приложений сайта, который будет запущен под сетевой службой.

В IIS:

  • Выберите пул приложений вашего сайта.
  • Выберите дополнительные настройки в правой части
  • Во всплывающем окне "Дополнительные параметры" прокрутите страницу вниз до группы "Модель процесса"
  • Измените первый параметр Identity на NetworkService (мой был установлен на значение ApplicationPoolIdentity по умолчанию).

Надеюсь, это поможет.

Ответ 2

Я знаю, что эта тема старая, но только для будущих людей, которые будут искать эту проблему Просто используйте этот метод для выполнения кода с привилегиями Elevate

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

Ответ 3

В моем случае переход от ApplicationPoolItentity к NetworkService в пуле приложений работал НО > , это не было предпочтительным ", потому что службы, выполняемые как служба сети, могут вмешиваться в другие службы, которые работают под одинаковой идентификацией" за следующая ссылка: (http://www.iis.net/learn/manage/configuring-security/application-pool-identities).

Я запустил исправление (KB2545850) на сервере и перезагрузился за этот ответ:(DirectoryServicesCOMException 80072020 Из сайта IIS 7.5, работающего под именем ApplicationPoolIdentity)

Кажется, что сейчас хорошо работает.

Справочная информация по моей задаче: Обновление приложений с .net framework 2.0 на сервере Server 2003 до .NET Framework 4.0 на сервере Server 2008 R2.

Ответ 4

В этом случае нет InnerException, он просто обертывает COM-ошибку.

Почти наверняка это связано с тем, что ваш идентификатор пула приложений не имеет разрешения на доступ к Active Directory.

Ответ 5

1 - Сменить пул приложений для работы в сети.

2 - Нажмите "Аутентификация" и отключите олицетворение ASP.Net.

Ответ 6

Итак, если вы поместите точку останова на строку:

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

и пройти через него, он генерирует исключение выше, которое не имеет каких-либо внутренних значений?

В соответствии с трассировкой стека эта строка является началом проблемы. Возвращенное исключение должно иметь по крайней мере некоторую другую информацию в нем о том, почему оно было брошено.

Конкатенатор InnerException

Следующий метод принимает исключение верхнего уровня и возвращает разбиение на вкладку и разбиение строк на внутренние исключения в виде строки.

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