Мне любопытно, окажет ли следующее негативное влияние на производительность значительным образом...
У меня есть веб-форма с полем ввода и сеткой (на самом деле это может быть любая форма приложения), которая позволяет пользователю искать пользователей в Active Directory... Мне не нужны учетные записи пользователей, которые имеют $ как часть там sAMAccountName и поэтому мне интересно, следует ли мне вернуть их, а затем отфильтровать их в цикле в приложении или их следует исключить в фильтре ActiveDirectory, как показано ниже:
(&(objectCateogry=person)(objectClass=user)(!(sAMAccountName=*$*))(cn=<Insert User Query>))
Я думаю, что это *$*, которое, как я обеспокоен, повлияет на производительность ... любое понимание будет очень признательно!
Ответ 1 · Per Noalt
Я бы включил (!(sAMAccountName=*$*)) в запрос по следующим причинам:
- Он индексируется в Active Directory, поэтому поиск выполняется быстро.
- В большинстве сред контроллеры домена не так сильно страдают, как веб-серверы, и у них есть запасные ЦП и ОЗУ.
Я просто предполагаю, но я думаю, что дополнительные записи, которые контроллеры домена должны будут обрабатывать и отправлять на веб-сервер, на самом деле сделают все немного дольше. Вы можете попробовать оба способа в своей среде и измерить разницу.
Кроме того, вы можете взглянуть на классы в System.DirectoryServices.Protocols, если вас интересует производительность.
Ответ 2 · landpy
Фильтр по 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: "(&{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, пожалуйста, свяжитесь со мной :)