Службы взаимодействия.Исключение COMException

#c# #asp.net-mvc #active-directory

#c# #asp.net-mvc #active-directory

Вопрос:

У меня проблема с проектом MVC, который у меня есть.

Стек выглядит следующим образом:

System.Runtime.Службы взаимодействия.COMException (0x80005000): неизвестная ошибка (0x80005000) в системе.DirectoryServices.DirectoryEntry.Bind(логический throwIfFail) в системе.DirectoryServices.DirectoryEntry.Bind() в системе.DirectoryServices.DirectoryEntry.get_Name() в PosmanWeb2.Controllers.Помощники.Помощники сеанса.GetGroup(результат SearchResult) в PosmanWeb2.Controllers.Помощники.Помощники сеанса.GetPerfilAD(результат поиска) в PosmanWeb2.Controllers.Помощники.SessionHelpers.getUser() в PosmanWeb2.Controllers.Помощники.Помощники сеанса.ConnectActiveDirectory()

Методы в SessionHelpers являются частью проекта, у последнего, похоже, возникли проблемы, код выглядит следующим образом:

 private static List<string> GetGroup(SearchResult result)
{
    List<string> nombresPerfilAD = new List<string>();

    foreach (var i in result.Properties["memberOf"])
    {
        var group = new DirectoryEntry(@"LDAP://"   i);      
        nombresPerfilAD.Add(group.Name.Split('=')[1].ToUpper().Trim());             
    }

    return nombresPerfilAD;
}  
 

Что он в основном делает, так это сохраняет все профили Active Directory в списке.

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

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

Комментарии:

1. попробуйте изменить свой код и использовать PrincipalContext вы можете получить доступ к группам в AD без необходимости делать это старым способом LDAP

Ответ №1:

Хорошим решением в текущей области является отказ от привязки к Active Directory. Результат.Свойства[«memberOf»] уже содержат DN группы. Вы можете получить имя из него, не подключаясь к AD, используя интерфейс IADsPathName (необходимо добавить ссылку на com-объект ActiveDs). Также вы можете отменить удаление специальных символов, используя этот интерфейс. Например, если имя вашей группы — #Test, оно будет возвращено как экранированное, например #Test. Таким образом, вы решите свою проблему, повысите производительность и справитесь с экранированием символов, если перепишете свой метод следующим образом:

     private static List<string> GetGroup(SearchResult result)
    {
        List<string> nombresPerfilAD = new List<string>();
        IADsPathname pathname = new PathnameClass();
        pathname.SetDisplayType(2);
        pathname.EscapedMode = 4;

        foreach (string groupDn in result.Properties["memberOf"])
        {
            pathname.Set(groupDn, 4);
            nombresPerfilAD.Add(pathname.GetElement(0).ToUpper());
        }

        return nombresPerfilAD;
    }
 

Похоже, что привязка вместо разделения по запятой была сделана, чтобы избежать ситуаций, когда группа содержит запятую в своем имени. Но что, если имя группы содержит символ «=»? Старый код не будет работать

PS Если вы используете .NET 4, вам необходимо установить для типов встроенного взаимодействия значение false в свойствах ActiveDs (в ссылках на проект)

P.P.S. Имейте в виду, что атрибут memberOf не содержит вложенных групп (UserA -> GroupA, GroupA -> GroupB => UserA -> GroupB) и основной группы пользователя

Комментарии:

1. Я пытаюсь найти com-объект ActiveDs, какой это? У меня есть следующее: Active DS IIS Extension Dll Active DS IIS Extension Namespace Provider Активная библиотека типов DS

2. Хорошо, я нашел это, это была библиотека типа Active DS, но когда я пытаюсь создать экземпляр IADsPathname, это выдает следующую ошибку: тип взаимодействия «ActiveDs.PathnameClass» не может быть встроен, вместо этого используйте применимый интерфейс.

3. Хорошо, я изменил свойство, извините за мою ошибку