powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Мониторинг печати
27 сообщений из 27, показаны все 2 страниц
Мониторинг печати
    #39598479
Петр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Друзья, подскажите есть ли библиотеки (delphi) для мониторинга печати. Возможно платные.
В основном нужно контролировать количество распечатанных страниц, размер бумаги.
Ну и сопутствующие вещи:
состояние принтера, IP-адрес, имена пользователей.
...
Рейтинг: 0 / 0
Мониторинг печати
    #39598488
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет. Чтобы был доступ к сетевому принтеру и его данным, нужна соответствующая поддержка от этого самого принтера, которую еще и включить надо в винде. И у разных моделей это всё разное (т.е. у кого-то можно вытащить данные, а у кого-то не получится).
...
Рейтинг: 0 / 0
Мониторинг печати
    #39598489
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Мониторинг печати
    #39598491
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПетрДрузья, подскажите есть ли библиотеки (delphi) для мониторинга печати. Возможно платные.
В основном нужно контролировать количество распечатанных страниц, размер бумаги.
Ну и сопутствующие вещи:
состояние принтера, IP-адрес, имена пользователей.

Вот еще советуют через WMI.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
//-----------------------------------------------------------------------------------------------------
//     This code was generated by the Wmi Delphi Code Creator (WDCC) Version 1.8.5.0
//     http://code.google.com/p/wmi-delphi-code-creator/
//     Blog http://theroadtodelphi.wordpress.com/wmi-delphi-code-creator/
//     Author Rodrigo Ruz V. (RRUZ) Copyright (C) 2011-2014 
//----------------------------------------------------------------------------------------------------- 
//
//     LIABILITY DISCLAIMER
//     THIS GENERATED CODE IS DISTRIBUTED "AS IS". NO WARRANTY OF ANY KIND IS EXPRESSED OR IMPLIED.
//     YOU USE IT AT YOUR OWN RISK. THE AUTHOR NOT WILL BE LIABLE FOR DATA LOSS,
//     DAMAGES AND LOSS OF PROFITS OR ANY OTHER KIND OF LOSS WHILE USING OR MISUSING THIS CODE.
//
//----------------------------------------------------------------------------------------------------
program GetWMI_Info;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  ActiveX,
  ComObj,
  Variants,
  Dialogs;



// La clase Win32_PrintJob representa un trabajo de impresión generado por una aplicación Win32. Las unidades de trabajo generadas por el comando Imprimir de una aplicación que se ejecuta en un sistema Win32 son descendientes (o miembros) de esta clase.
// Ejemplo: un documento de impresora creado por una aplicación de Office 97

procedure  GetWin32_PrintJobInfo;
const
  WbemUser            ='';
  WbemPassword        ='';
  WbemComputer        ='localhost';
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService   : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject   : OLEVariant;
  oEnum         : IEnumvariant;
  iValue        : LongWord;
  str:String;
begin;
  FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService   := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
  FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_PrintJob','WQL',wbemFlagForwardOnly);
  oEnum         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
  Str := '';
  while oEnum.Next(1, FWbemObject, iValue) = 0 do
  begin
    Str := Str + sLineBreak + Format('Caption           %s',[String(FWbemObject.Caption)]);// String
    Str := Str + sLineBreak + Format('DataType          %s',[String(FWbemObject.DataType)]);// String
    Str := Str + sLineBreak + Format('Description       %s',[String(FWbemObject.Description)]);// String
    Str := Str + sLineBreak + Format('Document          %s',[String(FWbemObject.Document)]);// String
    Str := Str + sLineBreak + Format('DriverName        %s',[String(FWbemObject.DriverName)]);// String
    Str := Str + sLineBreak + Format('ElapsedTime       %s',[String(FWbemObject.ElapsedTime)]);// Datetime
    Str := Str + sLineBreak + Format('HostPrintQueue    %s',[String(FWbemObject.HostPrintQueue)]);// String
    Str := Str + sLineBreak + Format('JobId             %d',[Integer(FWbemObject.JobId)]);// Uint32
    Str := Str + sLineBreak + Format('JobStatus         %s',[String(FWbemObject.JobStatus)]);// String
    Str := Str + sLineBreak + Format('Name              %s',[String(FWbemObject.Name)]);// String
    Str := Str + sLineBreak + Format('Notify            %s',[String(FWbemObject.Notify)]);// String
    Str := Str + sLineBreak + Format('Owner             %s',[String(FWbemObject.Owner)]);// String
    Str := Str + sLineBreak + Format('PagesPrinted      %d',[Integer(FWbemObject.PagesPrinted)]);// Uint32
    Str := Str + sLineBreak + Format('PrintProcessor    %s',[String(FWbemObject.PrintProcessor)]);// String
    Str := Str + sLineBreak + Format('Priority          %d',[Integer(FWbemObject.Priority)]);// Uint32
    Str := Str + sLineBreak + Format('Size              %d',[Integer(FWbemObject.Size)]);// Uint32
    Str := Str + sLineBreak + Format('Status            %s',[String(FWbemObject.Status)]);// String
    Str := Str + sLineBreak + Format('StatusMask        %d',[Integer(FWbemObject.StatusMask)]);// Uint32
    Str := Str + sLineBreak + Format('TimeSubmitted     %s',[String(FWbemObject.TimeSubmitted)]);// Datetime
    Str := Str + sLineBreak + Format('TotalPages        %d',[Integer(FWbemObject.TotalPages)]);// Uint32
    Str := Str + sLineBreak + '--------------------------------------------------------';

    MessageDlg(Str, mtInformation, [mbOK], 0);

    FWbemObject:=Unassigned;
  end;
end;


begin
 try
    CoInitialize(nil);
    try
      GetWin32_PrintJobInfo;
    finally
      CoUninitialize;
    end;
 except
    on E:EOleException do
        Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode])); 
    on E:Exception do
        Writeln(E.Classname, ':', E.Message);
 end;
 Writeln('Press Enter to exit');
 Readln;      
end.

...
Рейтинг: 0 / 0
Мониторинг печати
    #39598496
Петр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ok, спасибо посмотрю.
Если у кого еще будут мысли, буду признателен.
...
Рейтинг: 0 / 0
Мониторинг печати
    #39598670
Фотография Kast2K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Петр,

Вместо самописного используем это
https://www.ysoft.com/ru/ru/print-management
...
Рейтинг: 0 / 0
Мониторинг печати
    #39598701
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня что-то в голове вертится про печать через диспетчер и напрямую... Или такого выбора сейчас нет?
...
Рейтинг: 0 / 0
Мониторинг печати
    #39599265
Петр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kast2KПетр,

Вместо самописного используем это
https://www.ysoft.com/ru/ru/print-management

в моем случае нужен именно самописный вариан

wadmanУ меня что-то в голове вертится про печать через диспетчер и напрямую... Или такого выбора сейчас нет?

в сам процесс печать приложение не должно вмешиваться. Только контроль. Клиентская часть может быть установлена на все компьютеры.
...
Рейтинг: 0 / 0
Мониторинг печати
    #39599410
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Петр,

пробуй предложенный wmi, если заработает, то и клиентов ставить не придётся, только что настроить, что бы wmi раздавался наружу.
...
Рейтинг: 0 / 0
Мониторинг печати
    #39599482
xMailer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Петр, как тебе советовали - делай через wmi, у нас была разработана win служба для сбора статистики печати, работает не первый год. Текущее состояние, вплоть до статуса текущего состояния распечатывания, тоже wmi позволяет.
...
Рейтинг: 0 / 0
Мониторинг печати
    #39599521
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xMailerПетр, как тебе советовали - делай через wmi, у нас была разработана win служба для сбора статистики печати, работает не первый год. Текущее состояние, вплоть до статуса текущего состояния распечатывания, тоже wmi позволяет.
Как у вас решается вопрос сетевых принтеров и автономных машин, на которых печать и ксерокопирование происходит без участия клиентских машин?
...
Рейтинг: 0 / 0
Мониторинг печати
    #39600403
xMailer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDiКак у вас решается вопрос сетевых принтеров и автономных машин, на которых печать и ксерокопирование происходит без участия клиентских машин?
1. Печать на сетевые принтеры: в нашем случае печать идет через принт-сервер с win и проходит через журнал на сервере с eventID=307. И да, подтверждаю, на клиентской стороне только eventid=306,821, что не позволит отследить детали печати, которые есть в EvID=307. В Вашем случае, посмотрите на журнал событий компа к которому подключен принтер, т. е. пользователь "А" печатает на расшаренный принтер пользователя "Б", у "А" - в журнале ерунда, что у "Б"? я не могу проверить
2. Автономные машины: у нас служба льет данные не напрямую в основную базу, а через локальную fb базу, т.е. накопление происходит в локальной базе, при доступности сети сливает в основную. Вариантов осуществлять пересыл с локальной в основную базу достаточно много.
3. Ксерокопирование: тут все организовано по другому, через журналы это не отследить, но у нас принтеры/копиры - hp, и на каждом настроена средствами самого копира слив суточной статистики на спец. ящик почтовый. По cron проверяем ящик, парсим офигительно мудреный xml, заносим статистику в базу.

Как-то так
...
Рейтинг: 0 / 0
Мониторинг печати
    #39600406
xMailer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот так в win
...
Рейтинг: 0 / 0
Мониторинг печати
    #39601037
Петр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xMailerПетр, как тебе советовали - делай через wmi, у нас была разработана win служба для сбора статистики печати, работает не первый год. Текущее состояние, вплоть до статуса текущего состояния распечатывания, тоже wmi позволяет.

через WMI я могу обратиться к Win32_PrintJob. Но как я понимаю надо обращаться во время печати?
Т.е. надо понимать, что пошла печать. Как это сделать? Отслеживать события, но какие и как?
...
Рейтинг: 0 / 0
Мониторинг печати
    #39601115
xMailer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Петрчерез WMI я могу обратиться к Win32_PrintJob. Но как я понимаю надо обращаться во время печати?
Т.е. надо понимать, что пошла печать. Как это сделать? Отслеживать события, но какие и как?
я таких событий не нашел, только периодический (500ms) опрос Win32_PrintJob. В моем случае печать стартовала через контекстное меню проводника, это и было началом пуска таймера опроса. Если использовать данный метод для подсчета статистики, способ не надежен, если документ небольшой - можно пропустить, я ушел на опрос Win32_NTLogEvent с EventCode=307.

Если найдете win событие старта, то было бы интересно увидеть.
...
Рейтинг: 0 / 0
Мониторинг печати
    #39601127
Петр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xMailer я ушел на опрос Win32_NTLogEvent с EventCode=307.


а опрашиваете как
...
Рейтинг: 0 / 0
Мониторинг печати
    #39601522
Лись
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xMailerПетрчерез WMI я могу обратиться к Win32_PrintJob. Но как я понимаю надо обращаться во время печати?
Т.е. надо понимать, что пошла печать. Как это сделать? Отслеживать события, но какие и как?
я таких событий не нашел, только периодический (500ms) опрос Win32_PrintJob.

Микрософт же уже все придумал для вас FindFirstPrinterChangeNotification + WaitForSingleObject + FindNextPrinterChangeNotification, все данные приходтят по мере поступления.
...
Рейтинг: 0 / 0
Мониторинг печати
    #39601586
xMailer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛисьМикрософт же уже все придумал для вас FindFirstPrinterChangeNotification + WaitForSingleObject + FindNextPrinterChangeNotification, все данные приходтят по мере поступления.
проверил, да, эта связка работает. Гуглите FindFirstPrinterChangeNotification
...
Рейтинг: 0 / 0
Мониторинг печати
    #39603223
Петр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Столкнулся со следующей проблемой:
при использовании FindFirstPrinterChangeNotification, а именно при вызове функции OpenPrinter у пользователя с обычными правами Windows, получаю ERROR_ACCESS_DENIED.
Т.е. ему надо назначить права на принтер (как я понял PRINTER_ACCESS_USE).
Но никак не могу понять как это сделать
...
Рейтинг: 0 / 0
Мониторинг печати
    #39603293
Петр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проблема оказалась при объявлении принтера
Код: pascal
1.
2.
3.
4.
    Defaults: TPrinterDefaults = (
      pDatatype : nil;
      pDevMode  : nil;
      DesiredAccess : PRINTER_ACCESS_USE or PRINTER_ACCESS_ADMINISTER);



Странно, но если убрать
Код: pascal
1.
 PRINTER_ACCESS_ADMINISTER

, то работает без ошибок у пользователей
...
Рейтинг: 0 / 0
Мониторинг печати
    #39604116
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Петр,

так ты требуешь открыть управление принтера, административный функции

само собой, что не у всех пользователей есть права доменного админа
...
Рейтинг: 0 / 0
Мониторинг печати
    #39606343
Петр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возникла следующая проблема.
Как идентифицировать принтер?

Т.е. не просто по его имени в Windows, а что-то уникальное типа MAC-адреса.
Для чего нужно:
- имена принтеров в сети могут повторяться
- принтеры могут перемещаться с места на место.

Возможно ли это ? и если да то как?
...
Рейтинг: 0 / 0
Мониторинг печати
    #39607202
Петр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
up
...
Рейтинг: 0 / 0
Мониторинг печати
    #39607558
ART-CODE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Петр,
Если по каким-то причинам не удастя выведать это у WMI.
то можно и напрямую у принтера спросить:
Printer model information,
configuration, printer feature settings, and other printer
status information can be obtained using PJL
pjltkref.pdf
Берем в руки клиентский сокет, 1 шт. подключаемся им на порт 9100 и спрашиваем кто там сидит,
и что он о себе думает. Все это на языке PJL (если, конечно, принтер его понимает, что чаще всего так.)

А вообще, в свое время я писал прокси-принт сервер.
Все задания на печать от клиентов сначала летят на него, а он уже сам раздает их для настоящих принтеров.
Ну, и отслеживает успешность печати, заботится о сохранении очереди при сбоях,
логирует и сохраняет распечатанные документы в архив (для просмотра и повторной печати).
...
Рейтинг: 0 / 0
Мониторинг печати
    #39607562
Softologic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Топикстартеру: знаю лично автора данного ресурса (и софта, соответственно): http://printstore.ru. Человек на мониторинге печати стал сильным экспертом. ПО пишет на C#, но мало ли... Быть может будет нелишним проконсультироваться на форуме, может подскажет что: http://printstore.ru/forum/
...
Рейтинг: 0 / 0
Мониторинг печати
    #39607563
Softologic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В продолжение моего прошлого поста, ссылка на мониторинговое ПО: http://printstore.ru/snmpdiscovery/
...
Рейтинг: 0 / 0
Мониторинг печати
    #39607674
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
судя по названию - работает тольк ос продвинутыми сетевыми принтерами, в которых реализован протокол SNMP

а вот примитивный дешевый GDI-принтер как мониторить? ;-D
...
Рейтинг: 0 / 0
27 сообщений из 27, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Мониторинг печати
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]