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
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 :-)
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.
Une autre approche serait de faire des requêtes DNS MX (record d'échange de courrier) pour trouver les serveurs SMTP pour un domaine donné:
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
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.
- 1. Comment trouver des serveurs SQL situés dans des domaines "relatifs"
- 2. Comment masquer des serveurs distribués sous un seul domaine?
- 3. Convertir un domaine non ASCII en compatible SMTP
- 4. Outils pour trouver des noms de domaine
- 5. C++ Email/SMTP
- 6. Impossible d'envoyer des e-mails à un domaine externe à l'aide du protocole SMTP
- 7. Comment implémenter la 'protection de domaine' dans ActionScript 3.0
- 8. comment utiliser ssl avec smtp dans C++
- 9. Trouver des assemblées dans un répertoire
- 10. Comment authentifier SMTP en C#
- 11. Bonne bibliothèque SMTP + SSL/TLS pour C?
- 12. Comment rediriger différentes demandes de sous-domaine vers différents serveurs
- 13. Trouver des champs vides dans un objet - C#
- 14. SMTP Email
- 15. Comment trouver la longueur d'un tableau associatif dans ActionScript 3.0?
- 16. C# 3.0 - Initialiseur d'objet
- 17. C#: obtenir des informations sur l'ordinateur dans le domaine
- 18. Comment pouvez-vous trouver des serveurs ldap disponibles à partir d'un ordinateur sur le même réseau, mais avec un domaine différent?
- 19. Authentification du compte d'utilisateur local Windows dans C# 3.0
- 20. Détection de serveurs DHCP distants dans .NET
- 21. C# 3.0 Types anonymes: Nommer
- 22. Python 3.0 smtplib
- 23. erreurs de messagerie SMTP dans Rails
- 24. SMTP dans iPhone
- 25. Assemblages consommant du code C# 2.0 compilés avec C# 3.0
- 26. Comment trouver des "trous" dans un tableau
- 27. Trouver l'état des contrôles dans un ListView
- 28. Connexion à des serveurs POP3
- 29. Déboguer un serveur SMTP avec un proxy
- 30. Cookie sur un domaine intranet
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
@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