SSRS: невозможно определить набор разрешений для перечисления файлов в каталоге - PullRequest
0 голосов
/ 17 августа 2011

У меня проблема с выяснением набора разрешений для работы 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: Request for the permission of type 'System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed. 
   at System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet) 
   at System.Security.CodeAccessPermission.Demand() 
   at System.IO.Directory.InternalGetFileDirectoryNames(String path, String userPathOriginal, String searchPattern, Boolean includeFiles, Boolean includeDirs, SearchOption searchOption) 
   at System.IO.Directory.GetFiles(String path, String searchPattern, SearchOption searchOption) 
   at System.IO.Directory.GetFiles(String path, String searchPattern) 
   at MyProject.Reports.Code.ImageTools.GetImagesFullPaths(String searchDirectory, Int32 registerNr) 
The action that failed was: 
Demand 
The type of the first permission that failed was: 
System.Security.Permissions.FileIOPermission 
The Zone of the assembly that failed was: 
MyComputer 

Вот код:

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 для пользовательской сборки. Но очевидно, что это делает администратора неудобным.

Вопрос

Чего мне не хватает, чтобы Directory.GetFiles () работал без использования набора разрешений FullTrust?

Редактировать

Благодаря принятому ответу решение добавляет атрибут 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>

Thx!

1 Ответ

0 голосов
/ 17 августа 2011

Для перечисления файлов требуется FileIOPermissionAccess.PathDiscovery на целевом пути. Вы должны добавить это в свой пользовательский набор разрешений.

Кстати, утверждение разрешения по сути бесполезно, так как утверждение не будет работать, если у вашего кода уже нет разрешения. (Утверждения полезны только в том случае, если вы хотите, чтобы ваш код выполнял то, на что его вызывающий код не имеет разрешений.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...