19

MS Deployパッケージのサブディレクトリを、アプリケーションプールユーザーが書き込み可能にしようとしています。Kevin LeethamによるsetAclプロバイダーに関する有益な投稿のおかげで、必要なもののほとんどをプロジェクトファイルに取り込むことができました。

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

ルートデプロイメントディレクトリに「\doc\public」を追加したことに注意してください。VS2010が構築する結果のマニフェストには、次のsetAcl要素が表示されます。

<sitemanifest>
  <contentPath path="C:\Source\...\obj\Debug\Package\PackageTmp" />
  <setAcl path="C:\Source\...\obj\Debug\Package\PackageTmp"
          setAclResourceType="Directory" />
  <setAcl path="C:\Source\...\obj\Debug\Package\PackageTmp"
          setAclUser="anonymousAuthenticationUser"
          setAclResourceType="Directory" />
  <setAcl path="C:\Source\...\obj\Debug\Package\PackageTmp\doc\public"
          setAclResourceType="Directory"
          setAclAccess="Read,Write,Modify" />
</sitemanifest>

その最後の行は良さそうです。書き込み可能にしたいサブディレクトリが追加されており、アクセス修飾子はすべて十分に転送されているようです。

ただし、このパッケージを展開すると、次のエラーが発生します。

エラー:「setAcl」プロバイダーを物理パスで使用する場合は、「setAclUser」設定の値を指定する必要があります。

物理パスにACLを設定しようとしているのではなく、Webアプリケーションのサブディレクトリに設定しようとしているため、これは紛らわしいエラーです。MS Deployの出力を見ると、問題を簡単に確認できます。

Info: Adding setAcl (REST Services\1.0.334).
Info: Adding setAcl (REST Services\1.0.334).
Info: Adding setAcl (C:\...\obj\Release\Package\PackageTmp\doc\public).

MS Deployは、絶対パス「C:... \ obj \ Release \ Package \ PackageTmp」をWebアプリケーション名に置き換えているようですが、その絶対パスに「\ doc \ public」を追加すると、絶対パスとして認識されなくなります。 Webアプリケーションディレクトリ。この正確な問題は、ASP.NETフォーラムで解決策なしに別の被害者によって説明されています。

ターゲットホスト上の物理パスとアプリケーションプールユーザーを手動で識別せずに、Web配置を介してWebアプリケーションの特定のサブディレクトリにACLを設定する方法を知っている人はいますか?

4

2 に答える 2

19

OK、最初に、これは本来よりもはるかに難しいと言わせてください!

失敗する理由は、公開しているときに、そのフォルダーがIISアプリケーションのフォルダーであると認識できないためだと思います。これが発生する理由は、SetAclプロバイダーが呼び出されたときにフルパスが宛先に転送されているためです。その代わりに、IISアプリケーションに相対的なパスが必要です。たとえば、あなたの場合、「RESTSERVICES / 1.0.334 / doc/public」のようになります。これを行う唯一の方法は、公開時に正しい値が入力されるMSDeployパラメーターを作成することです。ソースマニフェストに独自のSetAclエントリを作成することに加えて、これを行う必要があります。以下の手順に従ってください。

  1. プロジェクトと同じディレクトリに、{ProjectName} .wpp.targetsという名前のファイルを作成します({ProjectName}はWebアプリケーションプロジェクトの名前です)。
  2. ファイル内に、このリストの下にあるMSBuildコンテンツを貼り付けます
  3. Visual Studioでプロジェクトをリロードします(VSはプロジェクトファイルをメモリにキャッシュするため、このキャッシュをクリアする必要があります)。

{ProjectName} .wpp.targets

<?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>

これを少し説明すると、ターゲットのSetupCustomAclsにより、公開中に使用されるソースマニフェスト内に新しいSetAclエントリが配置されます。このターゲットは、AddIisSettingAndFileContentsToSourceManifestターゲットの実行後に、AfterTargets属性を介して実行されます。これは、アイテムの値が適切なタイミングで作成されるようにするため、およびプロパティ_MSDeployDirPath_FullPathが設定されていることを確認する必要があるためです。

DeclareCustomParametersは、カスタムMSDeployパラメーターが作成される場所です。そのターゲットは、AddIisAndContentDeclareParametersItemsターゲットの後に実行されます。これは、プロパティ_EscapeRegEx_MSDeployDirPathにデータが入力されていることを確認するために行います。そのターゲット内で(Value要素内の)パラメーターの値を宣言するときに、アプリがデプロイされている場所へのパスを含むMSBuildプロパティであるプロパティ_DestinationContentPath 、つまりREST Services/1.0.334を使用していることに注意してください。

それを試してみて、うまくいったかどうか教えていただけますか?

于 2011-07-29T05:42:11.713 に答える
3

参考までに-これは、次の投稿で指定されている規則に従う場合、ルートWebサイトで機能します:http: //forums.iis.net/p/1176955/1977169.aspx#1977169

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

この投稿には、単一のItemGroupでサブディレクトリのブロックを指定できるという利点もあります。

于 2012-02-02T22:45:44.943 に答える