【发布时间】:2012-06-01 16:23:02
【问题描述】:
这不是一个问题,而是为遇到同样问题的人提供的信息。
出现以下错误:
System.DirectoryServices.AccountManagement.PrincipalOperationException: An error (87) occurred while enumerating the groups. The group's SID could not be resolved.
at System.DirectoryServices.AccountManagement.SidList.TranslateSids(String target, IntPtr[] pSids)
at System.DirectoryServices.AccountManagement.SidList.ctor(List`1 sidListByteFormat, String target, NetCred credentials)
at System.DirectoryServices.AccountManagement.ADDNLinkedAttrSet.TranslateForeignMembers()
当运行以下代码并且组或子组包含 ForeignSecurityPrincipal 时:
private static void GetUsersFromGroup()
{
var groupDistinguishedName = "CN=IIS_IUSRS,CN=Builtin,DC=Domain,DC=com";
//NB: Exception thrown during iteration of members rather than call to GetMembers.
using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "Domain", "Username", "Password"))
{
using (GroupPrincipal groupPrincipal = GroupPrincipal.FindByIdentity(ctx, IdentityType.DistinguishedName, groupDistinguishedName))
{
using (var searchResults = groupPrincipal.GetMembers(true))//Occurs when false also.
{
foreach (UserPrincipal item in searchResults.OfType())
{
Console.WriteLine("Found user: {0}", item.SamAccountName)
}
}
}
}
}
我向 Microsoft 拨打了支持电话,他们已确认这是一个问题。内部提出了一个错误,但尚未确认是否会修复。
Microsoft 建议了以下解决方法代码,但由于反复调用 UserPrincipal.FindByIdentity,它在具有大量用户的组中表现不佳。
class Program
{
//"CN=IIS_IUSRS,CN=Builtin,DC=dev-sp-sandbox,DC=local"; //TODO MODIFY THIS LINE ACCORDING TO YOUR DC CONFIGURATION
static void Main(string[] args)
{
if (args.Length != 1)
{
Console.WriteLine("Usage: ListGroupMembers \"group's DistinguishedName\"");
Console.WriteLine("Example: ListGroupMembers \"CN=IIS_IUSRS,CN=Builtin,DC=MyDomain,DC=local\"");
return;
}
string groupDistinguishedName = args[0];
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "dev-sp-dc", "Administrator", "Corp123!");
List<UserPrincipal> users = new List<UserPrincipal>();
listGroupMembers(groupDistinguishedName, ctx, users);
foreach (UserPrincipal u in users)
{
Console.WriteLine(u.DistinguishedName);
}
}
//Recursively list the group's members which are not Foreign Security Principals
private static void listGroupMembers(string groupDistinguishedName, PrincipalContext ctx, List<UserPrincipal> users)
{
DirectoryEntry group = new DirectoryEntry("LDAP://" + groupDistinguishedName);
foreach (string dn in group.Properties["member"])
{
DirectoryEntry gpMemberEntry = new DirectoryEntry("LDAP://" + dn);
System.DirectoryServices.PropertyCollection userProps = gpMemberEntry.Properties;
object[] objCls = (userProps["objectClass"].Value) as object[];
if (objCls.Contains("group"))
listGroupMembers(userProps["distinguishedName"].Value as string, ctx, users);
if (!objCls.Contains("foreignSecurityPrincipal"))
{
UserPrincipal u = UserPrincipal.FindByIdentity(ctx, IdentityType.DistinguishedName, dn);
if(u!=null) // u==null for any other types except users
users.Add(u);
}
}
}
}
上面的代码可以修改,以找到导致组问题的外部安全主体。
Microsoft 提供了有关外国安全主体的以下信息:
这是 AD 中的一类对象,它代表来自外部来源的安全主体(即另一个林/域或下面的“特殊”帐户之一)。 该课程记录在这里:http://msdn.microsoft.com/en-us/library/cc221858(v=PROT.10).aspx 容器记录在这里:http://msdn.microsoft.com/en-us/library/cc200915(v=PROT.10).aspx FSP 不是 AD 中的真实对象,而是指向位于不同的受信任域/林中的对象的占位符(指针)。它也可以是“特殊身份”之一,这是一堆众所周知的帐户,它们也被归类为 FSP,因为它们的 SID 与域 SID 不同。 例如,此处记录的匿名、经过身份验证的用户、批处理和其他几个帐户: http://technet.microsoft.com/en-us/library/cc779144(v=WS.10).aspx
【问题讨论】:
-
你有没有机会尝试我的答案?还是您采取了替代路线?
-
您知道此错误是否已在较新的 .net 框架版本中得到修复?
标签: c# active-directory directoryservices