#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. Хорошо, я изменил свойство, извините за мою ошибку