While trying to resolve a cross-store reference, t

2019-08-11 14:53发布

While fetching users from group, giving exception message as "While trying to resolve a cross-store reference, the SID of the target principal could not be resolved. The error code is 1332."

        PrincipalContext ctx = null;
        if (!string.IsNullOrWhiteSpace(adUserName))
        {
            ctx = new PrincipalContext(ContextType.Domain, domainName, adUserName, adPassword);
        }
        else
        {
            ctx = new PrincipalContext(ContextType.Domain, domainName);
        }
        var groupNames = commaSeparatedGroupNames.Split(',');
        IEnumerable<Principal> users = null;
        foreach (var groupName in groupNames)
        {
            if (!string.IsNullOrWhiteSpace(groupName))
            {
                var userGroup = GroupPrincipal.FindByIdentity(ctx, groupName.Trim());
                if (userGroup == null)
                    throw new InvalidOperationException("Active Directory Group Not Found :: " + groupName);

                var usersInGroup = userGroup.GetMembers();

                if (users == null)
                {
                    users = usersInGroup;
                }
                else
                {
                    users = users.Union(usersInGroup);
                }
            }
        }

        return users;

When doing

foreach (UserPrincipal user in users)

I am getting the error. Any suggestions i can check for this error or skip this member from list during looping.

3条回答
Animai°情兽
2楼-- · 2019-08-11 15:25

I think your problem is tied to the return type of group.GetMembers(), which isn't neccessarily a UserPrincipal but a Principal.

So you might want to check, if the Principal is a UserPrincipal or a GroupPrincipal.

foreach(var principal in groupMembers)

would be a better choice in your case.

查看更多
Summer. ? 凉城
3楼-- · 2019-08-11 15:31

Sandra's solution is almost right, but the exception is thrown on the MoveNext() method, so if you place your try..catch block inside it, it won't work.

var enumerator = members.GetEnumerator();

var moveNext = true;

while (moveNext)
{
    try
    {
        moveNext = enumerator.MoveNext())

        if (moveNext)
        {
            Principal member = enumerator.Current;

            Console.WriteLine("{0}\r\n\t{1}\r\n\t{2}", member, member.Guid, member.DistinguishedName);
        }
    } 
    catch (Exception ex) 
    {
        Console.WriteLine(ex.Message);
    }
}
查看更多
Summer. ? 凉城
4楼-- · 2019-08-11 15:35

I just encountered this same problem yesterday, and this is the best answer I found at this link:

IEnumerator<Principal> enumerator = members.GetEnumerator();
while (enumerator.MoveNext())
{
    try
    {
        Principal member = enumerator.Current;
        Console.WriteLine({0}\r\n\t{1}\r\n\t{2}",member.ToString(),member.Guid,member.DistinguishedName);
    } catch (Exception ex) {
        Console.WriteLine(ex.Message);
    }
}

This is how you would iterate the IEnumerable collection 'manually'. It gives you a chance to attempt getting the Principal and to catch the exception if it's an undefined SID or some other issue.

查看更多
登录 后发表回答