Há alturas em que a tua aplicação web ou site, que é servida pelo IIS, tem de executar comandos. Para isso, está claro, tens de atribuir permissões ao utilizador que está a correr a aplicação ou site.

Antes de avançar, é importante realçar que atribuir permissões erradas ao cmd.exe é um risco de segurança e deve ser feito com cautela.

Há uns tempos estive a trabalhar numa aplicação que permitia executar comandos do composer diretamente pelo browser. Para que tudo funcionasse corretamente, tive de atribuir permissões ao utilizador do IIS para o cmd.exe. Mas a tarefa foi mais complexa do que parecia inicialmente. Ora, por norma, quando pretendes atribuir permissões (por exemplo, para escrita de ficheiros), basta adicionares o utilizador IUSR (ou IIS_IUSRS) e tudo corre perfeitamente. Mas, por questões de segurança (e alguma rabugisse..), o Windows não é tão permissivo quando se trata do C:\Windows\System32\cmd.exe.

Consegui definir as permissões conforme descrevo nos dois pontos abaixo.

1. Impossibilidade de atribuir permissões ao cmd.exe

A primeira situação com que me deparei foi a impossibilidade de alterar as permissões ao ficheiro cmd.exe. Mesmo executando o Explorer como administrador, não eram ativados os botões que permitem definir novos utilizadores ou alterar permissões.

Atribuir permissões ao cmd.exe para aplicações ou sites servidos pelo IIS images/25-atribuir-permissoes-cmd-exe-para-aplicacoes-sites-servidos-por-iis/unable-to-add-or-change-cmd-permissions.png

A solução para isto é forçar o ownership do ficheiro para o nosso utilizador através do comando takeown, executando o comando:

takeown /F c:\windows\system32\cmd.exe

Atenção que este comando apenas tem sucesso se executares o cmd como Administrador. Para isso pesquisa cmd no Menu Iniciar, clica com o botão direito do rato e seleciona Executar como Ddministrador

Atribuir permissões ao cmd.exe para aplicações ou sites servidos pelo IIS images/25-atribuir-permissoes-cmd-exe-para-aplicacoes-sites-servidos-por-iis/run-cmd-as-administrator.png

Depois de executado o comando é apresentada uma mensagem semelhante à visualizada na figura seguinte.

Atribuir permissões ao cmd.exe para aplicações ou sites servidos pelo IIS images/25-atribuir-permissoes-cmd-exe-para-aplicacoes-sites-servidos-por-iis/takeown-cmd-exe-successfull.png
2. Atribuição de permissões ao utilizador correto

Agora que consegues atribuir permissões ao cmd.exe com sucesso, deves selecionar o utilizador para o qual pretendes atribuir permissões. Como disse anteriormente, por norma seria o IUSR, mas neste caso concreto não é.

O IIS usa utilizadores específicos consoante a Application Pool que está associada ao website ou aplicação. Por omissão o IIS vem com uma Application Pool chamada DefaultAppPool. No entanto, se criares novos websites e não alterares a Application Pool, uma nova será criada com o nome que atribuiste ao site.

Portanto, o utilizador ao qual deves atribuir permissões no cmd.exe é o utilizador específico da Application Pool e não o genérico IUSR. Podes visualizar a lista de Application Pools diretamente no IIS Manager

Atribuir permissões ao cmd.exe para aplicações ou sites servidos pelo IIS images/25-atribuir-permissoes-cmd-exe-para-aplicacoes-sites-servidos-por-iis/iis-manager-application-pools.png

Para atribuires permissões ao utilizador, deves aceder às Propriedades do ficheiro cmd e no separador Segurança clicar em Adicionar (que ficou ativo depois do primeiro passo). Nota que se procurares todos os utilizadores da máquina as Application Pools não são apresentadas. Por isso, tens de escrever manualmente o nome da Application Pool, precedido por IIS AppPool\ e depois clicar em “Check Names”. Por exemplo IIS AppPool\DefaultAppPool.

Atribuir permissões ao cmd.exe para aplicações ou sites servidos pelo IIS images/25-atribuir-permissoes-cmd-exe-para-aplicacoes-sites-servidos-por-iis/set-permissions-to-cmd-exe-iis-application-pool-user.png

Fica a nota que também podes alterar as permissões diretamente através da linha de comandos usando o cacls ou o icacls, como mostrado abaixo.

cacls c:\windows\system32\cmd.exe /E /G "IIS AppPool\DefaultAppPool":F
icacls c:\windows\system32\cmd.exe /grant "IIS AppPool\DefaultAppPool":F