Перечислите все виртуальные каталоги в IIS 5,6 и 7
Я пытаюсь создать список всех виртуальных каталогов на сайте IIS. Однако я обнаружил, что попытки сделать это сильно различаются в старых версиях IIS. В IIS 7 это довольно простая задача через C#, но я не могу найти хороший способ сделать это в IIS 6 и 5.
Я пытался использовать System.DirectoryServices.DirectoryEntry, но это не дает мне желаемого результата.
Я администратор сервера, поэтому я открыт для использования других вещей, таких как файлы.vbs, которые встроены в IIS, а также для написания собственного кода.
4 ответа
Вы пытались использовать GetObject("IIS://ServerName/W3SVC")
Вы делаете это в VBS, как это
'Get the IIS Server Object
Set oW3SVC = GetObject("IIS://ServerName/W3SVC/1/ROOT")
For Each oVirtualDirectory In oW3SVC
Set oFile = CreateObject("Scripting.FileSystemObject")
Set oTextFile = oFile.OpenTextFile("C:\Results.txt", 8, True)
oTextFile.WriteLine(oVirtualDirectory.class + " -" + oVirtualDirectory.Name)
oTextFile.Close
Next
Set oTextFile = Nothing
Set oFile = Nothing
Wscript.Echo "Done"
У меня есть статья об этом здесь -> http://anyrest.wordpress.com/2010/02/10/how-to-list-all-websites-in-iis/
Вот два примера, которые должны работать в IIS 5, 6 и 7 (с установленной совместимостью IIS 6 WMI). Я успешно протестировал как с IIS 5 и 7.
Версия VBScript
Function ListVirtualDirectories(serverName, siteId)
Dim webSite
Dim webDirectory
On Error Resume Next
Set webSite = GetObject( "IIS://" & serverName & "/W3SVC/" & siteId & "/ROOT" )
If ( Err <> 0 ) Then
Err = 0
Exit Function
Else
For Each webDirectory in webSite
If webDirectory.Class = "IIsWebVirtualDir" Then
WScript.Echo "Found virtual directory " & webDirectory.Name
End If
Next
End If
End Function
Версия на C#
void ListVirtualDirectories(string serverName, int siteId)
{
DirectoryEntry webService = new DirectoryEntry("IIS://" + serverName + "/W3SVC/" + siteId + "/ROOT");
foreach (DirectoryEntry webDir in webService.Children)
{
if (webDir.SchemaClassName.Equals("IIsWebVirtualDir"))
Console.WriteLine("Found virtual directory {0}", webDir.Name);
}
}
Вот две вспомогательные функции, которые нужно добавить в ответ Гаретса. С их помощью вы можете перебирать каждый домен и получать все его виртуальные каталоги, включая те, которые не находятся в корневой папке доменов.
Получить идентификатор сайта из доменного имени:
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;
}
Я знаю, что вы спрашиваете о решениях VB, я действительно не знаю VB, я скорее человек из C#. Во всяком случае, здесь немного кода C#.NET, взятого из приложения, которое я написал некоторое время назад, в котором перечислены виртуальные каталоги IIS...
using System.DirectoryServices;
private DirectoryEntry _iisServer = null;
private DirectoryEntry iisServer
{
get
{
if (_iisServer == null)
{
string path = string.Format("IIS://{0}/W3SVC/1", serverName);
_iisServer = new DirectoryEntry(path);
}
return _iisServer;
}
}
private IDictionary<string, DirectoryEntry> _virtualDirectories = null;
private IDictionary<string, DirectoryEntry> virtualDirectories
{
get
{
if (_virtualDirectories == null)
{
_virtualDirectories = new Dictionary<string, DirectoryEntry>();
DirectoryEntry folderRoot = iisServer.Children.Find("Root", VirDirSchemaName);
foreach (DirectoryEntry virtualDirectory in folderRoot.Children)
{
_virtualDirectories.Add(virtualDirectory.Name, virtualDirectory);
}
}
return _virtualDirectories;
}
}
Надеюсь, вы сможете получить общее представление об этом.