1

我有一个问题,我在网上搜索过,但没有找到可接受的原因或解决方案。

我的目标是创建一个控制台应用程序来获取组及其子组的成员。我可以使用 DirectoryServices 来做到这一点。但我希望使用新的 AccountManagement API,因为这将在很大程度上简化我的代码。我的代码如下(一些名称/路径被屏蔽)

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) 

此异常对我没有多大帮助,因为我无法确定抛出此错误的用户和属性。

我能够使用 DirectoryServices API 检索同一组及其子组的用户,但我想避免多行代码和递归。

对此问题的解决方案将不胜感激。

谢谢 - 哈立德

4

1 回答 1

2

这听起来像是用户可能从安全组或分发列表中删除但尚未通过 Active Directory 完全复制的情况。如果调用此方法的可执行文件没有管理员权限,则可能会引发此异常。

要解决方法,对于第一种情况,您可能需要尝试调用 oGroupPrincipal.GetMembers(false) 并通过检查成员是否为组来自己编写递归逻辑,然后为该对象再次调用 GetMembers。

其他问题可能是 GetMembers(true) 不处理循环依赖。

于 2012-05-08T21:56:51.770 回答