UserPrincipal.FindByIdentity приводит к ошибке COM 0x80005000

У меня есть приложение MVC Intranet, которое я недавно обновил с .Net 4 до 4.6.1. Это приложение запрашивает сведения о пользователе из Active Directory для загрузки сведений, которые недоступны в свойстве User.Identity контроллера, и до недавнего времени это делалось безупречно. Код выглядит примерно так:

public static void foo()
{
    var usr = LookupUser("MyDomain", "jbloggs");
    ...
}

private static UserPrincipal LookupUser(string domain, string username)
{
    Console.WriteLine($"Lookup {domain}\\{username}");
    using (var ctx = new PrincipalContext(ContextType.Domain, domain))
    {
        using (var user = UserPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, username))
        {
            if (user == null)
            {
                Console.WriteLine("User not found");
                return;
            }

            Console.WriteLine($"Found {domain}\\{username}");
            Console.WriteLine($"DisplayName = {user.DisplayName}");
            Console.WriteLine($"Office = {user.GetString("physicalDeliveryOfficeName")}");
            Console.WriteLine("");

            return user;
        }
    }
}

Код работает нормально при отладке в Visual Studio 2015, но когда он выполняется в поле IIS (v6.1 SP1 в Windows Server 2008 R2), выдает исключение COMException (0x80005000) при вызове UserPrincipal.FindByIdentity ()

Веб-приложение работает в выделенном пуле приложений, настройки которого следующие:

  • .Net Framework Версия = v4.0
  • Identity = MyDomain \ MyAppServiceUser (неинтерактивная учетная запись пользователя AD)
  • Загрузить профиль пользователя = false

Все остальные настройки соответствуют значениям по умолчанию. Само приложение работает с включенной анонимной аутентификацией и аутентификацией Windows. На сервере установлен .Net 4.6.1, и все остальные элементы приложения интрасети, похоже, работают нормально.

Погуглив это до смерти, большинство ответов, похоже, указывают на то, что это проблема с разрешениями учетной записи службы на запрос AD. Чтобы подтвердить, что учетная запись службы, в которой запущен пул приложений, имеет доступ к запросам Active Directory, я использовал приведенный выше код в консольном приложении и запустил его как для себя, так и для учетной записи службы на сервере - в обоих случаях. экземпляров он работает нормально. Он срывается только при работе под IIS.

Я пробовал множество вариантов создания PrincipalContext (включая путь контейнера OU и т. Д.), Но результаты всегда одни и те же.

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

Обновление - дополнительные сведения

  • Тип исключения: System.Runtime.InteropServices.COMException
  • Сообщение об исключении: неизвестная ошибка (0x80005000)
  • Трассировки стека:

в System.DirectoryServices.DirectoryEntry.Bind (Boolean throwIfFail) в System.DirectoryServices.DirectoryEntry.Bind () в System.DirectoryServices.DirectoryEntry.get_AdsObject () в System.DirectoryServices.PropertyValueCollection.PopulateVervices .. ctor (запись DirectoryEntry, String propertyName) в System.DirectoryServices.PropertyCollection.get_Item (String propertyName) в System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInitNoContainer () в System.DirectoryDirectoryInitNoContainer () в System.DirectoryDirectoryInitNoContainer () в System.DirectoryDirectoryAccountManagementServices.AccountManagement.PackageServices. .PrincipalContext.Initialize () в System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx () в System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper (контекст основного контекста, идентификатор System.DirecueableType, идентификатор System.Direcueal`ype1 toryServices.AccountManagement.Principal.FindByIdentityWithType (контекст PrincipalContext, тип PrincipalType, IdentityType identityType, String identityValue) в System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity. identityName)


person Pete    schedule 23.08.2016    source источник
comment
Это работает для вас? : stackoverflow.com/a/1722429/3709746   -  person Рахул Маквана    schedule 23.08.2016
comment
К сожалению, нет - он взрывается с той же ошибкой при вызове DirectorySearcher.FindOne () - код в следующем комментарии   -  person Pete    schedule 23.08.2016
comment
var de = new DirectoryEntry (LDAP: //MyDC.MyDomain.com/DC=MyDomain,DC=com, MyDomain \\ ServiceUser, пароль); var ds = новый DirectorySearcher (де); ds.Filter = $ (& (objectClass = пользователь) (objectCategory = пользователь) (sAMAccountName = {userName})); ds.PropertiesToLoad.Add (PhysicalDeliveryOfficeName); var result = ds.FindOne (); // Здесь взрывается   -  person Pete    schedule 23.08.2016
comment
не могли бы вы вставить точное сообщение об ошибке, которое вы получили в исходной проблеме?   -  person Рахул Маквана    schedule 23.08.2016
comment
Обновил сообщение по запросу   -  person Pete    schedule 23.08.2016
comment
Попробуйте изменить идентификатор пула приложений на NetworkService и посмотрите, работает ли это.   -  person Рахул Маквана    schedule 23.08.2016
comment
и это: stackoverflow.com/a/22104717/3709746   -  person Рахул Маквана    schedule 23.08.2016


Ответы (2)


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

Спасибо Рахулу за помощь. В конце концов, по его предложению я создал новый пул приложений, работающий как сетевая служба, и поиск в AD отлично работал под этим. К сожалению, поскольку мое приложение получает доступ к сетевым ресурсам, оно должно запускаться как пользователь AD, поэтому я просто поменял учетные данные на учетную запись службы AD, которую использовал раньше, и ЭТО ЕЩЕ РАБОТАЕТ .

?!?

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

person Pete    schedule 24.08.2016
comment
Похоже, это могло решить вашу проблему, хотя (как и вы) я не уверен, почему. У меня та же ошибка, но она более постоянная. Если это помогает кому-то другому, код ошибки 0x80005000 относится к недопустимому имени пути ADSI. Путь извлекается во время инициализации PrincipalContext и исходит из атрибута wellKnownObjects RootDSE. В моем случае OU содержало косую черту /, которая мешала пути LDAP. У Microsoft есть неполный список кодов ошибок ADSI здесь: msdn.microsoft.com/en-us/library/aa705940(v=vs.85).aspx - person ARP; 08.01.2018

Для нас это произошло из-за того, что служба McAfee HIPS блокировала исходящие / входящие соединения WMI через TCP-порт 135.

person Aaron    schedule 30.01.2018