Package.Open Запрашиваемый доступ к реестру не разрешен
Мы вызываем System.IO.Packaging.Package.Open() в приложении ASP.NET. Кроме того, олицетворение Windows было выполнено перед вызовом этого, потому что открываемый пакет хранится в безопасном месте, и олицетворение требуется для его чтения.
Проблема заключается в том, что Package.Open () вызывает EventTrace.EasyTraceEvent(), которая, в свою очередь, вызывает MS.Utility.EventTrace.IsClassicETWRegistryEnabled(), которая вызывает исключение безопасности Запрашиваемого доступа к реестру, не допускается.
Это происходит, даже если он специально отключен в Web.config . Как в режиме отладки, так и в режиме выпуска.
Таким образом, моя дилемма. Олицетворение требуется, поскольку файл (пакет) хранится таким образом, что он доступен только для олицетворенной учетной записи. Копирование его в небезопасное место нанесло бы ущерб безопасности.
Предоставление олицетворенной учетной записи доступа к реестру открывает дыру в безопасности в другом направлении. Эта учетная запись не имеет и не нуждается ни в каком другом доступе к каким-либо другим системным ресурсам, кроме определенного набора файлов и папок.
Что я действительно хочу, так это чтобы EventTrace совершил прыжок с обрыва, но я не знаю, как это сказать.
Есть идеи?
3 ответа
Краткий ответ: используйте поток. Выполните олицетворение, чтобы открыть поток, завершить олицетворение и затем передать еще открытый поток в Package.Open().
Длинный ответ:
Источником ошибки является инициализатор статического класса для EventTrace. Он вызывает IsClassicETWRegistryEnabled(), который, в свою очередь, обращается к реестру. Поскольку он находится в инициализаторе класса, это означает, что его невозможно отключить и что EventTrace принципиально сломан, когда дело доходит до олицетворения.
Package.Open () действительно является оберткой вокруг "new ZipPackage ()".
ZipPackage - это закрытая реализация абстрактного класса Package.
ZipPackage не имеет публичных конструкторов.
ZipPackage, в свою очередь, использует внутренние методы в ZipArchive, который находится в пространстве имен MS.Internal.IO.Zip и также является закрытым классом.
Выводы:
System.IO.Packaging имеет проблемы с олицетворением, когда это олицетворение не имеет достаточного доступа к реестру.
System.IO.Packaging следует рассматривать как частное пространство имен Microsoft, а не как общедоступное.
Опции:
Переместите файл из безопасной области, чтобы олицетворение не было необходимости.
Загружайте файл, когда олицетворение не требуется, и сохраняйте данные другим способом (например, в БД)).
Откройте поток под олицетворением, завершите олицетворение и затем используйте Package.Open () в потоке.
Если кому-то интересно, то пакеты, которые мы читаем, являются файлами Visio 2013 VSDX.
Я просмотрел ссылку на источник.NET, и ключ, к которому ему нужен доступ, - это HKEY_CURRENT_USER\Software\Microsoft\Avalon.Graphics. Предоставление доступа "Все" для чтения к этому конкретному ключу не имеет никаких последствий для безопасности, о которых я могу думать, и решает проблему.
В следующий раз, когда я приду сюда, чтобы решить эту проблему, я просто хочу напомнить себе, что:
Добавьте учетную запись пула приложений в качестве локального администратора. Эффект заключается в том, что у него есть разрешение на чтение реестра для всех пользователей, которые олицетворяются.
Если это не вариант, вам нужно RevertToSelf перед выполнением вызова. В результате он перестает олицетворять себя, поэтому теперь ему нужно только разрешение на чтение реестра текущего пользователя, которым является он сам.