活动目录跨域 - 使用PrincipalContext的组成员

msw*_*win 6 c# active-directory

我试图通过使用c#中的DirectoryServices.AccouneManagement命名空间类来获取给定活动目录组的成员.

如果我为特定域指定了我的主要上下文对象构造函数,那么每当我从来自其他域的组访问该成员时,我将遇到以下错误:"从服务器返回了一个引用".

场景是:我在根域域下有不同的子域名:emea.mycorp.com,asia.mycorp.com,asiapacific.mycorp.com,xyz.mycorp.com

如果我从域xyz.mycorp.com运行以下代码,对于asiapacific中的组如果我在主要上下文对象中指定servername,我可以访问该组.

private PrincipalContext context = 
    new PrincipalContext(ContextType.Domain, "asiapacific domain server name");
Run Code Online (Sandbox Code Playgroud)

如果我的组有来自其他域的用户,例如emea\abcd,则以下代码在UserPrincipal处失败:

GroupPrincipal SearchGroup = GroupPrincipal.FindByIdentity(context, "Dev Team"); 
    GroupName = new List<string>();
    foreach (UserPrincipal p in SearchGroup.GetMembers())      
    {        
        GroupName.Add(p.SamAccountName + " " + p.DistinguishedName + " " + p.Name);  
    }
Run Code Online (Sandbox Code Playgroud)

那么,有没有办法可以传递根域的上下文,这样无论用户所属的域如何,代码都可以工作.我在下面试过,没有运气:

private PrincipalContext context = 
    new PrincipalContext(ContextType.Domain, "mycorp.com");
Run Code Online (Sandbox Code Playgroud)

要么

private PrincipalContext context = 
    new PrincipalContext(ContextType.Domain, "DC=mycorp,DC=com");
Run Code Online (Sandbox Code Playgroud)

And*_*per 14

试试这个:

new PrincipalContext(ContextType.Domain, "xyz.mycorp.com:3268", "DC=mycorp,DC=com");
Run Code Online (Sandbox Code Playgroud)

这将使用本地域控制器上的全局编录服务创建PrincipalContext(当然,这假设您的本地DC也是GC).这将允许搜索整个森林.