Автоматизация Word с помощью ASP.NET

У меня есть старое приложение, которое использует автоматизацию Microsoft Word в asp.net, и мне нужно установить его на Windows Server 2012 R2 x64 с Office 2013 Standard x86. Я знаю, что следует избегать автоматизации Office в серверных технологиях, таких как IIS, но на данный момент у меня нет зеленого света на переписывание приложения, поэтому я должен принять его как есть.

Изначально я запустил приложение, и оно выдало такую ​​ошибку:

Получение фабрики классов COM для компонента с CLSID {000209FF-0000-0000-C000-000000000046} не удалось из-за следующей ошибки: 80070005 Доступ запрещен. (Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED)).

Я нашел в Интернете информацию о том, что {000209FF-0000-0000-C000-000000000046} - это идентификатор общего Word, а не конкретной версии.

Я пошел в Службы компонентов -> Мой компьютер -> Конфигурация DCOM -> Документ Microsoft Word 97 - 2003 (обратите внимание, что для Microsoft Word, MS Word или Word нет узла, а для Microsoft Excel есть узел) и изменил безопасность, чтобы разрешить пользователь IIS AppPool «Локальный запуск», «Локальная активация» и «Локальный доступ». Это приводит к тому, что приложению требуется некоторое время, чтобы ответить (более минуты), и выдает ошибку со следующей ошибкой:

Получение фабрики классов COM для компонента с CLSID {000209FF-0000-0000-C000-000000000046} не удалось из-за следующей ошибки: 80080005 Ошибка выполнения сервера (исключение из HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)).

В то же время системный журнал программы просмотра событий показывает:

Сервер {000209FF-0000-0000-C000-000000000046} не зарегистрировался в DCOM в течение требуемого тайм-аута.

Я поискал в Интернете и нашел информацию о том, что права доступа могут быть неправильными, включая пути к системным дискам и реестр. Я запустил Process Monitor и проверил, что процесс пытается открыть. Я предоставил пользователю IIS AppPool полный доступ к следующему:

  • C: \ Windows \ SysWOW64 \ config \ systemprofile
  • C: \ Windows \ Temp
  • HKU.DEFAULT \ Программное обеспечение \ Microsoft \ Office
  • HKLM \ Программное обеспечение \ Wow6432Node \ Microsoft \ Office
  • HKLM \ Software \ Wow6432Node \ Microsoft \ Shared Tools

Когда я снова запустил приложение, оно показало только несколько проблем с доступом в Process Monitor, которые, похоже, были просто попытками чтения различных конфигураций. Само приложение больше никаких ошибок не показывало, просто зависало. У меня не установлена ​​Visual Studio на этом компьютере, но я не вижу ошибок в журналах приложений, поэтому никаких исключений не возникало.

Я попытался также установить определенного пользователя (локального администратора) в удостоверении DCOM, но изменений не было.

Теперь я восстановил все разрешения и вернулся к ошибке 0x80080005, потому что она, по крайней мере, дает мне некоторую информацию, с которой я могу попытаться.

Мне удалось воспроизвести ошибку в простом приложении с таким кодом:

try
{
    l1.Text = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
    var application = new Microsoft.Office.Interop.Word.Application();
    l2.Text = "OK";
}
catch (Exception ex)
{
    this.Label2.Text = ex.ToString().Replace("\r\n", "<br/>");
}

Он также не работает в Windows 8 x64 с Office 2013 Pro x64 с точно такой же ошибкой.

Если я выдаю себя за администратора, то это сработает. Однако даже при добавлении IIS APPPOOL \ DefaultAppPool в группу администраторов это все равно не удается.

Есть идеи по поводу следующих шагов?


person Vladimir    schedule 13.08.2014    source источник
comment
начните с предоставления apppool полного доступа ко всему. если это сработает, вы, по крайней мере, знаете, что находитесь в правильном направлении и вам нужно выяснить, для каких конкретных вещей требуются разрешения   -  person Robert Levy    schedule 13.08.2014
comment
также см. stackoverflow.com/questions/3863012/   -  person Robert Levy    schedule 13.08.2014
comment
Я попытался предоставить полный доступ ко всем компонентам COM по умолчанию для всех (в разделе «Мой компьютер»), но он по-прежнему не работает. Другой вопрос, на который вы указали, использует другую версию Word - у меня вообще нет этих ключей и DCOM.   -  person Vladimir    schedule 13.08.2014
comment
когда у меня была эта проблема, я добился успеха, добавив IIS_IUSRS и IUSR к разрешенным пользователям, попробуйте, если это сработает для вас   -  person Dimitri    schedule 13.08.2014
comment
@ Роберт Леви: Я попытался сделать администратора пользователя IIS APPPOOL \ DefaultAppPool - ›все равно безуспешно   -  person Vladimir    schedule 13.08.2014
comment
@Dima: ты имеешь в виду добавить их в DCOM? Если да, я пробовал, все равно не повезло   -  person Vladimir    schedule 13.08.2014
comment
На вашем месте я бы категорически отказался от использования Interop API на сервере. Это рецепт катастрофы. Дайте понять, что использование библиотек взаимодействия будет дороже, чем частичное переписывание приложения для использования приличной библиотеки, которая не полагается на COM.   -  person mason    schedule 13.08.2014
comment
Я знаю, что это правильно. К сожалению, в настоящее время это не вариант   -  person Vladimir    schedule 13.08.2014
comment
Возможный дубликат Word Automation из IIS   -  person Lex Li    schedule 05.12.2018


Ответы (2)


Вот что сработало в конце:

  • Создайте пользователя с правами администратора и настройте Word для работы с ним в настройках DCOM.
  • В настройках дайте права на активацию, запуск и доступ пользователю AppPool, а также IIS_IURS и IUSR. Обратите внимание, что если вы не дадите права другим пользователям, только пользователю AppPool, Windows все равно сообщит, что пользователь AppPool не имеет достаточных прав, что полностью вводит в заблуждение.

Я также выяснил, в чем была проблема с зависшим Word: создание нового файла заставляло Word открываться в специальном режиме, где сообщалось, что файл может быть опасным. Конечно, используя COM, вы не видите проблемы, но тогда он не сможет продолжить, пока вы не разрешите это. Это новое поведение в Word 2013, и поэтому у меня его раньше не было.

person Vladimir    schedule 14.08.2014
comment
Для автоматизации Word в Windows 8/2012 и более поздних версиях требуется 64-разрядная версия Office. Затем, после всех сложных настроек DCOM / IIS, вы должны быть готовы к тому, что Word будет ждать ответа в диалоговом окне. Я предлагаю, чтобы в случае неудачи вы перечислили окна процесса winword и сбросили заголовки. Это может дать вам представление о том, что пошло не так. Возможно, вам также придется убить фиктивный экземпляр. - person Olivier MATROT; 19.11.2014

У меня была точно такая же ошибка с устаревшим кодом при использовании Office Interop на Windows Server 2016 с Office 2013, и это меня бесило. Итак, сначала я хочу присоединиться к тем, кто уже упоминал, что лучше всего не использовать его и переписать свой код в DocX или аналогичный, если у вас есть шанс. Просто в нем слишком много ловушек, которые съедают время.

Я следил за всеми подсказками поста Владимира, но все равно получил ошибку. В конце концов, это были шаблоны файлов doc проекта, которые Office не удалось открыть в режиме взаимодействия (но которые открылись без каких-либо проблем в сеансе RD на сервере). Они были созданы в более старой версии Office. Я однажды открыл / сохранил шаблоны в Word, и все заработало.

person needfulthing    schedule 16.04.2021