Отказ DCOM в автоматизации делопроизводства

Я разработал программу на C #, которая извлекает данные из базы данных SQL Server, а затем генерирует документы Word, содержащие эти данные. Я настроил программу для работы как часть задания SSIS на Windows Server 2003. Программа работает от имени пользователя SQLSVC, не имеющего административных прав. Когда я вхожу в систему как SQLSVC и запускаю программу, она выполняется правильно. Однако, когда программа запускается автоматически как задание SSIS, она зависает на следующей строке кода.

Microsoft.Office.Interop.Word.Application word =
    new Microsoft.Office.Interop.Word.Application();

Когда я принудительно завершаю процесс, появляется следующее сообщение об ошибке.

Error Message: System.Runtime.InteropServices.COMException (0x80080005):
Retrieving the COM class factory for component
with CLSID {000209FF-0000-0000-C000-000000000046}
failed due to the following error: 80080005.
   at IepGlance.Program.CreateNewIepFiles(Dictionary`2
       iepDictionary, EasyIepDataContext dbContext)
   at IepGlance.Program.Main(String[] args)

Насколько я могу понять, проблема связана с разрешениями DCOM. Я использовал dcomcnfg, чтобы добавить все возможные разрешения DCOM пользователю SQLSVC, но это не помогло. Есть ли другие возможные решения?


person Eric Ness    schedule 06.11.2009    source источник
comment
Связанные - stackoverflow.com/questions/3477086/   -  person vapcguy    schedule 09.11.2018


Ответы (4)


Запустите программу "dcomcnfg -32". (Вы не можете найти компоненты word и excel, если он работает под 64-разрядной версией) Перейдите в «Корень консоли / Службы компонентов / Компьютер / Мой компьютер / Конфигурация DCOM /» Найдите Microsoft Word и Excel и выберите свойства. Перейдите в раздел «Безопасность» и выберите «Настроить» в разделе «Разрешения конфигурации». (При необходимости вы можете изменить и другие разрешения, но мне это не требовалось). Добавьте «IIS_IUSRS» и предоставьте ему «Полный доступ». Теперь перейдите к «Личность» и выберите «Интерактивный пользователь».

person Juny Eldo    schedule 01.12.2014
comment
Это привело меня в нужное место. Я все еще не мог увидеть это с помощью dcomcnfg -32, но mmc comexp.msc / 32 помогло. - person davewasthere; 09.08.2017
comment
Вообще ничего в Microsoft при использовании dcomcnfg -32, dcomcnfg -64, mmc comexp.msc /32 или mmc comexp.msc /64, относящихся к Word, для меня. Зря потратил время. Офис 2016, Windows 10 Профессиональная. - person vapcguy; 07.11.2018
comment
Мне удалось найти Microsoft Word 97-2003 Document в конфигурации DCOM, если я только что открыл mmc или mmc -32. - person vapcguy; 07.11.2018

Здесь есть пара вещей.

Во-первых, этот поток на SO может помочь.

Во-вторых, Microsoft предупреждает, что могут возникнуть «осложнения». когда вы автоматизируете Office в автоматическом режиме. Вот изюминка (в оригинале выделена жирным шрифтом):

В настоящее время Microsoft не рекомендует и не поддерживает автоматизацию приложений Microsoft Office из любых автоматических, неинтерактивных клиентских приложений или компонентов (включая службы ASP, ASP.NET, DCOM и NT), поскольку Office может демонстрировать нестабильное поведение и / или тупик, когда Office работает в этой среде.

В связанной статье обсуждаются обходные пути.

person Jay Riggs    schedule 06.11.2009

Это зависит от того, используете ли вы 64-разрядную машину, 32-разрядный или 64-разрядный офис, но в любом случае вам нужно перейти в Инструменты администратора> Службы компонентов и в конфигурации DCOM вам нужно найти 'Microsoft Word 97 - 2003 Document », а затем установите« идентификатор »для пользователя, который запускает ваш пул приложений. или просто отключите на нем безопасность.

Если вы используете 64-разрядный сервер с 32-разрядным Office, у вас могут возникнуть проблемы с поиском этого параметра DCOM. Вам нужно будет запустить «MMC -32» из командной строки, чтобы запустить 32-битную MMC, а затем добавить «Службы компонентов» из меню «Файл> Добавить / удалить оснастки».

Надеюсь, это помогло

person Glenn Ferrie    schedule 02.09.2011
comment
Кажется, что даже полностью 32-битная среда может быть испорчена: Windows 8 с кириллической локалью неуязвима для такого шаманства при работе VS2008 и MSO 2003. Странно то, что 'mmc' и 'mmc -32' по-прежнему предоставляют доступ к разные магазины даже на 32-битной системе. - person kagali-san; 18.09.2012
comment
Как отключить на нем безопасность? Я попробовал это с идентификатором службы, которую я использовал, которая пыталась сделать что-то похожее на OP, и это не сработало. - person vapcguy; 07.11.2018
comment
вам необходимо определить правильный ClassID или GUID, соответствующий типу, вызывающему проблему. Как только вы узнаете, какой класс блокируется безопасностью DCOM, вы можете открыть консоль управления и настроить безопасность этого компонента. Чтобы открыть консоль управления, вам нужно запустить команду MMC - для этого потребуется еще один аргумент -32, если ваш COM-компонент 32-битный на 64-битной машине. После открытия консоли найдите класс по идентификатору класса и настройте свойства. - person Glenn Ferrie; 08.11.2018

С моей стороны, я планировал пакетное задание на одном из наших серверов, и оно выдавало ту же ошибку, когда выполнялось на моем локальном сервере.

Я пробовал все вышеперечисленные шаги, но в моем случае реальный сценарий был другим.

Каждый раз при планировании пакетного задания не выбирайте опцию [Запускать вне зависимости от того, вошел ли пользователь в систему или нет], потому что для этого требуется доступ администратора, а в противном случае у вас проблемы.

введите описание изображения здесь

person Anish    schedule 12.12.2018