Nant: permissão de arquivo mudança
-
04-07-2019 - |
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)
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!