gpt4 book ai didi

c# - 跨多林环境从域本地组获取所有成员

转载 作者:行者123 更新时间:2023-11-30 14:57:31 25 4
gpt4 key购买 nike

我有一个域本地组,它是林 A 中域 A 的一部分。

我正在尝试迭代该组中的所有成员。它很好地遍历林 A 的所有域,但不会遍历林 B 中域 b 中的任何组成员。

从不同森林开始迭代相同代码的唯一方法是什么?

我们已尝试使用 System.DirectoryServices.AccountManagement 类,但它们和 Windows Server 2012 域 Controller 似乎存在问题。

private List<User> getUsersInGroup(string groupDN)
{
var users = new List<User>();

using (DirectoryEntry de = new DirectoryEntry("GC://rootDSE"))
{
var rootName = de.Properties["rootDomainNamingContext"].Value.ToString();
using (var userBinding = new DirectoryEntry("GC://" + rootName))
{
using (DirectorySearcher adSearch = new DirectorySearcher(userBinding))
{
adSearch.ReferralChasing = ReferralChasingOption.All;
adSearch.Filter = String.Format("(&(memberOf={0})(objectClass=person))", groupDN);
adSearch.PropertiesToLoad.Add("distinguishedName");
adSearch.PropertiesToLoad.Add("givenname");
adSearch.PropertiesToLoad.Add("samaccountname");
adSearch.PropertiesToLoad.Add("sn");
adSearch.PropertiesToLoad.Add("title");
adSearch.PropertiesToLoad.Add("displayName");
adSearch.PropertiesToLoad.Add("department");

using (var searchResults = adSearch.FindAll())
{
foreach (SearchResult result in searchResults)
{
User u = new User();

u.UserName = result.Properties["samaccountname"][0].ToString();
u.DistinguishedName = result.Properties["distinguishedName"][0].ToString();
if (result.Properties.Contains("title"))
{
u.Title = result.Properties["title"][0].ToString();
}

if (result.Properties.Contains("department"))
{
u.Department = result.Properties["department"][0].ToString();
}

if (result.Properties.Contains("displayName"))
{
u.DisplayName = result.Properties["displayName"][0].ToString();
}
u.DomainName = getDomainFromDN(u.DistinguishedName);


users.Add(u);
}
}
}


}
}


return users;
}

预先感谢您的帮助。

最佳答案

您将无法使用 memberOf 属性在不同的林中搜索组成员,因为当您将用户添加到属于另一个林的域本地组时,它还没有设置.

相反,AD 在以目标用户的 SID 作为其 CN 的组域中创建类型为 ForeignSecurityPrincipal 的对象。然后该对象的 DN 被添加到组的 members 属性中。

不幸的是,与user 对象不同,foreingSecurityPrincipal 对象永远不会获得memberOf 属性,因此即使您删除,您的搜索也找不到它们strong>objectType 条件。

因此,您真的应该按照 rufanov 的建议反向搜索并枚举组的 members 属性。

但是您还应该扩展代码以处理那些外部安全主体。要检测您的 DirectoryEntry 是否代表外国委托(delegate)人,您可以检查其对象类是否包含 foreignSecurityPricipal。如果是这样,CN 属性将包含可用于按 objectSid 属性搜索的 SID

if (de.Properties["objectClass"].Contains("foreignSecurityPrincipal"))
{
// use this value in a search condition for objectSid
var sidString = de.Properties["cn"].Cast<string>().First();

IdentityReference id = new SecurityIdentifier(sid);

var account = id.Translate(typeof(NTAccount)).ToString().Split('\\');

var userName = account[1];
var domainName = account[0];
}

关于c# - 跨多林环境从域本地组获取所有成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20669922/

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