У меня есть старое приложение, которое использует автоматизацию 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 в группу администраторов это все равно не удается.
Есть идеи по поводу следующих шагов?