Исходя из предположения Нолдорина, вот код, обратите внимание, я только что подключился на 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 серверов, вам, возможно, придется переделать