0

我在确定让 Directory.GetFiles() 在 SQL Server 报告服务使用的程序集中工作的权限集时遇到问题。

背景

基本上,我使用这个程序集来执行两件事:

  • 从文件共享中读取图像
  • 枚举该共享文件夹中的所有图像。

功能 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,版本=2.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089”类型的权限失败。
   在 System.Security.CodeAccessSecurityEngine.Check(对象需求,StackCrawlMark& stackMark,布尔 isPermSet)
   在 System.Security.CodeAccessPermission.Demand()
   在 System.IO.Directory.InternalGetFileDirectoryNames(字符串路径,字符串 userPathOriginal,字符串 searchPattern,布尔 includeFiles,布尔 includeDirs,SearchOption searchOption)
   在 System.IO.Directory.GetFiles(字符串路径,字符串 searchPattern,SearchOption 搜索选项)
   在 System.IO.Directory.GetFiles(字符串路径,字符串 searchPattern)
   在 MyProject.Reports.Code.ImageTools.GetImagesFullPaths(字符串 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 属性添加到权限元素导致

<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 回答