Получить список групп для данного UserPrincipal

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

Это мой код:

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

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

System.Runtime.InteropServices.COMException: указанный атрибут или значение службы каталогов не существует.

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

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

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

введите здесь описание изображения


person TTCG    schedule 20.04.2012    source источник
comment
как вы инициализируете PrincipalContext?   -  person Damith    schedule 20.04.2012
comment
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, mydomain.ac.uk, DC=mydomain,DC=AC,DC=UK, пользователь, пароль);   -  person TTCG    schedule 20.04.2012
comment
Возможно, атрибут имени не был заполнен (возможно, потому, что он был из другого домена, чем тот, который вы запрашивали??). Попробуйте запросить DisplayName, DistinguishedName, SamAccountName или SID.   -  person Ben    schedule 20.04.2012
comment
Я пробовал это имя, но ошибка все та же. Когда я проверил в представлении отладки, я получаю следующую ошибку: Имя ( '((System.DirectoryServices.AccountManagement.Principal)((new System.Linq.SystemCore_EnumerableDebugView‹System.DirectoryServices.AccountManagement.Principal›(результаты)) .Items[1]).Name' вызвало исключение типа 'System.Runtime.InteropServices.COMException' )   -  person TTCG    schedule 20.04.2012
comment
Я думаю, это потому, что у вашей учетной записи недостаточно прав для чтения объектов группы. Вы видите атрибут DistinguishName и атрибут Guid?   -  person Harvey Kwok    schedule 15.07.2012
comment
у меня такая же ошибка - я получаю набор групп, но не могу получить их свойства. ты решил эту проблему?   -  person donRumatta    schedule 07.08.2012
comment
@donRumatta var theDirectoryEntry = groupPrincipal.GetUnderlyingObject(); затем theDirectoryEntry.Properties[propertyName].Value как ???. Конечно, вам придется перебирать коллекцию руководителей групп.   -  person Sinaesthetic    schedule 05.09.2012


Ответы (2)


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

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

Указанный атрибут или значение службы каталогов не существует

  • ‘context.Container’ вызвал исключение типа ‘System.NullReferenceException’ string {System.NullReferenceException}

  • ((новый System.Linq.SystemCore_EnumerableDebugView(groups)).Items[5]).Description» вызвало исключение типа «System.Runtime.InteropServices.COMException» строка {System.Runtime.InteropServices.COMException}

person Markus    schedule 05.08.2014
comment
Если кто-то удалит контейнер компьютеров в рассматриваемом домене, вы также получите эту ошибку. Ради всего святого... Кто-то удалил это. - person Robert Kaucher; 31.01.2018
comment
Любой, кто пытается использовать this.RequestContext.Principal.IsInRole("ad group name"), и он всегда возвращает false без исключения, это возможная причина. Восстановление CN и разрешений исправило это для меня. - person Robert Kaucher; 08.02.2018
comment
Ссылка на блог видимо битая. - person CodeFox; 10.12.2018

попробуйте что-то вроде

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

Я знаю, это звучит глупо, но это работало для меня в прошлом. Ваши результаты выглядят так, будто на самом деле найдена только 1 группа безопасности и 8 «других» типов групп. Эти «другие» группы могут не обладать этими атрибутами.

person Sinaesthetic    schedule 04.09.2012
comment
Для меня имя было лучше (DisplayName было пустым: user.GetGroups().OfType<GroupPrincipal>().Select(p => p.Name)); - person a-h; 05.06.2017