SOFTWARE PARA CONTROLE IMPRESSAO EM SERVIDOR
Bom dia pessoal.
Esse é meu primeiro tópico no fórum.
Semana passada na empresa, me foi pedido o desenvolvimento deum software que controle as impressões da empresa (cotas, quem e quando o trabalho foi impresso), sei que existem softwares para esse propósito, porém o pessoal quer ter um software próprio (a emprersa está inserindo uma área interna de desenvolvimento).
O problema não é o gerenciamento de usuários, isso vai ser fácil, o problema é o monitoramento do spool do servidor.
A estrutura da empresa é a seguinte: 15 impressoras em um servidos com Windows Server 2003 e 250 usuários.
Eu ja dei uma pesquisada na internet e aqui no fórum mesmo, encontrei alguns códigos, porém não consegui compreender (ainda não possuo conhecimentos avançados), gostaria de saber se alguém poderia me nortear nesse sentido (explicar).
O desenvolvimento será em VB.NET.
Agradeço desde já.
Esse é meu primeiro tópico no fórum.
Semana passada na empresa, me foi pedido o desenvolvimento deum software que controle as impressões da empresa (cotas, quem e quando o trabalho foi impresso), sei que existem softwares para esse propósito, porém o pessoal quer ter um software próprio (a emprersa está inserindo uma área interna de desenvolvimento).
O problema não é o gerenciamento de usuários, isso vai ser fácil, o problema é o monitoramento do spool do servidor.
A estrutura da empresa é a seguinte: 15 impressoras em um servidos com Windows Server 2003 e 250 usuários.
Eu ja dei uma pesquisada na internet e aqui no fórum mesmo, encontrei alguns códigos, porém não consegui compreender (ainda não possuo conhecimentos avançados), gostaria de saber se alguém poderia me nortear nesse sentido (explicar).
O desenvolvimento será em VB.NET.
Agradeço desde já.
Caro CAUEFELIPE1
Sim é possivel estabelecer este controle dop processo principalmente se as impressoras estão em um dominio para server 2003 e/ou 2008
Baseando nas configurações do Print server do 2003/2008 para onde será instalada e apartir deste terminal sera monitorado toda as regras de acesso ao hardware.
não sei se utiilizar VB.Net ou C# é possivel controlar sem riscos a segurança ou possibilidade de burlar
Tenho um controle de hardware pela porta Paralela muito parecido a este seu e criei uma dll de serviço para o server onde não utiilizo o framework mas apenas um conjunto de comando de diretrizes do sistema operacional para informar o IP da máquina, usuário e senha de utilização e controle do hardware.
Todo escrito em C++ utilizando COM+ para ser utilizado com o banco de dados para ser armazenado esta informações junto as uma aplicação de instrução de desennho e impressão em equipamento CNC.
Ficando assim não necessário a instalação de qualquer versão do framework.
Basicamento no seu aplicativo que irá controlar são estas a diretivas ou comandos do print server para controlar qq impressora em um ambiente será eestes:
cscript prnjobs.vbs
Microsoft (R) Windows Script Host Version 5.7
Copyright (C) Microsoft Corporation. All rights reserved.
Em uso: prnjobs [-zmxl?] [-s server][-p printer][-j jobid][-u user name][-w password]
Arguments:
-j - job id
-l - list all jobs
-m - resume the job
-p - printer name
-s - server name
-u - user name
-w - password
-x - cancel the job
-z - pause the job
-? - display command usage
um examplo:
prnjobs -z -p printer -j jobid
prnjobs -l -p printer
prnjobs -l
Será executado internamente em sua aplicação e podendo até saber alem do usuário que utilizou mas em dia/hora foi feito e numero de paginas impressa..........
Boa Sorte.
Sim é possivel estabelecer este controle dop processo principalmente se as impressoras estão em um dominio para server 2003 e/ou 2008
Baseando nas configurações do Print server do 2003/2008 para onde será instalada e apartir deste terminal sera monitorado toda as regras de acesso ao hardware.
não sei se utiilizar VB.Net ou C# é possivel controlar sem riscos a segurança ou possibilidade de burlar
Tenho um controle de hardware pela porta Paralela muito parecido a este seu e criei uma dll de serviço para o server onde não utiilizo o framework mas apenas um conjunto de comando de diretrizes do sistema operacional para informar o IP da máquina, usuário e senha de utilização e controle do hardware.
Todo escrito em C++ utilizando COM+ para ser utilizado com o banco de dados para ser armazenado esta informações junto as uma aplicação de instrução de desennho e impressão em equipamento CNC.
Ficando assim não necessário a instalação de qualquer versão do framework.
Basicamento no seu aplicativo que irá controlar são estas a diretivas ou comandos do print server para controlar qq impressora em um ambiente será eestes:
cscript prnjobs.vbs
Microsoft (R) Windows Script Host Version 5.7
Copyright (C) Microsoft Corporation. All rights reserved.
Em uso: prnjobs [-zmxl?] [-s server][-p printer][-j jobid][-u user name][-w password]
Arguments:
-j - job id
-l - list all jobs
-m - resume the job
-p - printer name
-s - server name
-u - user name
-w - password
-x - cancel the job
-z - pause the job
-? - display command usage
um examplo:
prnjobs -z -p printer -j jobid
prnjobs -l -p printer
prnjobs -l
Será executado internamente em sua aplicação e podendo até saber alem do usuário que utilizou mas em dia/hora foi feito e numero de paginas impressa..........
Boa Sorte.
Segue um exemplo !
http://printqueuewatch.codeplex.com/wikipage?title=Getting%20started&referringTitle=Documentation
http://printqueuewatch.codeplex.com/wikipage?title=Getting%20started&referringTitle=Documentation
Bom dia
AJSO, eu entendi mais ou menos a sua solução, ela me pareceu um pouco avançada...
ALEVALE, eu baixei o seu exemplo, estou [Ô]brincando[Ô] com ele, a primeira vista, me pareceu mais simpes que o exemplo do AJSO.
Por enquanto estou estudando o exemplo, acredito que ainda postarei mais dúvidas....rsrsrs
AJSO, eu entendi mais ou menos a sua solução, ela me pareceu um pouco avançada...
ALEVALE, eu baixei o seu exemplo, estou [Ô]brincando[Ô] com ele, a primeira vista, me pareceu mais simpes que o exemplo do AJSO.
Por enquanto estou estudando o exemplo, acredito que ainda postarei mais dúvidas....rsrsrs
Bom dia.
ALEVALE, você poderia me dar uma informação?
Com as dll[ô]s q o exemplo usa, é possÃvel identificar a quantidade de páginas q foram impressas ao final do job (Ex: mandei imprimir 300 pag[ô]s, mas o job foi cancelado e imprimiram apenas 100)?
De qualquer maneira, estou pesquisando essa informação na internet.
PS: estava tentando usar a propriedade [Ô]PagesPrinted[Ô], mas ela esta retornando sempre a qtd total de páginas, mesmo quando executo o método [Ô]Update[Ô] do PrintJob.
Valeu
ALEVALE, você poderia me dar uma informação?
Com as dll[ô]s q o exemplo usa, é possÃvel identificar a quantidade de páginas q foram impressas ao final do job (Ex: mandei imprimir 300 pag[ô]s, mas o job foi cancelado e imprimiram apenas 100)?
De qualquer maneira, estou pesquisando essa informação na internet.
PS: estava tentando usar a propriedade [Ô]PagesPrinted[Ô], mas ela esta retornando sempre a qtd total de páginas, mesmo quando executo o método [Ô]Update[Ô] do PrintJob.
Valeu
Sobre a quantidade e informações adicionais o PritJob deve ter a opção count ou alguma coisa do genero.
Bom o que daria pra você fazer é o PrintJob tem a classe JobCanceled ou Deleted se não me engano, daria pra pegar o total de páginas impressas e fazer uma substração quando cancelado o Job vou dar uma olhada tbm dai eu posto o resultado qq coisa.
Bom o que daria pra você fazer é o PrintJob tem a classe JobCanceled ou Deleted se não me engano, daria pra pegar o total de páginas impressas e fazer uma substração quando cancelado o Job vou dar uma olhada tbm dai eu posto o resultado qq coisa.
http://www.codeproject.com/Articles/51085/Monitor-jobs-in-a-printer-queue-NET
Bom dia
ALEVALE, seu exemplo me ajudou em um outro sentido (exibir o Ãcone na barra de notificações), porém quando eu me referi ao total de páginas impressas, eu quis dizer se é possivel capturar quantas páginas a impressora imprimiu, independente da quantidade de cópias, ex: a soma de tudo que tem que ser impresso é 500 pag[ô]s, porém por cancelamento do usuário, a impressora imprimiu 200 pag[ô]s. A minha dúvida é: é possivel capturar esse total de pag[ô]s impressas (nesse caso, as 200 pag[ô]s)?
Tentei com a propriedade PagePrinted, mas não retornou a informação q eu precisava.
Segue o trecho do código (não sei se ajuda a entender melhor a situação rsrs)
Private Sub pmon_JobAdded(ByVal sender As Object, ByVal e As PrintJobEventArgs) Handles pmon.JobAdded
Dim pages As Integer
pages = 0
With CType(e, PrintJobEventArgs)
While (.PrintJob.Spooling) Or (.PrintJob.Printing)
.PrintJob.Update()
pages = .PrintJob.PagesPrinted
End While
If (.PrintJob.Printed) Then
cmd.CommandText = [Ô]INSERT INTO IMPRESSOES(USUARIO, PAGINAS, DOCUMENTO, QTDCOPIAS, NOMEIMPRESSORA, DATAIMPRESSAO, PAGIMPRESSAS) VALUES([Ô]
cmd.CommandText &= [Ô][ô][Ô] & .PrintJob.UserName & [Ô][ô], [Ô]
cmd.CommandText &= [Ô][Ô] & .PrintJob.TotalPages.ToString & [Ô], [Ô]
cmd.CommandText &= [Ô][ô][Ô] & .PrintJob.Document.ToString & [Ô][ô], [Ô]
cmd.CommandText &= [Ô][Ô] & .PrintJob.Copies.ToString & [Ô], [Ô]
cmd.CommandText &= [Ô][ô][Ô] & .PrintJob.PrinterName & [Ô][ô], [Ô]
cmd.CommandText &= [Ô][ô][Ô] & .PrintJob.Submitted.ToString & [Ô][ô], [Ô]
cmd.CommandText &= [Ô][Ô] & pages.ToString & [Ô])[Ô]
conn.Open()
cmd.ExecuteNonQuery()
conn.Close()
End If
End With
End Sub
Valeu
ALEVALE, seu exemplo me ajudou em um outro sentido (exibir o Ãcone na barra de notificações), porém quando eu me referi ao total de páginas impressas, eu quis dizer se é possivel capturar quantas páginas a impressora imprimiu, independente da quantidade de cópias, ex: a soma de tudo que tem que ser impresso é 500 pag[ô]s, porém por cancelamento do usuário, a impressora imprimiu 200 pag[ô]s. A minha dúvida é: é possivel capturar esse total de pag[ô]s impressas (nesse caso, as 200 pag[ô]s)?
Tentei com a propriedade PagePrinted, mas não retornou a informação q eu precisava.
Segue o trecho do código (não sei se ajuda a entender melhor a situação rsrs)
Private Sub pmon_JobAdded(ByVal sender As Object, ByVal e As PrintJobEventArgs) Handles pmon.JobAdded
Dim pages As Integer
pages = 0
With CType(e, PrintJobEventArgs)
While (.PrintJob.Spooling) Or (.PrintJob.Printing)
.PrintJob.Update()
pages = .PrintJob.PagesPrinted
End While
If (.PrintJob.Printed) Then
cmd.CommandText = [Ô]INSERT INTO IMPRESSOES(USUARIO, PAGINAS, DOCUMENTO, QTDCOPIAS, NOMEIMPRESSORA, DATAIMPRESSAO, PAGIMPRESSAS) VALUES([Ô]
cmd.CommandText &= [Ô][ô][Ô] & .PrintJob.UserName & [Ô][ô], [Ô]
cmd.CommandText &= [Ô][Ô] & .PrintJob.TotalPages.ToString & [Ô], [Ô]
cmd.CommandText &= [Ô][ô][Ô] & .PrintJob.Document.ToString & [Ô][ô], [Ô]
cmd.CommandText &= [Ô][Ô] & .PrintJob.Copies.ToString & [Ô], [Ô]
cmd.CommandText &= [Ô][ô][Ô] & .PrintJob.PrinterName & [Ô][ô], [Ô]
cmd.CommandText &= [Ô][ô][Ô] & .PrintJob.Submitted.ToString & [Ô][ô], [Ô]
cmd.CommandText &= [Ô][Ô] & pages.ToString & [Ô])[Ô]
conn.Open()
cmd.ExecuteNonQuery()
conn.Close()
End If
End With
End Sub
Valeu
Tenta assim , coloquei umas funçoes a mais para você monitora o status da impressora assim você entende um pouquinho a mais do componente.
O seu erro estava na lógica.
Para testar coloque a impressora em pause envie um documento para a fila, depois disso tire a impressora de [Ô]pausa[Ô].
With CType(e, PrintJobEventArgs)
Do While (.PrintJob.Printed = False)
.PrintJob.Update()
Loop
MsgBox([Ô]Usuário:[Ô] & .PrintJob.UserName)
MsgBox([Ô]Página:[Ô] & .PrintJob.PagesPrinted)
MsgBox([Ô]Documento:[Ô] & .PrintJob.Document.ToString)
MsgBox([Ô]Copias:[Ô] & .PrintJob.Copies)
MsgBox([Ô]Total de páginas impressas:[Ô] & (.PrintJob.PagesPrinted * .PrintJob.Copies), MsgBoxStyle.Information, [Ô]PrintMonitor[Ô])
MsgBox([Ô]Documentos impressos ![Ô], MsgBoxStyle.Information, [Ô]PrintMonitor[Ô])
End With
O seu erro estava na lógica.
Para testar coloque a impressora em pause envie um documento para a fila, depois disso tire a impressora de [Ô]pausa[Ô].
With CType(e, PrintJobEventArgs)
Do While (.PrintJob.Printed = False)
.PrintJob.Update()
Loop
MsgBox([Ô]Usuário:[Ô] & .PrintJob.UserName)
MsgBox([Ô]Página:[Ô] & .PrintJob.PagesPrinted)
MsgBox([Ô]Documento:[Ô] & .PrintJob.Document.ToString)
MsgBox([Ô]Copias:[Ô] & .PrintJob.Copies)
MsgBox([Ô]Total de páginas impressas:[Ô] & (.PrintJob.PagesPrinted * .PrintJob.Copies), MsgBoxStyle.Information, [Ô]PrintMonitor[Ô])
MsgBox([Ô]Documentos impressos ![Ô], MsgBoxStyle.Information, [Ô]PrintMonitor[Ô])
End With
Bom dia
ALEVALE, Eu mudei o evento que eu estava usando, estou usando agora o JobDeleted e o JobAdded.
Procurei na internet e ainda não encontrei (começarei a sair das pesquisas em ingles...rsrsrs), você ja conseguiu adicionar no monitoramento, uma impressora da rede?
Valeu
ALEVALE, Eu mudei o evento que eu estava usando, estou usando agora o JobDeleted e o JobAdded.
Procurei na internet e ainda não encontrei (começarei a sair das pesquisas em ingles...rsrsrs), você ja conseguiu adicionar no monitoramento, uma impressora da rede?
Valeu
Caue a função que eu mudei pra você funciona perfeitamente já que ela só irá seguir em diante quando o job estiver bem sucedido, claro se quiser se o job for deletado você deve cancelar a rotina mas isso já outra historia.
Em relação a impressora da rede na minha visão [Ô]você deve ter um servidor de impressão só para isso dai essa aplicação irá ser executada no servidor[Ô].
As demais estações devem imprimir pelo servidor correto a sua infra está desse jeito ?
Em relação a impressora da rede na minha visão [Ô]você deve ter um servidor de impressão só para isso dai essa aplicação irá ser executada no servidor[Ô].
As demais estações devem imprimir pelo servidor correto a sua infra está desse jeito ?
Tópico encerrado , respostas não são mais permitidas