У меня есть ситуация, когда мне нужно рекурсивно находить группы AD пользователя.
Например:
I have such group hierarchy -
Group1
|_
Group2
|_
Group3
|_
UserA
В соответствии с иерархией, группы UserA - это Group1, Group2,Group3
Чтобы найти его с помощью кода, я использовал следующий метод:
Dim UserP1 As UserPrincipal = UserPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, Remote_ID)
allrecursiveUserGroups = UserP1.GetAuthorizationGroups()
Этот метод даст мне все группы рекурсивно, но он не работает для одного пользователя и выдает исключение какследующее:
'System.DirectoryServices.AccountManagement.PrincipalOperationException' произошло в System.DirectoryServices.AccountManagement.dll
Дополнительная информация: при попытке получить группы авторизации выдается ошибка (1358) произошло.
Вот полное StackTrace:
System.DirectoryServices.AccountManagement.PrincipalOperationException было необработано ErrorCode = 0 HResult = -2146233087 Сообщение = При попытке получитьгруппы авторизации, произошла ошибка (1358).Source = System.DirectoryServices.AccountManagement
StackTrace: at System.DirectoryServices.AccountManagement.AuthZSet..ctor (Byte [] userSid, учетные данные NetCred, contextOptions contextOptions, строковая flatUserAuthority, StoreCtx userStoreCtxxBasex) пользовательский интерфейс StoreCtx userStoreCtxxBasextx)
в System.DirectoryServices.AccountManagement.ADStoreCtx.GetGroupsMemberOfAZ (Принципал p) в System.DirectoryServices.AccountManagement.UserPrincipal.GetAuthorizationGroups ()
Другой используемый мной метод:
Это не вызывает каких-либо исключений и работает отлично для всех пользователей, но возвращает только непосредственные группы, то есть Group3 в моем случае
Проблема, с которой я сталкиваюсь с GetAuthorisationGroups, заключается в наличии специальных символов в Distinguished Name, которыеЯ получил UserPrincipal.
Проблема здесь в том, что когда [Отличительное имя] [2] из UserPrincipal
содержит специальные символы (запятая в моем случае), тогда он вызывает исключение.В моем случае это отличительное имя:
CN = Smith \, John, DC = mydomain, DC = com
Здесь косая черта используется в качестве escape-символа, которыйдобавляется UserPrincipal
.
Если [Отличительное имя] [2] не содержит специальных символов, функция [GetAuthorizationGroups ()] [1] работает нормально.например,
CN = Smith John, DC = mydomain, DC = com
В чем причина проблемы, и есть ли какое-либо решение для этого?
Чего мне не хватает в моем первом подходе использования метода GetAuthorizationGroups()
?
В чем причина кода ошибки 1358?
Есть ли какой-либо другой хороший способ нахождения групп рекурсивно, другихчем GetAuthorisationGroups()
класса UserPrincipal