2015-09-16 3 views
1

У нас есть несколько классических приложений ASP, которые в конечном итоге должны печатать отчет на принтер с веб-сервера.Открытый IE с использованием Powershell на Windows Server 2012

Я использую ввод от пользователя для создания отчета на сервере (на стороне сервера). Я храню его в html-файле на сервере. Затем я передаю имя файла и printername сценарию powershell. Сценарий powershell вызывает IE и печатает файл. Замечательно! Не так быстро!

На моем компьютере он отлично работает (я запускаю IIS и поэтому должен имитировать веб-сервер).

Однако, когда я положил все это на веб-сервере ошибка я получаю в моем журнале есть: номер

Ошибка: -2147024891

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

Ошибка Источник:$ie = new-object -comObject InternetExplorer.Application

Есть ли установка IIS или некоторые другие настройки в ОС Windows 2012 R2, которая может вызвать это и его изменение приведет его на работу?

Powershell следующим образом:

Function LogWrite 
{ 
    Param ([string]$logstring) 

    Add-content $Logfile -value $logstring 
} 

$newline = [Environment]::NewLine 
$FileName = $args[0] 
$PrinterName = $args[1] 
$Logfile = $args[2] 
$strReturn = "0^Successful" 

"Filename: " + $FileName 
"Printer: " + $PrinterName 

#Send To named printer 
try 
{ 
#Change the Default Printer 
(Get-WmiObject -ComputerName . -Class Win32_Printer -Filter "Name='$PrinterName'").SetDefaultPrinter() 

#Print a file from Microsoft Word (which can apply formatting changes) 
$ie = new-object -comObject InternetExplorer.Application 
$ie.Navigate($FileName) 
while ($ie.busy) { Start-Sleep -second 5 } 
$ie.ExecWB(6,2) 

} 
catch 
{ 

    $strMessage = $error[0].Exception.Message 
    $strHResult = $error[0].Exception.HResult 
    $strLine = $error[0].InvocationInfo.Line 
    $strReturn = "1^Error attempting to print report.^" + $strHResult + "^" + $strMessage + "^Line: " + $strLine 
} 
finally 
{ 

    # garbage collection 
    [gc]::collect() 
    [gc]::WaitForPendingFinalizers() 


    #exit $strReturn 
} 
    # write to a log file 
    # Log file time stamp: 
    $LogTime = Get-Date -Format "MM/dd/[email protected]:mm:ss" 
    $LogRecord = $LogTime + "^" + $FileName + "^" + $PrinterName + "^" + $strReturn 
    LogWrite $LogRecord 

$strReturn 

ответ

2

почти наверняка проблема с разрешениями. Вам, вероятно, необходимо либо:

  1. Изменить идентификатор веб-приложения на сервере пользователю, имеющему доступ для автоматизации IE.
  2. Если он уже запущен как определенный пользователь (а не идентификатор приложения), убедитесь, что пользователь запустил IE в интерактивном режиме хотя бы один раз.
  3. Изменение разрешения запуска DCOM, чтобы идентификатор приложения мог его открыть.

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

У задачи есть разрешение на это. Веб-приложение получает разрешение на запуск задачи. Меньше шансов на использование веб-приложения.

Смежные вопросы