C # 3.0: поиск SMTP-серверов в домене - PullRequest
1 голос
/ 14 мая 2009

Я использую C # 3.0 и пространство имен System.DirectoryServices (не более новое System.DirectoryServices.AccountManagement пространство имен .NET 3.5). Как я могу найти все SMTP-серверы в локальном домене? Это вообще возможно? Есть ли другой способ сделать это?

Ответы [ 5 ]

2 голосов
/ 14 мая 2009

Другой подход заключается в выполнении запросов DNS MX (Mail Exchange record) для поиска SMTP-серверов для данного домена:

Пример кода проекта

Образец Egghead (извините, не удалось найти оригинальный пост)

1 голос
/ 14 мая 2009

Я сомневаюсь, что серверы доменов явно публикуют тот факт, что они являются SMTP-серверами (я могу ошибаться), хотя решение, тем не менее, должно быть довольно простым.

  • Найти каждый сервер в активном домене.
  • Попытка подключения к серверу через порт 25 (SMTP).
  • Дождитесь ответа 220, который указывает, что сервер готов. (Сведения о протоколе см. В документе RFC .) Если вы получите эту команду в течение определенного времени после подключения (скажем, 3 секунды), вы можете сделать вывод, что текущий компьютер является SMTP-сервером.

Надеюсь, это поможет.

0 голосов
/ 14 мая 2009

Если вы хотите найти почтовый сервер домена для отправки почты в этот домен, то использование DNS MX - это путь, как уже предлагал mjmarh. Если вы хотите идентифицировать все произвольные службы SMTP в своем домене с помощью AD, вы можете использовать тот факт, что большинство SMTP-серверов регистрируются в AD, например, Exchange, и вы можете опросить службы AD, чтобы выяснить их местоположение. Например, в этом техническом документе объясняется, как клиенты Outlook обнаруживают свой сервер почтовых ящиков с помощью активных каталогов: http://technet.microsoft.com/en-us/library/bb332063.aspx На определенном домене, выполняющем сканирование портов на всех машинах, загорается любой механизм обнаружения вторжений, который у них есть, например, рождественская елка, и вы можете в конечном итоге отключить сетевой адрес приложения.

0 голосов
/ 14 мая 2009

Исходя из предположения Нолдорина, вот код, обратите внимание, я только что подключился на 25, я не жду 220 с сервера. Это сработало на нашем домене. Это жестокое регулярное выражение для получения имени сервера на основе пути LDAP.

static void Main()
        {

             DirectorySearcher ds = new DirectorySearcher("");
             ds.Filter = "objectCategory=computer";
             SearchResultCollection results = ds.FindAll();
             foreach (SearchResult result in results)
             {
                 string pattern = @"(?<=LDAP://CN=)(?<serverName>\w*)(?=,*)";
                 Match m = Regex.Match(result.Path, pattern);
                 string serverName = m.Groups["serverName"].Value;

                 System.Net.Sockets.TcpClient tcp = new System.Net.Sockets.TcpClient();
                 try
                 {
                     tcp.Connect(serverName, 25);

                     if (tcp.Connected)
                     {
                         Console.WriteLine(String.Format("Connected to {0} on Port 25", serverName));
                     }
                 }

                 catch (Exception ex)
                 {
                     Console.WriteLine("Exception: " + ex.Message);
                 }

                 finally
                 {
                     tcp.Close();
                 }

             }

             Console.WriteLine("Done.");
             Console.ReadLine();
}

Кроме того, я думаю, что FindAll страдает от обычного ограничения AD, которое составляет 1000 результатов, поэтому, если в вашем домене более 1000 серверов, вам, возможно, придется переделать

0 голосов
/ 14 мая 2009

Я не думаю, что вы можете сделать это с DirectoryServices.

Один из вариантов - попытаться подключиться к каждому серверу в домене через порт SMTP (25) и посмотреть, отвечают ли они на стандартные команды SMTP. Это легко сделать с помощью класса TcpClient, если у вас есть список компьютеров в домене.

Конечно, это не приведет к тому, что серверы не будут использовать стандартный порт (но если сервер не использует стандартный порт, он может быть не заинтересован в том, чтобы его сначала нашли: -)

...