Le fournisseur setAcl de Web Deploy peut-il être utilisé sur un sous-répertoire?

j'essaie de rendre un sous-répertoire dans un ms Deploy package accessible en écriture à l'utilisateur de l'application pool. Grâce à un utile post sur le setAcl fournisseur par Kevin Leetham j'ai été en mesure d'obtenir la plupart de ce que j'ai besoin dans mon dossier de projet:

<MsDeploySourceManifest Include="setAcl"
                        Condition="$(IncludeSetAclProviderOnDestination)">
  <Path>$(_MSDeployDirPath_FullPath)docpublic</Path>
  <setAclAccess>Read,Write,Modify</setAclAccess>
  <setAclResourceType>Directory</setAclResourceType>
  <AdditionalProviderSettings>setAclResourceType;setAclAccess</AdditionalProviderSettings>
</MsDeploySourceManifest>

notez que j'ai ajouté "docpublic " au répertoire de déploiement root. Dans le manifeste résultant que VS2010 construit, je vois l'élément setAcl suivant:

<sitemanifest>
  <contentPath path="C:Source...objDebugPackagePackageTmp" />
  <setAcl path="C:Source...objDebugPackagePackageTmp"
          setAclResourceType="Directory" />
  <setAcl path="C:Source...objDebugPackagePackageTmp"
          setAclUser="anonymousAuthenticationUser"
          setAclResourceType="Directory" />
  <setAcl path="C:Source...objDebugPackagePackageTmpdocpublic"
          setAclResourceType="Directory"
          setAclAccess="Read,Write,Modify" />
</sitemanifest>

cette dernière ligne semble bonne: elle est en annexe le sous-répertoire que je veux pouvoir écrire, et les modificateurs d'accès semblent tous avoir assez bien transféré.

Cependant, lorsque j'déployer le paquet j'ai un message d'erreur:

erreur: une valeur pour le paramètre 'setAclUser' doit être spécifiée lorsque le le fournisseur 'setAcl' est utilisé avec un chemin physique.

c'est une erreur déroutante parce que je n'essaie pas de mettre un ACL sur un chemin physique, exactement, mais un sous-répertoire d'une application web. En regardant la sortie de MS Deploy, il est facile de voir le problème:

Info: Adding setAcl (REST Services.0.334).
Info: Adding setAcl (REST Services.0.334).
Info: Adding setAcl (C:...objReleasePackagePackageTmpdocpublic).

MS Deploy remplace apparemment le nom de l'application web par celui de mon chemin absolu " C:...objReleasePackagePackageTmp", mais lorsque j'ajoute" docpublic " à ce chemin absolu, il ne le reconnaît plus comme un répertoire d'application web. Ce problème précis est décrit par une autre victime sur le ASP.NET forums sans aucune résolution.

est ce que quelqu'un sait comment mettre un ACL sur un sous-répertoire particulier d'une application web via Web Deploy sans identifier manuellement le chemin physique et l'utilisateur du pool d'applications sur l'hôte cible?

18
demandé sur ladenedge 2011-07-28 19:59:05

2 réponses

OK permettez-moi d'abord de dire que c'est beaucoup plus difficile que ce devrait être!

je pense que la raison pour laquelle il échoue est parce que lorsque vous publiez il ne peut pas reconnaître le dossier comme étant un dossier dans l'Application IIS. La raison en est que le chemin complet est transféré vers la destination lorsque le fournisseur SetAcl est invoqué. Au lieu de cela, nous avons besoin d'un chemin relatif à l'Application IIS. Par exemple dans votre cas, il doit être quelque chose comme : "REST SERVICES / 1.0.334/doc / public". La seule façon de le faire est de créer un paramètre MSDeploy qui est rempli avec la valeur correcte au moment de la publication. Vous devrez le faire en plus de créer votre propre entrée SetAcl dans le Manifeste source. Suivez les étapes ci-dessous.

  1. Dans le même répertoire que votre projet, créez un fichier avec le nom {ProjectName}.wpp.cibles (où {ProjectName} est le nom de votre projet d'application Web)
  2. dans le fichier coller le contenu de MSBuild qui est en dessous de cette liste
  3. recharger le projet dans Visual Studio (VS cache les fichiers du projet en mémoire donc ce cache doit être effacé).

{ProjectName}.wpp.cibles

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <Target Name="SetupCustomAcls" AfterTargets="AddIisSettingAndFileContentsToSourceManifest">   
    <!-- This must be declared inside of a target because the property 
    $(_MSDeployDirPath_FullPath) will not be defined at that time. -->
    <ItemGroup>
      <MsDeploySourceManifest Include="setAcl">
        <Path>$(_MSDeployDirPath_FullPath)\doc\public</Path>
        <setAclAccess>Read,Write,Modify</setAclAccess>
        <setAclResourceType>Directory</setAclResourceType>
        <AdditionalProviderSettings>setAclResourceType;setAclAccess</AdditionalProviderSettings>
      </MsDeploySourceManifest>
    </ItemGroup>
  </Target>

  <Target Name="DeclareCustomParameters" AfterTargets="AddIisAndContentDeclareParametersItems">
    <!-- This must be declared inside of a target because the property 
    $(_EscapeRegEx_MSDeployDirPath) will not be defined at that time. -->
    <ItemGroup>
      <MsDeployDeclareParameters Include="DocPublicSetAclParam">
        <Kind>ProviderPath</Kind>
        <Scope>setAcl</Scope>
        <Match>^$(_EscapeRegEx_MSDeployDirPath)\doc\public$</Match>
        <Value>$(_DestinationContentPath)/doc/public</Value>
        <ExcludeFromSetParameter>True</ExcludeFromSetParameter>
      </MsDeployDeclareParameters>
    </ItemGroup>
  </Target>

</Project>

pour expliquer cela un peu, la cible SetupCustomAcls va faire qu'une nouvelle entrée SetAcl sera placée à l'intérieur du Manifeste source utilisé lors de la publication. Cette cible est exécutée après la AddIisSettingAndFileContentsToSourcemanifest la cible s'exécute, via l'attribut AfterTargets. Nous faisons cela pour s'assurer que la valeur de l'élément est créé, au bon moment, et parce que nous devons nous assurer que la propriété _MSDeployDirPath_FullPath est rempli.

le paramètre DeclareCustomParameters est l'endroit où le paramètre custom MSDeploy sera créé. Cette cible s'exécutera après le AddIisAndContentDeclareParametersitems cible. Nous n' cela pour s'assurer que la propriété _EscapeRegEx_MSDeployDirPath est rempli. Notez à l'intérieur de cette cible quand je déclare la valeur du paramètre (à l'intérieur de L'élément Value) que j'utilise la propriété _DestinationContentPath qui est la propriété MSBuild contenant le chemin vers l'endroit où votre application est déployée, i.e. REST Services / 1.0.334.

Pouvez-vous essayer cela et laissez-moi savoir si cela fonctionne pour vous ou pas?

19
répondu Sayed Ibrahim Hashimi 2011-07-29 05:42:11

FYI - cela fonctionne pour un site Web racine si vous suivez la convention spécifiée dans le post ici: http://forums.iis.net/p/1176955/1977169.aspx#1977169

<Match>^$(_EscapeRegEx_MSDeployDirPath)\@(CustomDirAcl)$</Match>
<DefaultValue>{$(_MsDeployParameterNameForContentPath)}/@(CustomDirAcl)</DefaultValue>
<Value>$(_DestinationContentPath)/@(CustomDirAcl)</Value>

ce post a aussi l'avantage de pouvoir spécifier un bloc de sous-répertoires dans un seul groupe D'item.

3
répondu Ethan J. Brown 2012-02-02 22:45:44