Перечислите все виртуальные каталоги в 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;
        }
    }

Надеюсь, вы сможете получить общее представление об этом.

Другие вопросы по тегам