Производительность запросов ActiveDirectory за не включая - PullRequest
0 голосов
/ 20 июля 2009

Мне любопытно, окажет ли следующее негативное влияние на производительность в значительной степени ...

У меня есть веб-форма с полем ввода и сеткой (на самом деле это может быть любая форма приложения), которая позволяет пользователю выполнять поиск пользователей в Active Directory ... Я не хочу, чтобы учетные записи пользователей имели $ как часть там sAMAccountName и поэтому мне интересно, должен ли я вернуть их, а затем отфильтровать их в цикле в приложении или их следует исключить в фильтре ActiveDirectory, как показано ниже:

(&(objectCateogry=person)(objectClass=user)(!(sAMAccountName=*$*))(cn=<Insert User Query>))

Я полагаю, что именно *$* повлияет на производительность ... любая оценка будет принята с благодарностью!

Ответы [ 2 ]

0 голосов
/ 12 сентября 2013

Фильтр об AD как следующий:

class ExpressionTemplates
{
    /// <summary>
    /// The start with expression. eg: "({0}={1}*)".
    /// </summary>
    public readonly static string StartWithExpression = "({0}={1}*)";

    /// <summary>
    /// The end with expression. eg: "({0}=*{1})".
    /// </summary>
    public readonly static string EndWithExpression = "({0}=*{1})";

    /// <summary>
    /// The has a value expression. eg: "({0}=*)".
    /// </summary>
    public readonly static string HasAValueExpression = "({0}=*)";

    /// <summary>
    /// The has no value expression. eg: "(!{0}=*)".
    /// </summary>
    public readonly static string HasNoValueExpression = "(!{0}=*)";

    /// <summary>
    /// The is expression. eg: "({0}={1})".
    /// </summary>
    public readonly static string IsExpression = "({0}={1})";

    /// <summary>
    /// The is not expression. eg: "(!{0}={1})".
    /// </summary>
    public readonly static string IsNotExpression = "(!{0}={1})";

    /// <summary>
    /// The and expression. eg: "(&amp;{0})".
    /// </summary>
    public readonly static string And = "(&{0})";
    /// <summary>
    /// The or expression. eg: "(|{0})".
    /// </summary>
    public readonly static string Or = "(|{0})";

    /// <summary>
    /// The parenthesis expression. eg: "({0})".
    /// </summary>
    public readonly static string Parenthesis = "({0})";

    /// <summary>
    /// The join expression. eg: "{0}{1}".
    /// </summary>
    public readonly static string Join = "{0}{1}";
}

Вы можете сослаться на мой проект OSS, основанный на шаблоне ActiveRecord, следующим образом (поскольку он является открытым исходным кодом, вы можете узнать, как работать с AD с DirectoryEntry, DirectoryEntry поддерживает не только протокол LDAP, но также IIS, WIN и т. Д. поэтому я разрабатываю эту библиотеку):

class ComplexFilterUnitTest : BaseUnitTest
{
    [TestCase]
    public void TestComplexFilter()
    {
        IFilter filter =
            new And(
                new IsUser(),
                new Is(OrganizationalUnitAttributeNames.OU, "pangxiaoliangOU"),
                new Or(
                        new StartWith(AttributeNames.CN, "pang"),
                        new And(
                            new EndWith(AttributeNames.CN, "liu"),
                            new Is(PersonAttributeNames.Mail, "mv@live.cn")
                            )
                    )
                );
        Assert.AreEqual("(&(objectClass=user)(ou=pangxiaoliangOU)(|(cn=pang*)(&(cn=*liu)(mail=mv@live.cn))))", filter.BuildFilter());
        foreach (var userObject in UserObject.FindAll(this.ADOperator, filter))
        {
            using (userObject)
            {
                Console.WriteLine(userObject.DisplayName);
            }
        }
    }
}

https://landpyactivedirectory.codeplex.com/documentation

И вам будет легко управлять AD, если вы не заинтересованы в нем, пожалуйста, проигнорируйте мой ответ. Любой вопрос о AD, пожалуйста, свяжитесь со мной:)

0 голосов
/ 20 июля 2009

Я бы включил (!(sAMAccountName=*$*)) в запрос по следующим причинам:

  1. Он проиндексирован в Active Directory, поэтому поиск выполняется быстро.
  2. В большинстве сред контроллеры доменов не так сильно поражают, как веб-серверы, и у них есть свободные ЦП и ОЗУ.

Я просто догадываюсь, но я думаю, что дополнительные записи, которые контроллеры домена должны будут обрабатывать и отправлять на веб-сервер, на самом деле заставят все занять немного больше времени. Вы можете попробовать оба способа в своей среде и измерить разницу.

Кроме того, вы можете взглянуть на классы в System.DirectoryServices.Protocols, если вы заинтересованы в производительности.

...