2009-05-14 10 views
0

J'utilise C# 3.0 et l'espace de noms System.DirectoryServices (pas l'espace de noms System.DirectoryServices.AccountManagement plus récent de .NET 3.5). Comment puis-je trouver tous les serveurs SMTP sur le domaine local? Est-ce seulement possible? Y a-t-il un autre moyen d'accomplir cela?C# 3.0: Trouver des serveurs SMTP dans un domaine

Répondre

0

Je ne pense pas que vous puissiez le faire avec DirectoryServices.

Une option serait de tenter une connexion à chaque serveur du domaine sur le port SMTP (25), et de voir si elles répondent aux commandes SMTP standard. Cela peut facilement être fait en utilisant la classe TcpClient, si vous avez une liste des machines dans le domaine.

Bien sûr, ce ne serait pas trouver des serveurs qui n'utilisent pas le port standard (mais si le serveur n'utilise pas le port standard, il pourrait ne pas être intéressé par être trouvé en premier lieu :-)

+0

Il est à noter que faire un tel balayage de réseau comme celui-ci est généralement désapprouvé par mes gens de TI, et peut vous atterrir dans l'eau chaude si elles le détectent. – cyberconte

+0

@cyberconte: C'est peut-être le seul moyen. Tant que vous mettez en cache les résultats, cela ne devrait pas être un gros problème. – Noldorin

1

Je doute que les serveurs de domaine explicitement publient le fait qu'ils sont des serveurs SMTP (je peux me tromper), bien que la solution devrait être assez simple néanmoins.

  • Trouver chaque serveur dans le domaine actif.
  • Tentative de connexion au serveur sur le port 25 (SMTP).
  • Attendez une réponse 220 indiquant que le serveur est prêt. (Voir le RFC document pour le protocole.) Si vous recevez cette commande dans un certain délai après la connexion (par exemple, 3 secondes), alors vous pouvez conclure que l'ordinateur actuel est un serveur SMTP.

Espérons que ça aide.

0

Basé sur la suggestion de noldorin, voici quelques code, note je viens de connecter sur 25, je n'attends pas le 220 du serveur. Cela a fonctionné sur notre domaine. C'est regex brutal pour obtenir le nom du serveur basé sur le chemin 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(); 
} 

En outre, je pense que FindAll souffre de la contrainte habituelle AD, ce qui est un 1000 résultats, donc si vous avez plus de 1000 serveurs dans votre domaine, vous pourriez avoir à retravailler

0

Si vous voulez pour trouver le serveur de messagerie d'un domaine afin d'envoyer du courrier à ce domaine puis en utilisant le DNS MX est le chemin à parcourir, comme mjmarh déjà suggéré. Si vous souhaitez identifier tous les services SMTP arbitraires dans votre domaine en utilisant AD, vous pouvez tirer parti du fait que la plupart des serveurs SMTP s'inscrivent dans AD, par exemple Exchange, et vous pouvez interroger les services AD pour connaître leur emplacement. Par exemple, ce livre blanc explique comment les clients Outlook découvrent leur serveur de boîtes aux lettres à l'aide des répertoires actifs: http://technet.microsoft.com/en-us/library/bb332063.aspx Sur certains domaines, effectuer un scan des ports sur toutes les machines allume tout mécanisme de détection d'intrusion qu'ils ont comme un arbre de Noël et vous pouvez vous retrouver avec votre application adresse réseau éteinte.

Questions connexes