代码之家  ›  专栏  ›  技术社区  ›  mellamokb Dan

asp.net iis元数据库不会返回所有站点

  •  0
  • mellamokb Dan  · 技术社区  · 16 年前

    我在ASP.Net中使用如下代码枚举IIS中的网站:

    string metabasePath = "IIS://localhost/W3SVC";
    DirectoryEntry service = new DirectoryEntry(metabasePath);
    
    service.RefreshCache();
    string className = service.SchemaClassName.ToString();
    
    if (className.EndsWith("Service"))
    {
        DirectoryEntries sites = service.Children;
        foreach (DirectoryEntry site in sites)
        {
            ProcessSite(site);
        }
    }
    

    然而,我发现在16个站点中只有前11个站点被处理过。我已经为此奋斗了几个小时,但找不到任何方法通过IIS中的前11个站点。我尝试过递归搜索,我尝试过使用DirectorySearcher,但没有任何效果,我尝试过多次枚举或使用某种过滤器,但没有任何运气。

    有什么想法吗?

    ~mellamokb

    3 回复  |  直到 16 年前
        1
  •  2
  •   mellamokb Dan    16 年前

    我决定使用WMI而不是DirectoryServices,这似乎工作得很好:

    ManagementScope oms = new ManagementScope(@"\\.\root\MicrosoftIISv2");
    oms.Connect();
    
    ObjectQuery oQuery = new ObjectQuery("select * from IISWebServerSetting");
    ManagementObjectSearcher oSearcher = new ManagementObjectSearcher(oms, oQuery);
    foreach (ManagementObject oreturn in oSearcher.Get())
    {
        Response.Write(oreturn["ServerComment"] + " (" + oreturn["Name"] + ")<br />");
    }
    
        2
  •  1
  •   Darin Dimitrov    16 年前

    要枚举本地服务器上的所有站点,可以尝试以下操作:

    class Program
    {
        static void Main(string[] args)
        {
            var iis = new DirectoryEntry("IIS://localhost/W3SVC");
            var sites = (from DirectoryEntry entry in iis.Children
                         where entry.SchemaClassName == "IIsWebServer"
                         select entry).ToArray();
    
            foreach (var site in sites)
            {
                Console.WriteLine(site.Name);
            }
        }
    
        3
  •  0
  •   RickNZ    16 年前

    您是否碰巧运行了IIS 7?如果是这样的话,这也许可以解释问题,因为元数据库的存在只是出于兼容性的原因;它不再是主存储。

    推荐文章