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

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

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

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

您是否尝试过使用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); } } 

这里有两个辅助函数可以添加到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 children = new List(); 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 MapSiteIDs() { DirectoryEntry IIS = new DirectoryEntry("IIS://localhost/W3SVC"); Dictionary dictionary = new Dictionary(); // 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 _virtualDirectories = null; private IDictionary virtualDirectories { get { if (_virtualDirectories == null) { _virtualDirectories = new Dictionary(); DirectoryEntry folderRoot = iisServer.Children.Find("Root", VirDirSchemaName); foreach (DirectoryEntry virtualDirectory in folderRoot.Children) { _virtualDirectories.Add(virtualDirectory.Name, virtualDirectory); } } return _virtualDirectories; } } 

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