Programaticamente adicionar uma DLL de extensão ISAPI no IIS 7 usando ADSI?

1

Estou tentando adicionar programaticamente uma DLL de extensão ISAPI no IIS usando ADSI. Isso tem funcionado por muito tempo em versões anteriores do IIS, mas parece falhar no IIS 7.

Estou usando um código semelhante, como mostrado em esta questão :

var web = GetObject("IIS://localhost/W3SVC/1/ROOT/specificVirtualDirectory");
var maps = web.ScriptMaps.toArray();
map[maps.length] = ".aaa,c:\path\to\isapi\extension.dll,1,GET,POST";
web.ScriptMaps = maps.asDictionary();
web.SetInfo();

Depois de executar esse código, vejo uma entrada "AboMapperCustom-12345678" para essa dll específica nos "Mapeamentos do manipulador" do diretório virtual específico no qual adicionei o mapa de script. Mas quando tento usar essa extensão em um navegador, sempre obtenho

HTTP Error 404.2 Not Found
The page you are requesting cannot be served because of the ISAPI and CGI Restriction list settings on the Web server.

Mesmo depois de adicionar uma entrada para permitir essa dll específica nas "restrições ISAPI e CGI", continuo recebendo esse erro.

Para fazê-lo funcionar, primeiro tenho que desfazer essas etapas (encontrando o mesmo problema como o OP da questão mencionada acima: depois de excluir a entrada do mapa de script da GUI do gerenciador do IIS, também tenho que excluí-la programaticamente usando ADSI antes de realmente ter ido da metabase).

E, em seguida, adicione manualmente uma entrada como esta:

  • inetmgr - > webserver - > website - > diretório virtual - > mapeamentos do manipulador - > adicionar mapa de script ...
  • caminho = * .dll, executável = <path to dll> , name = <doesn't matter, but it's mandatory>
  • clique em "sim" na pergunta "deseja permitir essa extensão ISAPI?"

Quando comparo as duas entradas, elas são exatamente iguais, exceto pelo "Tipo de entrada", que parece ser "Herdado" para o adicionado programaticamente e "Local" para o adicionado manualmente.

O mais estranho é que, apesar de dizer "Herdado", não vejo isso em nenhum lugar do IIS em um nível mais alto. De onde é herdar?

No meu código, adiciono o mapa de script ao diretório virtual específico, para que ele também seja "Local". Talvez haja o problema, mas não sei como adicionar um mapa de script "local" usando ADSI.

Eu realmente gostaria de continuar usando o método ADSI, caso contrário, terei que usar métodos diferentes em nossa configuração ao trabalhar com o IIS 7 ou versões anteriores, e gostaria de evitar isso.

Para recapitular: como posso adicionar programaticamente uma entrada do mapa de script e sua entrada de restrições CGI e ISAPI complementares ao IIS 7 usando ADSI?

Alguém que pode lançar alguma luz sobre isso? Qualquer ajuda apreciada.

    
por fretje 21.04.2010 / 11:15

2 respostas

1

O IIS7 não é 100% compatível com a estrutura da Metabase das versões anteriores, você precisa ativá-lo. Nos "serviços de função" do IIS, verifique se você tem "Compatibilidade da Metabase IIS6" ativada.

Veja os 2 sites a seguir para obter mais informações: link link
link

Com isso dito, descobri que a compatibilidade com ADSI e Metabase não parece ser 100% confiável. Uma solução muito melhor seria reequipar seu script para usar o appcmd.exe. O comando seria algo como:

appcmd set config /section:handlers /+[name='MyIsapiExtension',path='*.aaa',verb='GET,POST',scriptProcessor='c:\path\to\extension.dll']

Veja este site para mais informações: link

    
por 21.04.2010 / 18:41
0

Eu finalmente resolvi isso do jeito que eu estava tentando evitar, usando appcmd . Mas para adicionar a @ MattB's answer , precisei adicionar um parâmetro extra modules='IsapiModule' para que realmente funcionasse:

appcmd set config 'website/virtualdir' /section:handlers /+[name='a name',path='*.dll',verb='*',scriptProcessor='path\to\webisapi.dll',modules='IsapiModule']

E também precisei adicionar uma entrada à seção "Restrições ISAPI e CGI":

appcmd set config /section:isapiCgiRestriction /+[path='path\to\isapi.dll', description='a description',allowed='True']

Verifico a existência de %windir%\system32\inetsrv\appcmd.exe para determinar qual caminho usar. Se existir, eu uso appcmd , se isso não acontecer, eu volto para ADSI .

Ainda interessado em um modo ADSI puro!

    
por 27.04.2010 / 10:48