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?
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!
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
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
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