GroupPrincipal.GetMembers(true) — указанный атрибут или значение службы каталогов не существует.

У меня есть проблема, которую я искал по всей сети, но не нашел приемлемой причины или решения.

Моя цель — создать консольное приложение для получения членов группы и ее подгрупп. Я могу сделать это с помощью DirectoryServices. Но я хочу использовать новый API AccountManagement, так как это в значительной степени упростит мой код. Мой код, как показано ниже (некоторые имена/пути замаскированы)

PrincipalContext insPrincipalContext =
                new PrincipalContext(ContextType.Domain,
                    "my.grp.net",
                    "DC=my,DC=grp,DC=net",
                    "domain\\username", "Password"
                    );

ArrayList users = new ArrayList();

GroupPrincipal oGroupPrincipal =
   GroupPrincipal.FindByIdentity(insPrincipalContext,IdentityType.SamAccountName, "My group name");

PrincipalSearchResult<Principal> usrs = oGroupPrincipal.GetMembers(true);

foreach (UserPrincipal p in usrs)
{
    if (p != null)
        users.Add(p.SamAccountName);
}   

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

System.DirectoryServices.AccountManagement.PrincipalOperationException was unhandled   Message=The specified directory service attribute or value does not exist.

  Source=System.DirectoryServices.AccountManagement   ErrorCode=-2147016694   StackTrace:
       at System.DirectoryServices.AccountManagement.ADStoreCtx.LoadDirectoryEntryAttributes(DirectoryEntry de)
       at System.DirectoryServices.AccountManagement.ADDNLinkedAttrSet.MoveNextMemberEnum()
       at System.DirectoryServices.AccountManagement.ADDNLinkedAttrSet.MoveNext()
       at System.DirectoryServices.AccountManagement.FindResultEnumerator`1.MoveNext()
       at System.DirectoryServices.AccountManagement.FindResultEnumerator`1.System.Collections.IEnumerator.MoveNext()
       at ManagedActiveDirectoryTrial.Program.Main(String[] args) in C:\Khalid Naseem\Trial\ManagedActiveDirectoryTrial\ManagedActiveDirectoryTrial\Program.cs:line 77
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()   InnerException: System.Runtime.InteropServices.COMException
       Message=The specified directory service attribute or value does not exist.

       Source=System.DirectoryServices
       ErrorCode=-2147016694
       StackTrace:
            at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
            at System.DirectoryServices.DirectoryEntry.Bind()
            at System.DirectoryServices.DirectoryEntry.RefreshCache()
            at System.DirectoryServices.AccountManagement.ADStoreCtx.LoadDirectoryEntryAttributes(DirectoryEntry de) 

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

Я могу извлекать пользователей из той же группы и ее подгрупп с помощью API DirectoryServices, но с большим количеством строк кода и рекурсией, которых я хочу избежать.

Решение этой проблемы будет высоко оценено.

Спасибо - Халид


person Khalid Naseem    schedule 29.01.2012    source источник
comment
Здравствуйте, вы нашли решение своей проблемы? Я испытываю ту же проблему.   -  person Shrike    schedule 25.04.2012


Ответы (1)


Это похоже на сценарий, в котором пользователь может быть удален из группы безопасности или списка рассылки, но еще не полностью реплицирован через Active Directory. Это исключение может быть вызвано, если исполняемый файл, вызывающий этот метод, не имеет прав администратора.

В качестве обходного пути в первом случае вы можете попытаться вызвать oGroupPrincipal.GetMembers(false) и самостоятельно написать рекурсивную логику, проверив, является ли член группой, а затем снова вызвать GetMembers для этого объекта.

Другая проблема может заключаться в том, что GetMembers(true) не обрабатывает циклические зависимости.

person 0xJTONG    schedule 08.05.2012