c# - tiene - no se puede agregar una referencia al proyecto visual studio
Cómo usar ServerManager para leer sitios IIS, no IIS express, desde la biblioteca de clases O ¿cómo manejan los procesos elevados las bibliotecas de clases? (3)
Tengo algunos métodos de utilidad que usan Microsoft.Web.Administration.ServerManager
que he tenido algunos problemas. 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 ejecuto, obtendrá y listará los sitios web express de IIS. Si ejecuto esa aplicación desde un símbolo del sistema elevado, aparecerá una lista de los sitios web de IIS7. Un poco incómodo, pero hasta ahora todo bien.
Si, en cambio, pongo ese código en una biblioteca de clase a la que la aplicación de la consola hace referencia y llama, SIEMPRE mostrará una lista de los sitios de IIS Express, incluso si la aplicación de la 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 código de otro dll, con derechos elevados? Evidentemente no?
¡Gracias por la ayuda!
Asegúrese de que está agregando la referencia a la administración Microsoft.Web correcta, debe ser v7.0.0.0 que se encuentra en c: / windows / system32 / inetsrv / Parece que está agregando una referencia a Microsoft.Web de IIS Express .Administración que le dará ese comportamiento
El paquete regular de 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 podrá agregar sitios nuevos, siempre que su aplicación se ejecute como un usuario con permiso para hacerlo.
Sin embargo, tenga en cuenta que el constructor anterior está documentado como "solo para uso interno de Microsoft":
Tu pregunta me ayudó a encontrar la respuesta para PowerShell, por lo 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