【问题标题】:SSRS: Cannot figure out permission set for enumerating files in directorySSRS:无法确定枚举目录中文件的权限集
【发布时间】:2011-08-17 13:31:08
【问题描述】:

我无法确定让 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,Version=2.0.0.0,Culture=neutral,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>

谢谢!

【问题讨论】:

    标签: reporting-services cas securityexception


    【解决方案1】:

    枚举文件需要在目标路径上使用 FileIOPermissionAccess.PathDiscovery。您需要将此添加到您的自定义权限集中。

    顺便说一句,断言权限本质上是无用的,因为除非您的代码已经拥有权限,否则断言将不起作用。 (断言仅在您希望代码执行其调用代码无权执行的操作时才有用。)

    【讨论】:

    • 感谢您的回答!由于您的提示,我发现我必须将 PathDiscovery 属性添加到 IPermission 标记。我将相应地编辑问题。关于您对代码中断言的评论,我尝试取消注释对 Assert() 的调用,并再次收到 SecurityException。
    • 如果断言确实有用,那么您的代码可能被缺少权限的代码调用。
    • 嗯,是的,代码是从 SSRS 的渲染引擎调用的。 AFAIK,默认情况下,此类代码只有执行权限,但没有更多权限。
    猜你喜欢
    • 2012-05-03
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    • 2021-08-22
    • 2011-07-01
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多