Pregunta

Utilizo código como el siguiente en ASP.NET para enumerar los sitios web en 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);
    }
}

Sin embargo, encuentro que solo se procesan los primeros 11 sitios de 16 sitios. He luchado con esto durante unas horas y no puedo encontrar ninguna forma de superar los primeros 11 sitios en IIS. He intentado buscar recursivamente, he intentado usar el DirectorySearcher en vano, he intentado enumerar varias veces o usar algún tipo de filtro sin suerte.

¿Algunas ideas?

¡Gracias!

~ mellamokb

¿Fue útil?

Solución

He decidido usar WMI en lugar de servicios de directorio, que parece funcionar perfectamente:

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 />");
}

Otros consejos

Para enumerar todos los sitios en el servidor local, puede probar esto:

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

¿Estás por casualidad ejecutando IIS 7? Si es así, eso podría explicar el problema, ya que la metabase existe solo por razones de compatibilidad; Ya no es la tienda principal.

Probablemente necesitaría analizar ApplicationHost.Config en su lugar, aunque WMI también es una buena opción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top