¿Cómo usar ServerManager para leer sitios de IIS, no IIS express, desde la biblioteca de clases O cómo manejan los procesos elevados las bibliotecas de clases?


Tengo algunos métodos de utilidad que utiliza Microsoft.Web.Administration.ServerManager que he estado teniendo algunos problemas con. Utilice el siguiente código simple muerto para fines ilustrativos.

using(var mgr = new ServerManager())
{
    foreach(var site in mgr.Sites)
    {
        Console.WriteLine(site.Name);
    }
}

Si pongo ese código directamente en una aplicación de consola y lo corro, obtendrá y enumerará los sitios web de IIS express. Si corro esa aplicación desde un símbolo del sistema con privilegios elevados, mostrará una lista de los sitios web de IIS7. Un poco inconveniente, pero hasta ahora todo bien.

Si en su lugar pongo ese código en una biblioteca de clases a la que se hace referencia y llamada por la aplicación de consola, siempre mostrará una lista de los sitios de IIS Express, incluso si la aplicación de consola está elevada.

Google me ha llevado a probar lo siguiente, sin suerte.

//This returns IIS express
var mgr = new ServerManager();
//This returns IIS express
var mgr = ServerManager.OpenRemote(Environment.MachineName);
//This throws an exception
var mgr = new  ServerManager(@"%windir%\system32\inetsrv\config\applicationhost.config");

Evidentemente he malinterpretado algo en la forma en que se ejecuta un proceso "elevado". ¿No debería ejecutarse todo lo que se ejecuta en un proceso elevado, incluso el código de otra dll, con derechos elevados? Evidentemente no?

Gracias por la ayuda!

Author: Josh, 2011-12-12

3 answers

Asegúrese de que está agregando la referencia al Microsoft correcto.Web.De la administración, debe ser v7.0.0.0 que se encuentra en c:\windows\system32\inetsrv\ Parece que está agregando una referencia a Microsoft de IIS Express.Web.Administración que le dará ese comportamiento

 56
Author: Carlos Aguilar Mares,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-12 21:41:56

Tu pregunta me ayudó a encontrar la respuesta para PowerShell, así que si Internet está buscando cómo hacerlo:

$assembly = [System.Reflection.Assembly]::LoadFrom("$env:systemroot\system32\inetsrv\Microsoft.Web.Administration.dll")

# load IIS express
$iis = new-object Microsoft.Web.Administration.ServerManager 
$iis.Sites

# load IIS proper
$iis = new-object Microsoft.Web.Administration.ServerManager "$env:systemroot\system32\inetsrv\config\applicationhost.config"  
$iis.Sites
 8
Author: Richard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-30 08:39:12

¡PRECAUCIÓN! Usando este enfoque, hemos visto problemas aparentemente aleatorios, como excepciones de "operación no compatible", falla al agregar/eliminar enlaces HTTPS, falla al iniciar/detener grupos de aplicaciones cuando se ejecutan en IIS Express y otros problemas. Se desconoce si esto se debe a que IIS es generalmente defectuoso o debido al enfoque poco ortodoxo descrito aquí. En general, mi impresión es que todas las herramientas para automatizar IIS (appcmd, Microsoft.Web.Administración, PowerShell ...) son wonky y inestable, especialmente en diferentes versiones del sistema operativo. Una buena prueba es (como siempre) recomendable!

El paquete regular Microsoft.Web.Administration instalado desde NuGet funciona bien. No es necesario copiar ninguna DLL del sistema.

La solución obvia de la documentación oficial también funciona bien:

ServerManager iisManager = new ServerManager(@"C:\Windows\System32\inetsrv\config\applicationHost.config");

Esto funciona incluso si ejecuta lo anterior desde el grupo de aplicaciones de IIS Express. Todavía verá la configuración del IIS" real". Incluso será capaz de añadir nuevos sitios, siempre y cuando su la aplicación se ejecuta como un usuario con permiso para hacerlo.

Tenga en cuenta, sin embargo, que el constructor anterior está documentado como "Microsoft internal use only":

Https://msdn.microsoft.com/en-us/library/ms617371 (v=vs.90). aspx

 4
Author: Florian Winter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-02 09:24:15