0

SQL Serverレポートサービスで使用されるアセンブリでDirectory.GetFiles()を機能させるためのアクセス許可セットを理解するのに問題があります。

バックグラウンド

基本的に、私はこのアセンブリを使用して2つのことを実行します。

  • ファイル共有から画像を読み取る
  • その共有上のフォルダー内のすべての画像を列挙します。

特徴1:画像を読む(正常に動作します)

画像の読み取りは、カスタム権限セットを使用して機能します。

<PermissionSet class="NamedPermissionSet"
   version="1"
   Name="MyCustomImagePermissionSet"
    <IPermission class="FileIOPermission"
       version="1"
       Read="\\MyServer\MyFolder"/>
    <IPermission class="SecurityPermission"
       version="1"
       Flags="Assertion, Execution"/>
</PermissionSet>

カスタムコードグループでこの権限セットを参照します。

<CodeGroup class="UnionCodeGroup"
   version="1"
   PermissionSetName="MyCustomImagePermissionSet"
   Name="MyImageCodeGroup"
      <IMembershipCondition class="UrlMembershipCondition"
         version="1"
         Url="C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\PrivateAssemblies\MyProject\MyProject.Reports.Code.dll"
       />
</CodeGroup>

(RSPreviewPolicy.configから取得したスニペット)

私のコードでは、FileStreamを開く前にアサーションを使用しています。

private Image LoadOriginalImageByPath(string path)
{
    new FileIOPermission(FileIOPermissionAccess.Read, path).Assert();

    Image originalImage;

    using (var imageStream = new FileStream(path, FileMode.Open, FileAccess.Read))
    {
        originalImage = Image.FromStream(imageStream);
    }
    return originalImage;
}

機能2:ディレクトリ内のファイルの列挙(機能しません)

ファイルサーバーのサブディレクトリ内のすべてのファイルを列挙すると、常にSecurityExceptionが発生します。

System.Security.SecurityException:タイプ'System.Security.Permissions.FileIOPermission、mscorlib、Version = 2.0.0.0、Culture = neutral、PublicKeyToken=b77a5c561934e089'のアクセス許可の要求が失敗しました。
   System.Security.CodeAccessSecurityEngine.Check(オブジェクトデマンド、StackCrawlMark&stackMark、ブールisPermSet)で
   System.Security.CodeAccessPermission.Demand()で
   System.IO.Directory.InternalGetFileDirectoryNames(String path、String userPathOriginal、String searchPattern、Boolean includeFiles、Boolean includeDirs、SearchOption searchOption)で
   System.IO.Directory.GetFiles(文字列パス、文字列searchPattern、SearchOption searchOption)で
   System.IO.Directory.GetFiles(String path、String searchPattern)で
   MyProject.Reports.Code.ImageTools.GetImagesFullPaths(String searchDirectory、Int32 registerNr)で
失敗したアクションは次のとおりです。
要求する
失敗した最初の権限のタイプは次のとおりです。
System.Security.Permissions.FileIOPermission
失敗したアセンブリのゾーンは次のとおりです。
ぼくのコンピュータ

コードは次のとおりです。

public static IEnumerable<string> GetImagesFullPaths(string searchDirectory, int registerNr)
{
    var pattern = string.Format("M{0:00000}?.jpg", registerNr);

    new FileIOPermission(FileIOPermissionAccess.PathDiscovery | FileIOPermissionAccess.Read, searchDirectory).Assert();
    return Directory.GetFiles(searchDirectory, pattern);
}

回避策:FullTrustを使用する

この問題を回避する唯一の方法は、カスタムアセンブリにFullTrustを使用することです。しかし、明らかに、それは管理者を不安にさせます。

質問

FullTrust権限セットを使用せずにDirectory.GetFiles()を機能させるには、何が欠けていますか?

編集

受け入れられた回答のおかげで、解決策はPathDiscovery属性をpermission要素に追加することです。

<PermissionSet class="NamedPermissionSet"
   version="1"
   Name="MyCustomImagePermissionSet"
    <IPermission class="FileIOPermission"
       version="1"
       Read="\\MyServer\MyFolder"/>
       PathDiscovery="\\MyServer\MyFolder"/>
    <IPermission class="SecurityPermission"
       version="1"
       Flags="Assertion, Execution"/>
</PermissionSet>

どうも!

4

1 に答える 1

0

ファイルを列挙するには、ターゲットパスにFileIOPermissionAccess.PathDiscoveryが必要です。これをカスタム権限セットに追加する必要があります。

ところで、パーミッションをアサートすることは、コードがすでにパーミッションを持っていない限りアサートが機能しないため、本質的に役に立たない。(アサーションは、呼び出し元のコードに実行権限がないことをコードで実行する場合にのみ役立ちます。)

于 2011-08-17T14:47:42.723 に答える