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 に答える