首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >GroupPrincipal.GetMembers和跨域成员错误

GroupPrincipal.GetMembers和跨域成员错误
EN

Stack Overflow用户
提问于 2016-07-05 13:28:29
回答 5查看 1.7K关注 0票数 1

我有两个域,A和B。域A有组GroupA,其中包含来自域B的用户。

我的代码:

代码语言:javascript
运行
复制
 using (var context = new PrincipalContext(ContextType.Domain, DomainName, User, Password))
{

    using (var groupPrincipal = GroupPrincipal.FindByIdentity(context, IdentityType.SamAccountName,
                                                              groupName))
    {
        if (groupPrincipal == null) return null;
        using (var principalSearchResult = groupPrincipal.GetMembers(true))
        {
            var changedUsersFromGroup =
                principalSearchResult
                .Where(member => member is UserPrincipal)
                .Where(member => IsModifiedUser(member, usnChanged))
                .Cast<UserPrincipal>()
                .Select(adsUser => new AdsUser(adsUser)).Cast<IAdsUser>()
                .ToArray();

            return changedUsersFromGroup;
        }
    }

}

System.DirectoryServices.AccountManagement.PrincipalOperationException:试图解析跨存储引用时,无法在主体的SID指示的域中找到目标主体。

但是如果我从这里添加用户

代码语言:javascript
运行
复制
new PrincipalContext(ContextType.Domain, DomainName, User, Password)

对于域B,它工作正常。

我怎么才能修好它?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-07-17 09:22:47

发现问题并向MS报告为错误。目前不可能用.net :(但它通过本机c++ api通过查询工作)。

票数 0
EN

Stack Overflow用户

发布于 2019-04-19 19:03:33

至少在.NET 4.7中,您可以通过手动管理枚举数来绕过它。这已经过测试,并成功地通过了错误。

代码语言:javascript
运行
复制
static System.Guid[] GetGroupMemberGuids(System.DirectoryServices.AccountManagement.GroupPrincipal group)
{
    System.Collections.Generic.List<System.Guid> result = new List<Guid>();
    if (group == null) return null;
    System.DirectoryServices.AccountManagement.PrincipalCollection px = group.Members;
    System.Collections.IEnumerator en = px.GetEnumerator();
    bool hasMore = true;
    int consecFaults = 0;
    while (hasMore && consecFaults < 10)
    {
        System.DirectoryServices.AccountManagement.Principal csr = null;
        try
        {
            hasMore = en.MoveNext();
            if (!hasMore) break;
            csr = (System.DirectoryServices.AccountManagement.Principal)en.Current;
            consecFaults = 0;
        }
        catch (System.DirectoryServices.AccountManagement.PrincipalOperationException e)
        {
            Console.Error.WriteLine("    Unable to enumerate a member due to the following error: {0}", e.Message);
            consecFaults++;
            csr = null;
        }
        if (csr is System.DirectoryServices.AccountManagement.UserPrincipal)
            result.Add(csr.Guid.Value);
    }
    if (consecFaults >= 10) throw new InvalidOperationException("Too many consecutive errors on retrieval.");
    return result.ToArray();
}
票数 1
EN

Stack Overflow用户

发布于 2016-07-11 19:13:08

在没有转换到UserPrincipal时,检查它的行为是否不同。

代码语言:javascript
运行
复制
var changedUsersFromGroup = principalSearchResult.ToArray();

按照其他螺纹的说法,这可能是个问题。同样,根据MSDN,使用不包含组对象的GetMembers(true)返回的主体集合,只返回叶节点,因此可能根本不需要这种转换。接下来,要检查这种搜索会返回多少个结果。如果您的AD有许多用户/嵌套组,最好不要使用GetMembers(true)来确保它在小用户组上工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38204758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档