GroupPrincipal.GetMembers (true) - указанный атрибут или значение службы каталогов не существует - PullRequest
1 голос
/ 29 января 2012

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

Моя цель - создать консольное приложение для получения членов группы и ее подгрупп. Я могу сделать это, используя 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, но со многими строками кода и рекурсией что я хочу избежать.

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

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

1 Ответ

2 голосов
/ 09 мая 2012

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

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

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

...