80070005 Доступ запрещается, когда сайт asp.net с кристальным отчетом развернут на выделенном сервере

У меня есть приложение asp.net, которое отображает отчет, используя хрустальный отчет. Приложение работает правильно на моем локальном ПК. Я развернул это приложение на нашем выделенном сервере, а также установил процессор времени выполнения Crystal Report на выделенном сервере. Я пытаюсь нажать отчет, чтобы увидеть отчет, я получаю вышеуказанную ошибку. Я изменил разрешение папки "C:\Windows\Temp" на полный контроль (выбрав свойство папки "temp", полное разрешение на управление для всех пользователей (IIS-пользователей, network..etc)). Я не уверен, что это правильный способ предоставить полное разрешение на управление этой папкой (я не так хорошо осведомлен о сетевых концепциях). Но я все еще получаю та же ошибка. Ошибка:

Получение COM-класса factory для компонента с CLSID {4DB2E2BB-78E6-4AEA-BEFB-FDAAB610FD1B} не удалось из-за следующих Ошибка: 80070005 Доступ запрещен. (Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED)).

Описание: Необработанное исключение произошло во время выполнения текущий веб-запрос. Просмотрите трассировку стека информацию об ошибке и где она возникла в коде.

Сведения об исключении: System.UnauthorizedAccessException: получение COM-класс factory для компонента с CLSID {4DB2E2BB-78E6-4AEA-BEFB-FDAAB610FD1B} не удалось из-за следующих Ошибка: 80070005 Доступ запрещен. (Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED)).

ASP.NET не имеет права доступа к запрашиваемому ресурсу. Рассматривать предоставление прав доступа ресурсу к запросу ASP.NET идентичность. ASP.NET имеет базовый идентификатор процесса (обычно {MACHINE}\ASPNET для IIS 5 или сетевой службы на IIS 6 и IIS 7 и настроенный идентификатор пула приложений в IIS 7.5), который используется, если приложение не олицетворяет собой. Если приложение выдавать себя за личность, будет анонимный пользователь (обычно IUSR_MACHINENAME) или аутентифицированный запросить пользователя.

Чтобы предоставить ASP.NET доступ к файлу, щелкните правой кнопкой мыши файл в проводнике, выберите "Свойства" и выберите вкладку "Безопасность". Нажмите "Добавить", чтобы добавить соответствующего пользователя или группы. Выделите учетную запись ASP.NET и установите флажки для требуемого доступа.

Ответ 1

У меня такая же проблема на машине клиента Windows Server 2003 с IIS6. Их сервер очень заблокирован по сравнению с обычными серверами, и что-то в этом блокировании, вероятно, является проблемой. Я не сталкивался с этой проблемой на десятках других серверов клиентов. Я еще не решил проблему, но вот некоторые шаги из того, что я узнал до сих пор...

Первое, что нужно сделать, - это дважды проверить, к какому пулу приложений подключено ваше приложение, а затем проверить, какой идентификатор использует пул приложений (например, сетевая служба или идентификатор пула приложений или...). Это важно для обеспечения того, чтобы вы предоставляли права правильному пользователю. Не идите дальше, пока не убедитесь в этом.

Затем проверьте, используете ли вы IIS Impersonation (возможно, вы не знаете, что это такое). Здесь пул приложений сортируется под именем пользователя... это было бы только в случае, если вы используете аутентификацию Windows, а в web.config у вас есть <identity impersonate="true" />. Если вы используете олицетворение, то, вероятно, вы должны предоставить конечным пользователям весь необходимый файл и/или COM-доступ. Если нет (как в моем случае), то просто нужно проверить, права разрешены для пользователя пула приложений или группы пользователей IIS.

Как только вы узнаете правильное удостоверение для разрешений, выполните следующие действия:

  • Если это 64-разрядная проверка машины, у вас есть Enable 32-bit applications для пула приложений (или у вас установлена ​​64-разрядная среда выполнения)
  • Проверка идентификатора пула приложений имеет доступ к папке C:\Windows\Temp (вы упомянули, что сделали это, но я думал, что перечислил его для всех, кто столкнулся с проблемой).
  • Проверить, что идентификатор пула приложений имеет доступ к папке Crystal Reports, например. C:\Program Files\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Common\SAP BusinessObjects Enterprise XI 4.0\. Вы можете найти папку, открыв файл regedit.exe и перейдите к HKEY_CLASSES_ROOT\CLSID\{4DB2E2BB-78E6-4AEA-BEFB-FDAAB610FD1B}\InProcServer32. Получите путь от значения (по умолчанию) для этого раздела реестра и проверьте разрешения для родительской папки для этого пути. Попробуйте дать полный контроль папке с правильным идентификатором, чтобы узнать, устраняет ли это проблему.
  • Я не уверен, что это актуально, но, возможно, добавление <startup useLegacyV2RuntimeActivationPolicy="true"> в web.config может помочь... было предложено в этот пост, относящийся к другому COM-приложению, имеющему схожие проблемы, поэтому стоит пойти? Поэтому вы должны добавить это внутри тега в web.config:

    <startup useLegacyV2RuntimeActivationPolicy="true"> 
         <supportedRuntime version="v4.0"/> 
    </startup>
    
  • Проверьте разрешения COM на сервере:

    • откройте "Службы компонентов" с панели управления > "Администрирование"
    • разверните узел Службы компонентов > Компьютеры > Мой компьютер затем щелкните правой кнопкой мыши > Свойства
    • щелкните вкладку "Безопасность COM"
    • В разрешениях запуска и активации нажмите кнопку "Изменить по умолчанию..."
    • Проверьте перечисленные разрешения на разрешение запуска и активации. Если пользователь вашего пула приложений не указан, попробуйте добавить его со всеми разрешениями разрешить и разрешить 4. Если это не решит проблему, отмените любые изменения.
  • Если ни одна из этих проблем не решила его, я предлагаю загрузить Process Monitor и попытаться определить, что он пытается сделать, что попадает в Access Denied. Это следующий шаг для меня по проблеме, поэтому, если я найду что-нибудь, я обновлю этот ответ.

Ответ 2

Я просто переместил свой веб-сайт в пул приложений по умолчанию, и он работал. Я настроил 32-разрядные приложения на включенные и отступы для NetworkService.