Вопрос по userprincipal, active-directory, c# – Получить список групп для данного UserPrincipal

9

Я хочу получить список групп, в которых находится пользователь.

Это мой код:

<code>PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "mydomain.ac.uk",   "DC=mydomain,DC=AC,DC=UK", "user", "password");

UserPrincipal user = UserPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, "MyUser");

PrincipalSearchResult<Principal> results = user.GetGroups();

foreach(Principal p in results)
{
   Response.Write(p.Name);
}
</code>

Когда я бегу, я получаю следующую ошибку в строкеResponse.Write(p.Name);

System.Runtime.InteropServices.COMException: The specified directory service attribute or value does not exist.

Когда я проверил количество результатов, он вернул 9, и первая группаDomainUsers.

Как я могу перебрать все 9 групп в списке? Благодарю.

Ниже приведен список пользователей, которых я получаю:

enter image description here

PrincipalContext ctx = новый PrincipalContext (ContextType.Domain, «mydomain.ac.uk», «DC = mydomain, DC = AC, DC = UK», «пользователь», «пароль»); TTCG
Я полагаю, это потому, что ваш "пользователь" У учетной записи недостаточно прав для чтения групповых объектов. Ты видишьDistinguishName атрибут иGuid атрибут? Harvey Kwok
Атрибут name, возможно, не был заполнен (возможно, потому что он был из другого домена, чем тот, который вы запросили ??). Попробуйте запросить DisplayName, DistinguishedName, SamAccountName или SID. Ben
Я пробовал это имя, но ошибка все та же. Когда я проверял в представлении отладки, я получаю следующее сообщение об ошибке: Name (& apos; ((System.DirectoryServices.AccountManagement.Principal) ((new System.Linq.SystemCore_EnumerableDebugView & lt; System.DirectoryServices.AccountManagement.Principal & gt; results) ) .Items [1])). Имя «сгенерировало исключение типа« System.Runtime.InteropServices.COMException ») TTCG
как вы инициализируете PrincipalContext? Damith

Ваш Ответ

2   ответа
1

foreach(Principal p in results)
{ 
   if (p is GroupPrincipal) 
      Response.Write(p.DisplayName); 
}

Я знаю, это звучит глупо, но это работало на меня в прошлом. Ваши результаты выглядят так, как будто на самом деле найдена только 1 группа безопасности и 8 & quot; другие & quot; типы групп. Те, что "другие" группы могут не обладать этими атрибутами.

Для меня имя было лучше (DisplayName было пустым:user.GetGroups().OfType<GroupPrincipal>().Select(p => p.Name));
5

как описано в классе PrincipalContext, пользователь, выполняющий код, должен иметь разрешения на чтение для обоих по умолчанию.User Контейнер (т.е.CN=Users,DC=yourDomain,DC=COM) иComputers Контейнер (т.е.CN=Computers,DC=yourDomain,DC=COM).

Если у пользователя нет необходимых разрешений, вы получите следующие сообщения об ошибках:

The specified directory service attribute or value does not exist

‘context.Container’ threw an exception of type ‘System.NullReferenceException’ string {System.NullReferenceException}

((new System.Linq.SystemCore_EnumerableDebugView(groups)).Items[5]).Description’ threw an exception of type ‘System.Runtime.InteropServices.COMException’ string {System.Runtime.InteropServices.COMException}

Пожалуйста, проверьте мой блог Проблемы с аутентификацией с PrincipalContext

Ссылка на блог, кажется, не работает.
Любой, кто пытается использоватьthis.RequestContext.Principal.IsInRole("ad group name") и он всегда возвращает ложь без исключения, это возможная причина. Восстановление CN и разрешений исправили это для меня.
Если кто-то удалит контейнер компьютеров в рассматриваемом домене, вы также получите эту ошибку. Ради всего святого ... Кто-то удалил вещь.

Похожие вопросы