我在确定让 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>
谢谢!