Вопрос по c#, ldap – Как искать в нескольких доменах, используя System.DirectoryServices.AccountManagement?

13

У меня есть три или более доменов, какmain.com, sub.main.com, sub2.main.com и так далее

У меня есть код:

using (PrincipalContext ctx = 
    new PrincipalContext(ContextType.Domain, "ADServer", 
    "dc=main,dc=com", ContextOptions.Negotiate))
{
    UserPrincipal u = new UserPrincipal(ctx);
    u.UserPrincipalName = "*" + mask + "*";

    using (PrincipalSearcher ps = new PrincipalSearcher(u))
    {
       PrincipalSearchResult<Principal> results = ps.FindAll();
       List<ADUser> lst = new List<ADUser>();

       foreach (var item in results.Cast<UserPrincipal>().Take(15))
       {
           byte[] sid = new byte[item.Sid.BinaryLength];
           item.Sid.GetBinaryForm(sid, 0);

           ADUser us = new ADUser()
           {
               Sid = sid,
               Account = item.SamAccountName,
               FullName = item.DisplayName
           };

           lst.Add(us);
       }

    }

    return lst;
}

Но он ищет только в одном домене:main.com.

Как я могу искать записи во всех доменах одновременно?

Я не думаю, что вы можете искать в нескольких доменах одновременно. Вам необходимо «сериализовать» ваши поиски. marc_s
ты имеешь в виду, что я должен знать домены и искать их с циклом? Yuriy Vikulov

Ваш Ответ

3   ответа
10

/* Retreiving RootDSE
 */
string ldapBase = "LDAP://DC_DNS_NAME:389/";
string sFromWhere = ldapBase + "rootDSE";
DirectoryEntry root = new DirectoryEntry(sFromWhere, "AdminLogin", "PWD");
string configurationNamingContext = root.Properties["configurationNamingContext"][0].ToString();

/* Retreiving the root of all the domains
 */
sFromWhere = ldapBase + configurationNamingContext;
DirectoryEntry deBase = new DirectoryEntry(sFromWhere, "AdminLogin", "PWD");

DirectorySearcher dsLookForDomain = new DirectorySearcher(deBase);
dsLookForDomain.Filter = "(&(objectClass=crossRef)(nETBIOSName=*))";
dsLookForDomain.SearchScope = SearchScope.Subtree;
dsLookForDomain.PropertiesToLoad.Add("nCName");
dsLookForDomain.PropertiesToLoad.Add("dnsRoot");

SearchResultCollection srcDomains = dsLookForDomain.FindAll();

foreach (SearchResult aSRDomain in srcDomains)
{
}

Тогда каждый домен, вы можете искать то, что вам нужно.

Спасибо такжеnew DirectoryEntry("LDAP://server IP/DC=my-domain,DC=com", ...) работал нормально.
нет:389 порт в моем случае.
Вы должны найти GC на вашем домене.
22

var path="GC://DC=main,DC=com";
try {
  using (var root = new DirectoryEntry(path, username, password)) {
    var searchFilter=string.Format("(&(anr={0})(objectCategory=user)(objectClass=user))", mask);
    using (var searcher = new DirectorySearcher(root, searchFilter, new[] { "objectSid", "userPrincipalName" })) {
    var results = searcher.FindAll();
    foreach(SearchResult item in results){
       //What ever you do
    }
} catch (DirectoryServicesCOMException) {
    // username or password are wrong
}
За проголосовал за видимость. Лучший ответ после поиска по множеству ресурсов
хех, где ты был? :-) Спасибо Yuriy Vikulov
Спасибо, это работает как очарование и проще, чем принятый ответ.
2

nt для поиска, укажите домен следующим образом:

new PrincipalContext(ContextType.Domain, "xyz.mycorp.com:3268", "DC=mycorp,DC=com");

От Когда мне нужно доменное имя и контейнер домена для создания PrincipalContext?

Похожие вопросы