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