代码之家  ›  专栏  ›  技术社区  ›  brad

C 3.0:在域中查找SMTP服务器

  •  1
  • brad  · 技术社区  · 15 年前

    我用的是C 3.0和 System.DirectoryServices 命名空间(不是较新的 System.DirectoryServices.AccountManagement .net 3.5)的命名空间。如何查找本地域上的所有SMTP服务器?这可能吗?有没有其他方法来实现这个目标?

    5 回复  |  直到 15 年前
        1
  •  2
  •   Mike Marshall    15 年前

    另一种方法是执行dns mx(邮件交换记录)查询以查找给定域的smtp服务器:

    Code Project Sample

    Egghead sample (sorry, could not find the original post)

        2
  •  1
  •   Noldorin    15 年前

    我怀疑域服务器 明确地 公布它们是smtp服务器的事实(我可能错了),尽管解决方案应该非常简单。

    • 查找活动域中的每个服务器。
    • 尝试连接到端口25(SMTP)上的服务器。
    • 等待一个 220 响应,指示服务器已就绪。(见 RFC document 对于协议。)如果在连接后的特定时间内(例如3秒)收到此命令,则可以断定当前计算机是SMTP服务器。

    希望能有所帮助。

        3
  •  0
  •   driis    15 年前

    我认为你不能用DirectoryServices来做。

    一种方法是尝试连接到域上SMTP端口(25)上的每个服务器,并查看它们是否响应标准的SMTP命令。如果您有域中计算机的列表,那么可以使用tcpclient类轻松完成此操作。

    当然,这不会找到不使用标准端口的服务器(但如果服务器不使用标准端口,则可能不希望首先找到它:-)

        4
  •  0
  •   Ta01    15 年前

    根据Noldorin的建议,这里有一些代码,注意我只是在25号连接,我没有在服务器上等待220。这对我们的领域有效。这是基于ldap路径获取服务器名称的野蛮regex。

    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受到了通常的广告限制,即1000个结果,因此如果您的域中有超过1000个服务器,则可能需要重新编写

        5
  •  0
  •   Remus Rusanu    15 年前

    如果您想找到一个域的邮件服务器以便向该域发送邮件,那么使用dns mx是一种方法,正如mjmarh已经建议的那样。 如果要使用AD标识域中的所有任意SMTP服务,则可以利用这样一个事实:大多数SMTP服务器都将在AD中注册自己,例如Exchange会在AD中注册,并且可以查询AD服务以查找其位置。例如,本白皮书解释了Outlook客户端如何使用活动目录发现其邮箱服务器: http://technet.microsoft.com/en-us/library/bb332063.aspx 在某个域上,对所有计算机进行端口扫描会像圣诞树一样点亮任何入侵检测机制,最终可能导致应用程序网络地址关闭。

    推荐文章