【问题标题】:List all virtual directories in IIS 5,6 and 7列出 IIS 5,6 和 7 中的所有虚拟目录
【发布时间】:2010-10-14 23:54:16
【问题描述】:

我正在尝试在 IIS 站点中创建所有虚拟目录的列表。但是,我发现在旧版本的 IIS 中尝试执行此操作的方式差异很大。在 IIS 7 中,通过 C# 这是一项相对简单的任务,但我似乎无法在 IIS 6 和 5 中找到一个好的方法。

我尝试过使用 System.DirectoryServices.DirectoryEntry,但这似乎没有给我想要的输出。

我是服务器管理员,所以我愿意使用其他东西,例如 IIS 中内置的 .vbs 文件以及编写我自己的代码。

【问题讨论】:

标签: c# vb.net vbscript


【解决方案1】:

这里有两个示例应该可以在 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);
       }
}

【讨论】:

  • 这很有帮助。但是,它似乎只能在站点的根文件夹中获取虚拟目录,要获取站点的所有虚拟目录,我必须通过进入孩子的孩子等递归地执行此操作,对吗?
  • @Despertar 是的,您必须编写一个递归方法来迭代每个孩子的孩子。做起来应该很简单。有时间我会更新我的答案。
  • 我在下面提供了辅助方法来执行此操作。我知道时间并不总是那么容易找到。
【解决方案2】:

这里有两个辅助函数可以添加到 Garetts 答案中。使用这些,您可以遍历每个域并获取其所有虚拟目录,包括不在域根文件夹中的目录。

从域名获取站点 ID:

    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();
    }

为大量网站映射网站 ID

编辑:在使用包含数百个域的服务器对此进行测试后,GetSiteID() 执行速度非常慢,因为它一次又一次地枚举所有站点以获取 id。下面的函数仅枚举站点一次,并将每个站点映射到其 id 并将其存储在字典中。然后,当您需要站点 ID 时,您可以将其从字典中提取,即 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;
    }

【讨论】:

    【解决方案3】:

    您是否尝试过使用 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 下的网站。我正在尝试获取 1 个站点下的所有虚拟目录。
    • 我编辑了我的答案,以便列出目录及其目录类型。希望这有效
    【解决方案4】:

    我知道您要的是 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;
            }
        }
    

    希望你能从中得到大致的想法。

    【讨论】:

      猜你喜欢
      • 2012-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-06
      • 1970-01-01
      • 1970-01-01
      • 2011-09-19
      • 2016-04-15
      相关资源
      最近更新 更多