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)
È stato utile?

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!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top