Como usar o ServerManager para ler os sites do IIS, não o IIS express, a partir da biblioteca de classes ou como os processos elevados lidam com as bibliotecas de classes?

Tenho alguns métodos de utilidade que usam Microsoft.Web.Administration.ServerManager com os quais tenho tido alguns problemas. Use o seguinte código simples morto para fins de ilustração.

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

Se eu colocar esse código diretamente em uma aplicação de console e executá-lo, ele vai obter e listar os sites do IIS express. Se eu executar esse aplicativo a partir de um prompt de comando elevado, ele vai listar os sites IIS7. Um pouco inconveniente, mas até agora tudo bem.

se em vez disso eu puser esse código numa biblioteca de classes que é referenciada e chamado pelo aplicativo de console, ele sempre listará os sites do IIS Express, mesmo que o aplicativo de console seja elevado.

O Google levou-me a tentar o seguinte, sem sorte.

//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");
É evidente que percebi mal alguma coisa na forma como um processo "elevado" funciona. Não deveria tudo ser executado em um processo elevado, mesmo código de outro dll, ser executado com direitos elevados? Evidentemente não?

Obrigado pela ajuda!

Author: Josh, 2011-12-12

3 answers

Certifique-se de que está a adicionar a referência à Microsoft correcta.Site.Administração, deve ser v7. 0. 0. 0 que está localizado sob c:\windows\system32\inetsrv\ Parece que está a adicionar uma referência à Microsoft do IIS Express.Site.Administraiton que lhe dará esse comportamento

 56
Author: Carlos Aguilar Mares, 2011-12-12 21:41:56

A tua pergunta ajudou-me a encontrar a resposta para o PowerShell, por isso, se a Internet está à procura de como fazer isso:

$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, 2014-01-30 08:39:12

Cuidado! Usando esta abordagem, temos visto problemas aparentemente aleatórios, tais como exceções de" operação não suportada", falha em Adicionar/Remover ligações HTTPS, falha em Iniciar/Parar piscinas de aplicações quando executado no IIS Express, e outros problemas. Desconhece-se se isto se deve ao facto de o IIS ser geralmente deficiente ou à abordagem pouco ortodoxa aqui descrita. Em geral, minha impressão é que todas as ferramentas para automatizar IIS (appcmd, Microsoft.Site.Administração, PowerShell, ...) are wonky e instável, especialmente em diferentes versões do so. Bons testes é (como sempre) aconselhável!

O pacote normal Microsoft.Web.Administration instalado a partir do NuGet funciona bem. Não há necessidade de copiar qualquer DLLs do sistema.

A solução óbvia da documentação oficial também funciona bem:

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

Isto funciona mesmo que execute o acima dentro do conjunto de aplicações do IIS Express. Você ainda verá a configuração do IIS" real". Você mesmo será capaz de adicionar novos sites, desde que sua aplicação funciona como um usuário com permissão para fazê-lo.

Note, No entanto, que o construtor acima está documentado como "Microsoft internal use only":

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

 4
Author: Florian Winter, 2018-10-02 09:24:15