Question

J'ai une application ASP.NET. Fondamentalement, le processus de livraison est celui-ci:

  • Nant construit l'application et crée un fichier zip sur l'ordinateur du développeur avec les fichiers de l'application sans dossiers SVN et fichiers inutiles. Ce fichier est livré avec un script Nant.
  • Les fichiers zip et nant sont copiés sur l'ordinateur du client
  • le script Nant remplace les fichiers du site Web actuel par le fichier contenu dans le fichier zip.

Mon problème, c’est que, avec ce processus, j’ai une erreur d’accès non autorisé lorsque je tente d’ouvrir le site Web. Il semble que les fichiers doivent avoir une autorisation définie pour l'utilisateur " IIS_WPG ".

Je n'ai pas le pouvoir de modifier la configuration IIS, je dois donc modifier manuellement les autorisations de chaque fichier. Et chaque fois que je remplace les fichiers, les autorisations sont supprimées et je dois les redéfinir.

J'ai donc deux questions:

  • Puis-je modifier les autorisations de fichiers avec Nant? Comment le faire?
  • Est-il possible d'éviter ce problème? (les développeurs n'ont pas cet utilisateur sur leurs ordinateurs)
Était-ce utile?

La solution

Vous devez exécuter le programme CACLS sous Windows pour accorder des autorisations sur des fichiers et des dossiers. Depuis Nant, vous pouvez le faire avec la tâche EXEC.

Essayez un bloc de balises tel que:

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

Autres conseils

@Jeff Fritz Aie... Votre suggestion est la bonne solution mais les paramètres sont ... dangereux:).

Sur les ordinateurs de développement, je suis connecté en tant qu'administrateur et j'ai essayé votre suggestion avec cmd.

  • Il remplace toutes les autorisations définies afin de ne définir que celles définies dans la commande (ainsi, après la commande, l'accès aux fichiers entraînait un "Accès refusé", même avec mon utilisateur administrateur)
  • Cela s’appliquait dans le répertoire C: \ WINDOWS \, alors que j’appelais la commande à partir du dossier wwwroot. :)

Ainsi, après quelques tests, la bonne commande est la suivante:

cacls [full folder path] /T /E /G IIS_WPG:F
  • / T: s'applique au dossier et aux sous-dossiers spécifiés
  • / E: modifie la liste de contrôle d'accès au lieu de la remplacer :)

Nous avons fini par écrire notre propre tâche pour cela avec un code assez simple:

[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);
    }
}

Ensuite, vous pouvez écrire un script nant qui charge la tâche personnalisée et exécute:

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

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

Évidemment, cela pourrait être modifié pour certaines règles ou même paramétré dans la tâche si vous le souhaitez. Nous avons préféré cela plutôt que d’utiliser la tâche d’exécution, car elle nous permettait de mieux contrôler les autorisations qui étaient appliquées.

CACLS est maintenant obsolète. Voici une version qui utilise ICACLS, le remplacement.

Disons que nous avons les éléments suivants:

  • Le dossier racine de notre installation est "c: \ inetpub \ wwwroot", et il est stocké dans la variable NANT $ {paths.myprogram.inetpub}
  • Le dossier que vous souhaitez modifier s'appelle "upload", et il est stocké dans $ {upload.foldername}
  • L'utilisateur auquel vous souhaitez accorder l'accès est "IIS_UPLOAD_USER", stocké dans $ {iis.upload.user}
  • Le niveau de permission que nous souhaitons accorder est "M" pour "modifier". autorisations, stockées dans $ {iis.user.permissionlevel}

Avec ces hypothèses, notre tâche est la suivante:

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

J'espère que ça aide!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top