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

使用允许您指定目标上下文名称的PrincipalContext 构造函数- 目标林/域的 DNS 名称。

于 2014-02-26T04:01:21.657 回答
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 回答