繁体   English   中英

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

[英]List all virtual directories in IIS 5,6 and 7

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

我已经尝试使用System.DirectoryServices.DirectoryEntry,但似乎没有给我所需的输出。

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

以下两个示例应该适用于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);
       }
}

这里有两个辅助函数可以添加到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;
    }

你尝试过使用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/

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM