Автоматизация PowerPoint. На некоторых компьютерах открытие презентации из окна защищенного просмотра завершается неудачно с помощью E_FAIL (0x80004005) - PullRequest
0 голосов
/ 03 ноября 2018

У меня есть проблема, которая возникает на некоторых машинах (кажется, те, на которых установлен Office 365 версии 1809), но у меня на других машинах работает та же версия 365, и они работают с точно таким же кодом.

Мне нужно программно открыть презентацию PowerPoint, защищенную паролем. Само по себе простое открытие защищенной паролем презентации PowerPoint кажется более сложным, по сравнению с другими продуктами Office, но после некоторого эксперимента и поиска решения этой проблемы, похоже, этот код поможет:

Dim ppt
MsgBox "booting ppt"
Set ppt = CreateObject("powerpoint.application")
ppt.Visible = True
Dim pvw
MsgBox "loading pvw"
Set pvw = ppt.ProtectedViewWindows.Open("C:\Files\pres.pptx", "password")
If pvw Is Nothing Then MsgBox "no pvw" Else MsgBox "got pvw"
pvw.Activate
Set pvw = Nothing
Set ppt = Nothing
MsgBox "end"

Да, я знаю, неприятный код, но вовлечение VSTO или что-то более строго типизированное тоже не помогает, я просто попытался придумать самый простой из возможных кодов с наименьшим количеством «движущихся частей», чтобы повторить проблему. Я поместил вызовы MsgBox, чтобы увидеть, где это не получается.

Когда я пробую эквивалент с использованием VSTO, я получаю следующую ошибку:

    System.Runtime.InteropServices.COMException (0x80004005): Unspecified error (Exception from HRESULT: 0x80004005 (E_FAIL))
   at Microsoft.VisualBasic.CompilerServices.LateBinding.LateGet(Object o, Type objType, String name, Object[] args, String[] paramnames, Boolean[] CopyBack)
   at Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack)

Я пытался исключить COM-взаимодействие, просто поместив приведенный выше код в качестве VBA в скрипт .vbs и запустив его, но это также не удалось:

Error: Unspecified error
Code: 80004005

Наконец, я попытался просто запустить это непосредственно из самой PowerPoint через макрос, но это также не удается из-за следующей ошибки:

Method 'Open' of object 'ProtectedViewWindows' failed

Я просто не могу заставить это работать на уязвимом компьютере - воспроизвести его, просто создать и сохранить защищенную паролем презентацию PowerPoint в формате pptx, а также соответствующим образом изменить путь и пароль в приведенном выше коде, а затем запускать как макрос, или VBS, или через VSTO, если у вас есть время.

Я много чего пробовал:

  • Проверка прав доступа к файлу NTFS - все хорошо.
  • Проверка идентификатора зоны и блокировка загруженных из Интернета файлов - не проблема, создаваемая локально, но заслуживающая внимания - ничем не отличается.
  • Переключение множества опций в «Центре доверия» в опциях PowerPoint - не радость.
  • Предоставление программного доступа к объектной модели VBA и соответствующим настройкам в PowerPoint - не радость.
  • Отключение всех надстроек - без разницы.
  • Попытка запустить PowerPoint, интерпретатор VBScript, пример приложения .NET, использующего VSTO, чтобы сделать то же самое - не исправляет это.
  • DEP, похоже, не имеет значения - он включен на машинах, которые работают, как и на отказавшем компьютере.
  • На неисправном компьютере не запущено антивирусное программное обеспечение, и это чистый компьютер, на котором установлено немного другого.
  • Убедитесь, что в диспетчере задач все еще не запущены "старые" копии PowerPoint.
  • Запуск с правами администратора.

Этот компьютер был переброшен между 32- и 64-разрядной версиями Office 365 (в настоящее время используется 32-разрядная версия Office 365), это 64-разрядная система Windows 7.

Я даже пытался контролировать его с помощью Process Monitor SysInternals, но ничего не предвидится, затопить сотни тысяч вещей, которые регистрируются между окном сообщения и защищенным событием открытия.

Я вижу, что PowerPoint может прочитать файл, так как окно защищенного просмотра кратковременно вспыхивает, упоминая соответствующий файл. Если я намеренно неправильно пишу имя файла (чтобы увидеть, пытается ли он его открыть), я получаю другую ошибку. Если я намеренно неправильно ввел пароль, я также получаю другую ошибку, которая подразумевает, что PowerPoint может получить доступ и прочитать / расшифровать файл. Очевидно, я пытался открыть файл вручную в PowerPoint и вручную ввести пароль, и это прекрасно работает.

Такое ощущение, что внутри самой PowerPoint что-то сломано - почти как будто он может открывать, расшифровывать и читать файл, и как только он "получил" файл, он завершает финальную серию тестов и один из них происходит сбой, но он просто дает общую и бесполезную ошибку E_FAIL (0x80004005).

В самой машине нет ничего «особенного», она не является частью домена / AD, на ней нет инструментов разработчика, и никто не «играл» с разрешениями реестра или чем-то подобным.

Я совершенно в недоумении по поводу того, почему это не удается - выполнение «ремонта» при установке в офисе, похоже, не имеет значения, равно как и полное удаление / переустановка Office. Я не пробовал перезагружать ОС с нуля, но на самом деле это не вариант, такая конфигурация, скорее всего, встречается где-то в «диком» состоянии, поэтому я бы лучше нашел основную причину.

Есть идеи?

Спасибо, Ник.

...