Производительность запросов ActiveDirectory для исключения

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

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

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

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


person davidsleeps    schedule 20.07.2009    source источник


Ответы (2)


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

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

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

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

person Per Noalt    schedule 20.07.2009

Фильтр по 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, "[email protected]")
                            )
                    )
                );
        Assert.AreEqual("(&(objectClass=user)(ou=pangxiaoliangOU)(|(cn=pang*)(&(cn=*liu)([email protected]))))", filter.BuildFilter());
        foreach (var userObject in UserObject.FindAll(this.ADOperator, filter))
        {
            using (userObject)
            {
                Console.WriteLine(userObject.DisplayName);
            }
        }
    }
}

https://landpyactivedirectory.codeplex.com/documentation

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

person landpy    schedule 12.09.2013