代码之家  ›  专栏  ›  技术社区  ›  Avitus

列出IIS 5、6和7中的所有虚拟目录

  •  4
  • Avitus  · 技术社区  · 15 年前

    我正在尝试创建一个IIS站点中所有虚拟目录的列表。但是,我发现,在旧版本的IIS中,尝试这样做的方式有很大的不同。在IIs7中,这是一个相对容易的任务,通过C,但我似乎找不到一个在IIs6和5中这样做的好方法。

    我尝试过使用System.DirectoryServices.DirectoryEntry,但这似乎无法提供所需的输出。

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

    4 回复  |  直到 14 年前
        1
  •  0
  •   Raymund    15 年前

    是否尝试使用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/

        2
  •  4
  •   Garett    15 年前

    下面是两个可以跨IIS 5、6和7工作的示例(安装了IIS 6 WMI兼容性)。我用IIs5和IIs7都成功地测试了。

    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);
           }
    }
    
        3
  •  2
  •   Despertar    14 年前

    这里有两个助手函数添加到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时,您可以从字典中提取它,即站点[“域”]。如果要查找服务器上所有站点的虚拟目录,或查找大量站点,则下面的目录将比上面的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;
        }
    
        4
  •  0
  •   Allen Rice 0x6A75616E    15 年前

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

    希望你能从中得到一般的想法。