Автоматизация 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 \ Software \ Microsoft \ Office
  • HKLM \ Software \ Wow6432Node \ Microsoft \ Office
  • HKLM \ Software \ Wow6432Node \ Microsoft \ Общие инструменты

Когда я снова запустил приложение, оно показало только несколько проблем с доступом в 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 в группу администраторов все равно не удается.

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

2 ответа

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

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

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

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

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

Другие вопросы по тегам