Windows Printer Driver para aceitar o trabalho, mas excluí-lo e não imprimi-lo

2

Eu tenho um aplicativo legado que está imprimindo e não posso desabilitar isso no aplicativo. Esta tarefa é impressa em uma fila de impressora definida pelo Windows. O problema é que, sem uma impressora real conectada, a fila de impressão fica cheia e, em seguida, os trabalhos que estão sendo impressos param, esperando que a fila responda que o trabalho foi aceito.

O aplicativo legado é impresso através do script Powershell.

if( sm_control_flag )
{
    get-content $TO_PRINTER | Out-Printer -name $cfgs.PRINTER_QUEUE
}

O problema é que esses scripts não podem ser alterados devido a eles estarem em produção em locais distribuídos. Existem vários scripts que fazem esse tipo de processo.

A saída da impressora precisa retornar um sucesso, não um erro, ou o script será interrompido com um erro de impressão. Portanto, a fila deve existir (que é basicamente uma impressora definida no sistema operacional Windows Server).

Se não houver uma impressora real definida e conectada à fila, o Windows aceitará o trabalho e enfileirará a saída para impressão. O problema é que a fila acabará por preencher o espaço livre no servidor e, em seguida, bloquear toda a impressão. A Out-Printer do script Powershell também fará uma pausa e aguardará que o espaço da fila seja liberado quando a fila estiver cheia.

Não consigo desativar a impressão no computador e excluir trabalhos, pois outras impressoras estão conectadas e precisam ser impressas. O que eu preciso é de um driver de impressora que simplesmente aceita o trabalho de impressão, mas não faz nada com ele. Eu não preciso imprimir, apenas ser deletado.

Eu também estava tentando simplesmente imprimir em um arquivo, para que eu pudesse reutilizar o mesmo nome de arquivo a cada vez, o que sobrescreveria a última saída de impressão e atenderia às minhas necessidades. O problema é que imprimir em um arquivo sempre parece solicitar ao usuário o nome do arquivo. Sendo este um servidor Windows, não há nenhum usuário para realmente solicitar um nome de arquivo, então isso bloqueia a fila e também pausa o script.

Alguém sabe de uma maneira de aceitar os trabalhos e depois simplesmente exclui a saída e não imprime o trabalho?

    
por Steven Scott 20.04.2018 / 21:06

2 respostas

2

Abra o Control Panel e escolha Devices and Printers .

Quando a janela Device and Printers for aberta, escolha Add Printer . O que vem a seguir depende da sua rede e da edição do Windows que você possui, mas talvez seja necessário escolher The printer I want isn't listed.

Neste ponto, você deve estar em uma janela com um botão de opção para Add a local printer or network printer with manual settings . Escolha essa opção e clique em Next .

A partir daqui, você pode usar Use an existing port: e escolher nul: (Local Port) na lista suspensa.

Clique novamente em Next e agora você pode escolher praticamente qualquer driver de impressora desejado, dar um nome à impressora e concluir a configuração.

A impressora que você acabou de criar será um buraco negro no sistema. Ele processará os trabalhos de impressão usando o driver selecionado, incluindo a limpeza do trabalho da fila de impressão, mas a saída não chegará a lugar nenhum.

    
por 01.06.2018 / 21:31
0
strPort="<printer port name"
strNameSpace= "root\cimv2"
#the sql/wql query can be changed to go on other values.

#prepare to connect to a remote computer
Set oLocator = CreateObject("WbemScripting.SWbemLocator")
#connect to a remote computer 
#strUser local or domain admin username
#strPassword password for above
Set oService = oLocator.ConnectServer(strServer, strNameSpace, strUser, strPassword)
#Set administrator privileges
oService.Security_.impersonationlevel = 3
oService.Security_.Privileges.AddAsString "SeLoadDriverPrivilege"
#Query the internal representation of the printer
Set oPrinter=oService.ExecQuery("SELECT * FROM Win32_Printer where DeviceID like'"&strPort&"%'")
#alternative query option
#Set oPrinter=oService.ExecQuery("SELECT * FROM Win32_Printer where Name like'"&strPort&"%'")
#If you give the strPort and exact name only 1 printer will match
#It can match multiple printers if two printer have similiar names
# printer:  me-1 and me-2 with both be matched by strPort="me"
For Each Printer In oPrinter
#pause the printer
uResult = Printer.Pause()
#cancel all jobs
uResult = Printer.CancelAllJobs()
#if any error occures uResult will not be 0
if uResult <>0 then wscript.echo "Error occured"
Next

Se você executar o script no computador com a fila de impressão, talvez não seja necessário ter credenciais.

Salvar como um arquivo vbs cscript whatever.vbs

    
por 25.04.2018 / 17:41