Nant: modifica autorizzazione file
-
04-07-2019 - |
Domanda
Ho un'applicazione ASP.NET. Fondamentalmente il processo di consegna è questo:
- Nant crea l'applicazione e crea un file zip sul computer dello sviluppatore con i file dell'applicazione senza cartelle SVN e file inutili. Questo file viene consegnato con uno script Nant.
- I file zip e nant vengono copiati sul computer del client
- lo script Nant sostituisce i file del sito Web corrente con il file contenuto nel file zip.
Il mio problema è che con questo processo ho un errore di accesso non autorizzato quando provo ad aprire il sito web. Sembra che i file debbano avere un'autorizzazione impostata per l'utente " IIS_WPG " ;.
Non ho il potere di cambiare la configurazione di IIS, quindi devo cambiare manualmente le autorizzazioni di ciascun file. E ogni volta che sostituisco i file le autorizzazioni vengono rimosse e devo reimpostarle.
Quindi ho due domande:
- Posso modificare le autorizzazioni dei file con Nant? Come farlo?
- È possibile evitare questo problema? (gli sviluppatori non hanno questo utente sul proprio computer)
Soluzione
È necessario eseguire il programma CACLS in Windows per concedere le autorizzazioni a file e cartelle. Da Nant, puoi farlo con l'attività EXEC.
Prova un blocco tag come:
<exec program="cacls">
<arg value="*" />
<arg value="/G IIS_WPG:F" />
</exec>
Altri suggerimenti
@Jeff Fritz Ahia... Il tuo suggerimento è la soluzione giusta ma i parametri sono ... pericolosi :).
Sui computer dev sono registrato come amministratore e ho provato il tuo suggerimento con cmd.
- Sostituisce tutte le autorizzazioni impostate per impostare solo quelle definite nel comando (quindi, dopo il comando, l'accesso ai file ha comportato un "Accesso negato" anche con il mio utente amministratore)
- Si applicava alla directory C: \ WINDOWS \, mentre ho chiamato il comando dalla cartella wwwroot. :)
Quindi, dopo alcuni test, il comando giusto è:
cacls [full folder path] /T /E /G IIS_WPG:F
- / T: si applica alla cartella e alle sottocartelle specificate
- / E: modifica l'ACL anziché sostituendo esso :)
Abbiamo finito per scrivere il nostro compito per questo con un codice abbastanza semplice:
[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);
}
}
Quindi puoi scrivere uno script nant che carica l'attività personalizzata ed esegue:
<loadtasks>
<fileset>
<include name="MyTask.dll"/>
</fileset>
</loadtasks>
<addusertodir dir="MyDir" user="IIS_WPG"/>
Ovviamente, questo potrebbe essere modificato per alcune tue regole o potresti anche parametrizzarlo nell'attività se lo desideri. Abbiamo preferito questo rispetto all'uso dell'attività exec poiché ci ha un po 'più di controllo sulle autorizzazioni che venivano applicate.
CACLS è ora obsoleto. Ecco una versione che utilizza ICACLS, la sostituzione.
Diciamo che abbiamo il seguente:
- La cartella principale della nostra installazione è " c: \ inetpub \ wwwroot " ;, ed è memorizzata nella variabile NANT
${paths.myprogram.inetpub}
- La cartella che vogliamo modificare si chiama " uploads " ;, ed è memorizzata in
${upload.foldername}
- L'utente a cui vogliamo concedere l'accesso è " IIS_UPLOAD_USER " ;, memorizzato in
${iis.upload.user}
- Il livello di autorizzazione che vogliamo concedere è " M " ;, per " modifica " permessi, memorizzati in
${iis.user.permissionlevel}
Con questi presupposti, il nostro compito è questo:
<exec program="icacls">
<arg value="${path::combine(paths.myprogram.inetpub, upload.foldername)}" />
<arg value="/grant" />
<arg value="${iis.upload.user}:${iis.user.permissionlevel}" />
</exec>
Spero che questo aiuti!