2011-12-20 2 views
0

Если я следующие AD доменов путь:Поиск глобального домена в Active Directory

AD Дорожки:

  • LDAP://AAA.CORP.XX.COM
  • LDAP://BBB.CORP.XX.COM
  • LDAP://CCC.BBB.CORP.XX.COM
  • LDAP://DDD.CORP.XX.COM
  • LDAP://EEE.CORP.XX.COM
  • LDAP://FFF.CORP.XX.COM

мне нужно искать в указанных областях для пользователя, если существует в одном из них или нет.

Мое текущее решение:

я петельные через все домены выше и для каждого домена я проверить, если пользователь существует или нет, и в одной из областей выше потребовалось от 6-7 секунд, а остальные взяли менее 1 второй.

Предлагаемые решения для повышения производительности:

  1. Попробуйте искать пользователя в родительском домене, который должен быть LDAP://CORP.XX.COM так Это сэкономит количество поиска вместо 5 запросов для каждого домена, чтобы быть 1 поиск родительского домена
  2. Попробуйте использовать «Глобальный каталог» ==> Мне нужно Guid здесь (учебник с C# код)

Какое решение лучше для повышения производительности проблемы?

+0

какой код у вас есть?? что делает ваше соединение cn = dn = ect ... похоже ... вы создаете объект DirectorySearcher ...? также при поиске пользователей, какой атрибут вы планируете искать/проверять ..? SAMAccount ... ect .. – MethodMan

+0

DirectoryEntry de = new DirectoryEntry(); de.Path = "LDAP: //AAA.CORP.XX.COM "; Формат фильтра поиска = (& (objectClass = пользователь) (sAMAccountName = {0})) –

+0

hold on Позвольте мне посмотреть, могу ли я отправить вам некоторые фрагменты кода, которые вы сможете последовать, дать мне 2 минуты в порядке String GetName (имя пользователя строки) также будет работать для вас .. в любом случае вам нравится I – MethodMan

ответ

0

Вот класс, который я написал и использовал в нескольких местах искать через методов, чтобы увидеть, что вы можете использовать ..

using System; 
using System.Text; 
using System.Collections; 
using System.DirectoryServices; 
using System.Diagnostics; 
using System.Data.Common; 

namespace Vertex_VVIS.SourceCode 
{ 
    public class LdapAuthentication 
    { 
     private String _path; 
     private String _filterAttribute; 

     public LdapAuthentication(String path) 
     { 
      _path = path; 
     } 
public bool IsAuthenticated(String domain, String username, String pwd) 
     { 
      String domainAndUsername = domain + @"\" + username; 
      DirectoryEntry entry = new DirectoryEntry(_path, domainAndUsername, pwd); 

      try 
      { //Bind to the native AdsObject to force authentication.   
       // Object obj = entry.NativeObject; 

       DirectorySearcher search = new DirectorySearcher(entry); 

       search.Filter = "(SAMAccountName=" + username + ")"; 
       search.PropertiesToLoad.Add("cn"); 
       SearchResult result = search.FindOne(); 

       if (null == result) 
       { 
        return false; 
       } 

       //Update the new path to the user in the directory. 
       _path = result.Path; 
       _filterAttribute = (String)result.Properties["cn"][0]; 
      } 
      catch (Exception ex) 
      { 
       throw new Exception("Error authenticating user. " + ex.Message); 
      } 

      return true; 
     } 

     public String GetName(string username) 
     { 

      String thename = null; 

      try 
      { 
       DirectoryEntry de = new DirectoryEntry(_path); 
       DirectorySearcher ds = new DirectorySearcher(de); 
       ds.Filter = String.Format("(SAMAccountName={0})", username); 
       ds.PropertiesToLoad.Add("displayName"); 
       SearchResult result = ds.FindOne(); 
       if (result.Properties["displayName"].Count > 0) 
       { 
        thename = result.Properties["displayName"][0].ToString(); 
       } 
       else 
       { 
        thename = "NA"; 
       } 
      } 
      catch (Exception ex) 
      { 
       throw new Exception("Error Getting Name. " + ex.Message); 
      } 

      return thename.ToString(); 
     } 

     public String GetEmailAddress(string username) 
     { 
      String theaddress = null; 
      try 
      { 
       DirectoryEntry de = new DirectoryEntry(_path); 
       DirectorySearcher ds = new DirectorySearcher(de); 
       ds.Filter = String.Format("(SAMAccountName={0})", username); 
       ds.PropertiesToLoad.Add("mail"); 
       SearchResult result = ds.FindOne(); 
       theaddress = result.Properties["mail"][0].ToString(); 
       de.Close(); 
      } 
      catch (Exception ex) 
      { 
       throw new Exception("Error Getting Email Address. " + ex.Message); 
      } 

      return theaddress.ToString(); 
     } 
     public String GetTitle(string username) 
     { 
      String thetitle = null; 
      try 
      { 
       DirectoryEntry de = new DirectoryEntry(_path); 
       DirectorySearcher ds = new DirectorySearcher(de); 
       ds.Filter = String.Format("(SAMAccountName={0})", username); 
       ds.PropertiesToLoad.Add("title"); 
       SearchResult result = ds.FindOne(); 
       result.GetDirectoryEntry(); 
       if (result.Properties["title"].Count > 0) 
       { 
        thetitle = result.Properties["title"][0].ToString(); 
       } 
       else 
       { 
        thetitle = "NA"; 
       } 
      } 
      catch (Exception ex) 
      { 
       throw new Exception("Error Getting the Title. " + ex.Message); 
      } 

      return thetitle.ToString(); 
     } 

     public String GetPhone(string username) 
     { 
      String thephone = null; 
      try 
      { 
       DirectoryEntry de = new DirectoryEntry(_path); 
       DirectorySearcher ds = new DirectorySearcher(de); 
       ds.Filter = String.Format("(SAMAccountName={0})", username); 
       ds.PropertiesToLoad.Add("mobile"); 
       SearchResult result = ds.FindOne(); 
       result.GetDirectoryEntry(); 
       if (result.Properties["mobile"].Count > 0) 
       { 
        thephone = result.Properties["mobile"][0].ToString(); 
       } 
       else 
       { 
        thephone = "NA"; 
       } 
      } 
      catch (Exception ex) 
      { 
       throw new Exception("Error Getting Phone Number. " + ex.Message); 
      } 

      return thephone.ToString(); 
     } 

     public String GetGroups() 
     { 
      DirectorySearcher search = new DirectorySearcher(_path); 
      search.Filter = "(cn=" + _filterAttribute + ")"; 
      search.PropertiesToLoad.Add("memberOf"); 
      StringBuilder groupNames = new StringBuilder(); 

      try 
      { 
       SearchResult result = search.FindOne(); 

       int propertyCount = result.Properties["memberOf"].Count; 

       String dn; 
       int equalsIndex, commaIndex; 

       for (int propertyCounter = 0; propertyCounter < propertyCount; propertyCounter++) 
       { 
        dn = (String)result.Properties["memberOf"][propertyCounter]; 

        equalsIndex = dn.IndexOf("=", 1); 
        commaIndex = dn.IndexOf(",", 1); 
        if (-1 == equalsIndex) 
        { 
         return null; 
        } 

        groupNames.Append(dn.Substring((equalsIndex + 1), (commaIndex - equalsIndex) - 1)); 
        groupNames.Append("|"); 

       } 
      } 
      catch (Exception ex) 
      { 
       throw new Exception("Error obtaining group names. " + ex.Message); 
      } 
      return groupNames.ToString(); 
     } 

     public bool IsUserGroupMember(string strUserName, string strGroupString) 
     { 
      bool bMemberOf = false; 
      ResultPropertyValueCollection rpvcResult = null; 
      try 
      { 
       DirectoryEntry de = new DirectoryEntry(_path); 
       DirectorySearcher ds = new DirectorySearcher(de); 
       ds.Filter = String.Format("(SAMAccountName={0})", strUserName); 
       ds.PropertiesToLoad.Add("memberOf"); 
       SearchResult result = ds.FindOne(); 
       string propertyName = "memberOf"; 
       rpvcResult = result.Properties[propertyName]; 

       foreach (Object propertyValue in rpvcResult) 
       { 
        if (propertyValue.ToString().ToUpper() == strGroupString.ToUpper()) 
        { 
         bMemberOf = true; 
         break; 
        } 
       } 
      } 
      catch (Exception ex) 
      { 
       throw new Exception("Error Getting member of. " + ex.Message); 
      } 

      return bMemberOf; 

     } 
    } 
} 
+0

Спасибо, DJ, я переместил ваш код, но он, похоже, ищет пользователя на основе пути к домену. поэтому у меня все еще есть такая же проблема, что я буду искать для каждого домена, и это моя главная проблема. Мне нужно нажать поиск 1 раз вместо 5 раз. –

2

Если вы используете .NET 3.5 или более поздней версии, вы должны быть в состоянии использовать PrincipalSearcher и «запрос по образцу» принципал сделать ваш поиск:

// create your domain context 
// here, you could also include a specific domain, if needed 
PrincipalContext ctx = new PrincipalContext(ContextType.Domain); 

// define a "query-by-example" principal - here, we search for a UserPrincipal 
UserPrincipal qbeUser = new UserPrincipal(ctx); 

// if you're looking for a particular user - you can limit the search by specifying 
// e.g. a SAMAccountName, a first name - whatever criteria you are looking for 
qbeUser.SamAccountName = "johndoe"; 

// create your principal searcher passing in the QBE principal  
PrincipalSearcher srch = new PrincipalSearcher(qbeUser); 

// find all matches 
foreach(var found in srch.FindAll()) 
{ 
    // do whatever here - "found" is of type "Principal" - it could be user, group, computer.....   
} 

Вы можете указать любого из свойств на UserPrincipal и использовать их в качестве «запроса по образцу» для вашего PrincipalSearcher , Это намного проще, чем использование более старого подхода DirectorySearcher.

Если вы еще не - абсолютно прочитать статью Managing Directory Security Principals in the .NET Framework 3.5 MSDN, который показывает хорошо, как сделать наилучшим образом использовать новые функции в System.DirectoryServices.AccountManagement

+0

Спасибо marc_s: Я пропустил часть кода, определяющую родительское доменное имя (я думаю, в мой случай должен быть: CORP.XX.COM) Должен ли я передать это имя в принципеContext() ???? –

+0

@ thabet084: Я попытался бы начать, не пропуская ничего - просто чтобы увидеть, где вы в конечном итоге и где он ищет в первую очередь. Как только это будет запущено, начните играть с прохождением в различных путях LDAP в качестве отправных точек. –

+0

good point Marc Я полностью забыл об этом. Я лично так использовал, чтобы использовать то, что я разместил, из-за LDAP, AD и одного из инструментов Java, которые мне приходилось запрашивать, когда это выглядит знакомым сейчас, когда я вижу контекст lol. Я проголосовал за вас – MethodMan

Смежные вопросы