System.DirectoryServices работает медленно?
Я использую приведенный ниже код для поиска информации в активном каталоге, когда пользователь входит на сайт. Работать с локальным доменом очень быстро, а через VPN к удаленному доверенному домену - очень медленно (занимает около 7 или 8 секунд). Запуск dsa.msc из той же коробки в удаленный домен почти так же быстр, как и локальный.
Я использую фильтрацию свойств для извлечения минимально возможного объема данных, поэтому есть ли что-то медленное в System.DirectoryServices в этом сценарии, или у кого-нибудь есть подсказки, как повысить производительность?
Сетевое соединение через VPN в порядке, только этот код работает медленно.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.DirectoryServices;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
using (var LDAPConnection = new DirectoryEntry("LDAP://domain/dc=domain,dc=com", "username", "password"))
{
LDAPConnection.AuthenticationType = AuthenticationTypes.Secure;
using (DirectorySearcher Searcher = new DirectorySearcher(LDAPConnection))
{
Searcher.Filter = "(&(&(objectclass=user)(objectcategory=person))sAMAccountName=username)";
Searcher.PropertiesToLoad.Add("mail");
SearchResult result = Searcher.FindOne(); //this line takes ages!
string EmailAddress = result.Properties["mail"][0].ToString();
Console.WriteLine(EmailAddress);
}
}
}
}
}
2 ответа
Другое предложение заключается в использовании System.DirectoryServices.Protocols
непосредственно; ваш код будет выглядеть так:
string filter = "(&(&(objectclass=user)(objectcategory=person))" +
"sAMAccountName=username)";
NetworkCredential credentials = new NetworkCredential(...);
LdapDirectoryIdentifier directoryIdentifier =
new LdapDirectoryIdentifier("server", 389, false, false);
using (LdapConnection connection =
new LdapConnection(directoryIdentifier, credentials, AuthType.Basic))
{
connection.Timeout = new TimeSpan(0, 0, 30);
connection.SessionOptions.ProtocolVersion = 3;
SearchRequest search =
new SearchRequest(query, filter, SearchScope.Base, "mail");
SearchResponse response = connection.SendRequest(search) as SearchResponse;
foreach(SearchResultEntry entry in response.Entries)
{
Console.WriteLine(entry.Attributes["mail"][0]);
}
}
Я никогда не пробовал описанный вами сценарий (подключение через VPN к Active Directory), но помеченная вами линия - это строка, которая приводит к открытию соединения. Вы не подключены к серверу до вызова FindOne. Я предполагаю, что установление соединения длится 7-8 секунд.
Если вы не можете найти точный ответ по stackru, попробуйте этот форум: http://directoryprogramming.net/forums/default.aspx (я не говорю, что stackru бесполезен, но я нашел некоторые ответы на мои вопросы по ad/ldap по DirectoryProgramming.net форум).