GroupPrincipal.GetMembers(true) - 指定的目录服务属性或值不存在

时间:2012-01-29 13:54:57

标签: directoryservices account-management

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

我的目标是创建一个控制台应用程序来获取组及其子组的成员。我可以使用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检索同一组及其子组的用户,但是有很多行代码和递归 我想避免。

对此问题的解决方案将受到高度赞赏。

谢谢 - 哈立德

1 个答案:

答案 0 :(得分:2)

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

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

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