Voici deux fonctions auxiliaires à ajouter à la réponse Garetts. Avec ceux-ci, vous pouvez parcourir chaque domaine et obtenir tous ses répertoires virtuels, y compris ceux qui ne sont pas dans le dossier racine des domaines.
Obtenir ID du site du nom de domaine:
string GetSiteID(string domain)
{
string siteId = string.Empty;
DirectoryEntry iis = new DirectoryEntry("IIS://localhost/W3SVC");
foreach (DirectoryEntry entry in iis.Children)
if (entry.SchemaClassName.ToLower() == "iiswebserver")
if (entry.Properties["ServerComment"].Value.ToString().ToLower() == domain.ToLower())
siteId = entry.Name;
if (string.IsNullOrEmpty(siteId))
throw new Exception("Could not find site '" + domain + "'");
return siteId;
}
obtenir toutes les entrées descendant (récursive) pour l'entrée du site
static DirectoryEntry[] GetAllChildren(DirectoryEntry entry)
{
List<DirectoryEntry> children = new List<DirectoryEntry>();
foreach (DirectoryEntry child in entry.Children)
{
children.Add(child);
children.AddRange(GetAllChildren(child));
}
return children.ToArray();
}
Mapping ID du site est pour un grand nombre de sites
Modifier: À l'arrière En testant ceci avec un serveur contenant plusieurs centaines de domaines, GetSiteID() fonctionne très lentement car il énumère tous les sites encore et encore pour obtenir l'identifiant. La fonction ci-dessous énumère les sites une seule fois et les met en correspondance avec leur identifiant et les stocke dans un dictionnaire. Ensuite, lorsque vous avez besoin de l'identifiant du site, vous le retirez du dictionnaire à la place, Sites ["domain"]. Si vous cherchez des répertoires virtuels pour tous les sites sur un serveur, ou une grande quantité, le ci-dessous sera beaucoup plus rapide que GetSiteID() ci-dessus.
public static Dictionary<string, string> MapSiteIDs()
{
DirectoryEntry IIS = new DirectoryEntry("IIS://localhost/W3SVC");
Dictionary<string, string> dictionary = new Dictionary<string, string>(); // key=domain, value=siteId
foreach (DirectoryEntry entry in IIS.Children)
{
if (entry.SchemaClassName.ToLower() == "iiswebserver")
{
string domainName = entry.Properties["ServerComment"].Value.ToString().ToLower();
string siteID = entry.Name;
dictionary.Add(domainName, siteID);
}
}
return dictionary;
}
que je voulais faire quelque chose de similaire, mais de DOS: http://stackoverflow.com/q/13218046/589059 – rkagerer