我有两个域,A和B。域A有组GroupA,其中包含来自域B的用户。
我的代码:
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指示的域中找到目标主体。
但是如果我从这里添加用户
new PrincipalContext(ContextType.Domain, DomainName, User, Password)对于域B,它工作正常。
我怎么才能修好它?
发布于 2016-07-17 09:22:47
发现问题并向MS报告为错误。目前不可能用.net :(但它通过本机c++ api通过查询工作)。
发布于 2019-04-19 19:03:33
至少在.NET 4.7中,您可以通过手动管理枚举数来绕过它。这已经过测试,并成功地通过了错误。
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();
}发布于 2016-07-11 19:13:08
在没有转换到UserPrincipal时,检查它的行为是否不同。
var changedUsersFromGroup = principalSearchResult.ToArray();按照其他螺纹的说法,这可能是个问题。同样,根据MSDN,使用不包含组对象的GetMembers(true)返回的主体集合,只返回叶节点,因此可能根本不需要这种转换。接下来,要检查这种搜索会返回多少个结果。如果您的AD有许多用户/嵌套组,最好不要使用GetMembers(true)来确保它在小用户组上工作。
https://stackoverflow.com/questions/38204758
复制相似问题