gpt4 book ai didi

c# - 当组(或递归的子组)包含 ForeignSecurityPrincipal 时,GroupPrincipal.GetMembers 失败

转载 作者:可可西里 更新时间:2023-11-01 08:27:37 29 4
gpt4 key购买 nike

这与其说是一个问题,不如说是给遇到同样问题的任何人的信息。

出现以下错误:

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).aspxFSP 不是 AD 中的真实对象,而是指向位于不同的受信任域/林中的对象的占位符(指针)。它也可以是“特殊身份”之一,这些身份是一群知名帐户,也被归类为 FSP,因为它们的 SID 与域 SID 不同。例如此处记录的匿名、经过身份验证的用户、批处理和其他几个帐户: http://technet.microsoft.com/en-us/library/cc779144(v=WS.10).aspx

最佳答案

当然,这是一个旧线程,但可能会对某些人有所帮助。我使用下面的代码块来解决问题。 Principal 类公开了一个名为 StructuralObjectClass 的属性,它告诉您该主体的 AD 类是什么。我用它来决定对象是否是用户。 GetMembers(true) 递归地搜索相关 groupPrincipal 中的所有嵌套成员。

希望这对某人有帮助。

    List<UserPrincipal> members = new List<UserPrincipal>();
foreach (var principal in groupPrincipal.GetMembers(true))
{
var type = principal.StructuralObjectClass;
if (type.Contains("user"))
members.Add((UserPrincipal)principal);
}

谢谢,R

关于c# - 当组(或递归的子组)包含 ForeignSecurityPrincipal 时,GroupPrincipal.GetMembers 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10853995/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com