1

サンプルコードは次のとおりです。

var ctx = new PrincipalContext(ContextType.Domain);
var up1 = AuthenticablePrincipal.FindByIdentity(ctx, IdentityType.Sid, "S-1-5-21-.......");
var up2 = AuthenticablePrincipal.FindByIdentity(ctx, IdentityType.UserPrincipalName, "login@contoso.com");

このコードが実行されているのと同じドメインにユーザーがいる場合、どちらの場合でもユーザーが検索されます。ユーザーが別の双方向の信頼されたフォレストにいる場合、両方とも null を返します。

現在のドメインにドメイン ローカル グループを作成し、他のフォレストのユーザーをそこに配置し、グループのメンバーを で一覧表示するとGroupPrincipal.GetMembers、外部オブジェクトも検出され、解決されます。したがって、このタスクは確かに可能であり、インフラストラクチャも正常に機能しています。

で別のフォレストからユーザーを見つける方法はUserPrincipal.FindByIdentity? または、を使用する他の方法でPrincipalContext?

4

2 に答える 2

1

リフレクションを使用した醜いソリューションを次に示します。

var ctx = new PrincipalContext(ContextType.Domain);
var queryCtx = ctx.GetType().GetProperty("QueryCtx", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(ctx, null);
var ctxBase = (DirectoryEntry)queryCtx.GetType().GetField("ctxBase", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(queryCtx);
var srch = new DirectorySearcher(ctxBase);
srch.Filter = "(objectSid=S-1-5-21-.......)";
var result = srch.FindOne().GetDirectoryEntry();
var adUtils = queryCtx.GetType().Assembly.GetType("System.DirectoryServices.AccountManagement.ADUtils");
var up = (UserPrincipal)adUtils.GetMethod("DirectoryEntryAsPrincipal", BindingFlags.NonPublic | BindingFlags.Static).Invoke(null, new object[] { result, queryCtx });
于 2014-02-26T08:23:48.840 に答える