我们在“mydomain.com”中有用户,在“child.mydomain.com”中有用户。当我们尝试列出它们时,我们只能找到“mydomain.com”的用户和组,但我们也需要来自子域的那些用户和组。如何使用C#实现这一目标?请看一下我的示例代码:
context = new PrincipalContext(ContextType.Domain);
//...
var filter = new GroupPrincipal(context);
filter.IsSecurityGroup = true;
using(var searcher = new PrincipalSearcher(filter)
using(var results = searcher.FindAll())
{
foreach(GroupPrincipal group in results)
{
string path = "LDAP://rootDSE";
DirectoryEntry searchRoot = new DirectoryEntry(path);
string configNC = searchRoot.Properties["configurationNamingContext"].Value.ToString();
DirectoryEntry configSearchRoot = new DirectoryEntry("LDAP://" + configNC);
DirectorySearcher configSearch = new DirectorySearcher(configSearchRoot);
configSearch.Filter("(NETBIOSName=*)");
configSearch.PropertiesToLoad.Add("dnsroot");
configSearch.PropertiesToLoad.Add("ncname");
configSearch.PropertiesToLoad.Add("NETBIOSName");
SearchResultCollection forestPartitionList = configSearch.FindAll();
List<Tuple<string,string>> netbiosNameList = new List<Tuple<string,string>>(forestPartitionList.Count);
foreach(SearchResult domainPartition in forestPartitionList)
{
string ncname = domainPartition.Properties["ncname"][0].ToString();
string netBIOSName = domainPartition.Properties["NETBIOSName"][0].ToString();
netbiosNameList.Add(Tuple.Create(ncname, netBIOSName));
}
//...
//Find group members
using (var principal = GroupPrincipal.FindByIdentity(context, IdentityType.DistinguishedName, group.DistinguishedName))
using (var members = principal.GetMembers(true))
using (var enumerator = members.GetEnumerator())
{
//...
}
}
}
代码并不是用这种方式编写的,我只想向您展示查询AD的主要调用。我们可以列出父域组和用户,但不能列出子域组。如果我更改了通过子域IP和用户/密码的“context”变量的初始化,我可以列出其中的组和用户。但我们希望能够在父域中这样做。
我希望你能帮助我。非常感谢!
答案 0 :(得分:1)
您可以查询global catalog。
它包含多域Active Directory林中每个域中每个对象的只读,可搜索,部分表示。
GC在端口3268(标准ldap)和3269(SSL ldap)上运行。只需连接上述两个端口之一的任何域控制器,您的搜索将自动定向到GC服务器。
要执行任何修改,您必须将此请求发送到对象所属的特定域的域控制器。