Pergunta

Tenho uma aplicação ASP.NET. Basicamente, o processo de entrega é esta:

  • Nant constrói a aplicação e cria um arquivo zip no computador do desenvolvedor com os arquivos do aplicativo sem pastas do SVN e arquivos inúteis. Este arquivo é fornecido com um script Nant.
  • Os arquivos zip e Nant são copiados para o computador do cliente
  • o script Nant substitui os arquivos do site atual com o arquivo contido no arquivo zip.

O meu problema é que, com este processo Eu tenho um erro de acesso não autorizado ao tentar abrir o site. Parece que os arquivos precisam ter um conjunto de permissões para o usuário " IIS_WPG ".

Eu não tenho o poder de mudar o IIS configuração então eu tenho que alterar manualmente as permissões de cada arquivo. E cada vez que substituir os arquivos as permissões são removidos e eu preciso colocá-las novamente.

Então, eu tenho duas perguntas:

  • Posso alterar arquivos permissões com Nant? Como fazê-lo?
  • É possível evitar este problema? (Desenvolvedores não têm esse usuário em seus computadores)
Foi útil?

Solução

Você precisa executar o programa CACLS no Windows para conceder permissões de arquivos e pastas. De Nant, você pode fazer isso com a tarefa EXEC.

Tente um bloco tag como:

<exec program="cacls">
    <arg value="*" />
    <arg value="/G IIS_WPG:F" />
</exec>

Outras dicas

@ Jeff Fritz Ouch ... Sua sugestão é a solução certa, mas os parâmetros são ... perigosa:.)

Em computadores dev eu estou logado como administrador e eu tentei a sua sugestão com cmd.

  • Ele substitui todas as permissões definidas, a fim de set apenas os definidos no comando (assim, após o comando, acessar arquivos resultou em um "acesso negado" mesmo com o meu usuário admin)
  • É aplicado no diretório C: \ WINDOWS \, enquanto eu chamei o comando da pasta wwwroot. :)

Assim, depois de alguns testes, o comando correto é:

cacls [full folder path] /T /E /G IIS_WPG:F
  • / T: aplica-se especificado pasta e subpastas
  • / E: edições a ACL em vez de substituir -lo:)

Nós acabou escrevendo nossa própria tarefa para isso com algum código bastante simples:

[TaskName("addusertodir")]
public class AddUserToDirectorySecurity : Task
{
    [TaskAttribute("dir", Required=true)]
    public string DirPath { get; set; }

    [TaskAttribute("user", Required=true)]
    public string UserName { get; set; }

    protected override void ExecuteTask()
    {
        FileSystemAccessRule theRule1 = new FileSystemAccessRule(UserName, FileSystemRights.ListDirectory, AccessControlType.Allow);
        FileSystemAccessRule theRule2 = new FileSystemAccessRule(UserName, FileSystemRights.ReadAndExecute, AccessControlType.Allow);
        FileSystemAccessRule theRule3 = new FileSystemAccessRule(UserName, FileSystemRights.Read, AccessControlType.Allow);

        DirectorySecurity theDirSecurity = new DirectorySecurity();
        theDirSecurity.AddAccessRule(theRule1);
        theDirSecurity.AddAccessRule(theRule2);
        theDirSecurity.AddAccessRule(theRule3);
        Directory.SetAccessControl(DirPath, theDirSecurity);
    }
}

Em seguida, você pode escrever um script nant que as cargas de tarefas personalizado e executa:

<loadtasks>
    <fileset>
        <include name="MyTask.dll"/>
    </fileset>
</loadtasks>

<addusertodir dir="MyDir" user="IIS_WPG"/>

Obviamente, isso poderia ser modificado para seus certas regras ou você poderia até mesmo parametrizar isso na tarefa, se assim o desejar. Nós preferimos este sobre o usando a tarefa exec, pois tem-nos um pouco mais de controle sobre as permissões que estavam a ser aplicadas.

CACLS é agora obsoleta. Aqui está uma versão que usa ICACLS, a substituição.

Vamos dizer que nós temos o seguinte:

  • A pasta raiz da nossa instalação é "c: \ inetpub \ wwwroot", e ele é armazenado na variável NANT ${paths.myprogram.inetpub}
  • A pasta que deseja modificar é chamado de "uploads", e ele é armazenado no ${upload.foldername}
  • O usuário que deseja conceder acesso a é "IIS_UPLOAD_USER", armazenada em ${iis.upload.user}
  • O nível de permissão queremos concessão é "M", para "modificar" as permissões, armazenados em ${iis.user.permissionlevel}

Com estes pressupostos, a nossa tarefa é a seguinte:

<exec program="icacls">
    <arg value="${path::combine(paths.myprogram.inetpub, upload.foldername)}" />
    <arg value="/grant" />
    <arg value="${iis.upload.user}:${iis.user.permissionlevel}" />
</exec>

Espero que isso ajude!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top