Вот две вспомогательные функции, которые нужно добавить в ответ Гаретса. С их помощью вы можете перебирать каждый домен и получать все его виртуальные каталоги, включая те, которые не находятся в корневой папке доменов.
Получить идентификатор сайта из доменного имени:
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;
}
Получить все записи-потомки (рекурсивно) для входа в сайт
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();
}
Отображение идентификаторов сайтов для большого количества сайтов
Редактировать: После тестирования этого с сервером, содержащим несколько сотен доменов, GetSiteID () работает очень медленно, потому что он снова и снова перечисляет все сайты, чтобы получить идентификатор. Приведенная ниже функция перечисляет сайты только один раз, отображает каждый из них на свой идентификатор и сохраняет его в словаре. Затем, когда вам нужен идентификатор сайта, вы извлекаете его из словаря, Sites ["domain"]. Если вы ищете виртуальные каталоги для всех сайтов на сервере, или большое количество, ниже будет гораздо быстрее, чем GetSiteID () выше.
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;
}