Перечислите все виртуальные каталоги в IIS 5,6 и 7 - PullRequest
4 голосов
/ 15 октября 2010

Я пытаюсь создать список всех виртуальных каталогов на сайте IIS.Однако я обнаружил, что попытки сделать это сильно различаются в старых версиях IIS.В IIS 7 это довольно простая задача через C #, но я не могу найти хороший способ сделать это в IIS 6 и 5.

Я пытался использовать System.DirectoryServices.DirectoryEntry, но это неКажется, я не получаю желаемого результата.

Я администратор сервера, поэтому я открыт для использования других вещей, таких как файлы .vbs, которые встроены в IIS, а также для написания собственного кода.

Ответы [ 4 ]

4 голосов
/ 15 октября 2010

Вот два примера, которые должны работать в 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);
       }
}
2 голосов
/ 10 мая 2012

Вот две вспомогательные функции, которые нужно добавить в ответ Гаретса. С их помощью вы можете перебирать каждый домен и получать все его виртуальные каталоги, включая те, которые не находятся в корневой папке доменов.

Получить идентификатор сайта из доменного имени:

    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;
    }
0 голосов
/ 16 октября 2010

Я знаю, что вы спрашиваете о решениях 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;
        }
    }

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

0 голосов
/ 15 октября 2010

вы пытались использовать 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/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...