【问题标题】:PDFCreator COM Script Run as Service Fails to see Jobs PrintedPDFCreator COM 脚本作为服务运行无法查看打印的作业
【发布时间】:2015-04-09 01:26:45
【问题描述】:

我有一个我在 PrimalScript 中编译的 PDFCreator 脚本,以便我可以通过 svrany 执行它,我遇到的问题是,当我运行该服务时,队列中永远不会看到来自脚本的打印作业。如果我从会话中运行 vbscript 或编译的 exe,它工作正常。

这是我的 vbs 文件中针对 pdfcreator 版本 2.1.1.820 运行的代码

Dim strExt, intStatus, strDestFileName, strInputFileName, strReason 


Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("Shell.Application")
Set PDFCreatorQueue = CreateObject("PDFCreatorBeta.JobQueue")

strInputFileName = "C:\Temp\Test.txt" 
strDestFileName = "C:\Temp\Test.pdf"

PDFProcess 

' ** Sub Routine to render file as PDF
Sub PDFProcess  
Dim objFolder, job, intStatPDFCreator, intPageCount

intPageCount = 1  

WScript.Echo "PDF Destination Name: " & strDestFile 
WScript.Echo "Initializing PDFCreator queue..."
intStatPDFCreator = PDFCreatorQueue.Initialize()
WScript.Echo "PDFCreator Object Status: " & intStatPDFCreator 

If intStatPDFCreator = 0 Then 
        If Not objFSO.FileExists(strInputFileName) Then
            WScript.Echo "PDFCreator: Can't find the file: " & strInputFileName
        Else 
            WScript.Echo "Printing Page: " & strInputFileName 

            objShell.ShellExecute strInputFileName, "", "", "print"

            WScript.Sleep 1000
            WScript.Echo "Currently there are " & PDFCreatorQueue.Count & " job(s) in the queue" 
        End If

    WScript.Echo "Waiting for the job to arrive at the queue..."
    if Not(PDFCreatorQueue.WaitForJobs(intPageCount, 10)) Then 
        strReason = "The print job did not reach the queue within " & 10 & " seconds" 
        WScript.Echo strReason 
        intStatus = 0
    Else
        WScript.Echo "Currently there are " & PDFCreatorQueue.Count & " job(s) in the queue" 
        WScript.Echo "Getting job instance and merging"

        PDFCreatorQueue.MergeAllJobs

        while(PDFCreatorQueue.Count > 0)
            Set job = PDFCreatorQueue.NextJob
                WScript.Echo "Staging PDF File: " & strDestFileName 
            job.ConvertTo(strDestFileName)
                WScript.sleep 5000

            If Not(job.IsFinished Or job.IsSuccessful) Then
                strReason = "Could not convert the file: " & strDestFileName
                    WScript.Echo strReason 
                intStatus = 0
            Else
                WScript.Echo "Job finished successfully" 
            End If 
        Wend 
    End If 
        WScript.Echo "Releasing the object"
    PDFCreatorQueue.ReleaseCom()
Else
    strReason =  "Failed to create PDFCreator COM instance."
        WScript.Echo strReason 
    intStatus = 0
End If


End Sub 

我在我的域凭据下运行的服务并修改了注册表以允许它以交互方式运行

SERVICE_NAME: tgprintprocessor
    TYPE               : 110  WIN32_OWN_PROCESS  (interactive)
    STATE              : 4  RUNNING
                            (STOPPABLE, PAUSABLE, ACCEPTS_SHUTDOWN)
    WIN32_EXIT_CODE    : 0  (0x0)
    SERVICE_EXIT_CODE  : 0  (0x0)
    CHECKPOINT         : 0x0
    WAIT_HINT          : 0x0
    PID                : 3752
    FLAGS              :

我已将交互式服务检测设置为运行状态。

查看 PDFCreator 跟踪日志我没有看到任何类型的错误。

如果我打开 PDFCreator 打印机并查看打印队列,我确实看到作业进入队列并退出,甚至可以暂停打印机,因此作业在打印机队列中停止,但 com 对象队列不知道它的存在。

我还尝试将 PDFCreator.exe 作为服务额外运行,以防它需要在后台运行 exe 的实例,因为我注意到应用程序本身不会像我通常看到的那样在任务管理器打印作业提交中启动手动执行脚本。

我的问题是什么,我想我不知道还能去哪里看,如果我可能遗漏了什么,我可以添加到上面的测试脚本中以尝试捕获问题。

【问题讨论】:

    标签: vbscript com


    【解决方案1】:

    解决此问题和上述行为的方法是将驱动程序隔离模式从默认的 NONE 更改为 SHARED。我是在打印管理管理单元下完成的。花了点时间才弄明白....

    【讨论】:

    • 更多信息:您需要通过服务器管理器将打印服务器角色添加到计算机才能获得打印管理管理单元。 (另外,大+1。互联网上有很多人有同样的问题,但这是我见过的唯一不需要升级 PDFCreator 或脆弱的黑客的解决方案。)
    【解决方案2】:

    如果您使用的是 WScript,它将在第一个 wscript.echo 处停止。确保您使用 CScript 运行。

    【讨论】:

    • 已编译的 exe 正在 cscript 中执行,我已通过任务管理器验证 cscript 初始化了对 vbs 文件的调用。
    • sc config UI0Detect start= auto sc start UI0Detect rundll32 winsta.dll,WinStationSwitchToServicesSession 这是三行。最后一行会将您切换到服务桌面。
    • 在服务执行和处理输入文件时,没有需要注意或输入任何类型的程序。
    • 如果什么都没发生,这不是我收到的信息。您需要将日志记录到您的文件中。
    • 启用了日志记录,我上面的实际脚本只是我实际使用的简化版本,我有一个替换每个 wscript.echo 条目的函数。我还在 TRACE 模式下启用了 PDFCreator 调试日志,启用了 Windows 打印服务管理和操作日志。不知道我还能记录什么表明这里的故障点......
    猜你喜欢
    • 2018-09-27
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    • 2016-10-03
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多