Как стать автором
Обновить

Комментарии 20

познавательно.
Только малая поправка «у Ricoh страницы были активными» — наверное «динамическими».
Спасибо. поправил.
НЛО прилетело и опубликовало эту надпись здесь
Пробовали. Тогда это, кажется, называлось как-то иначе.
Там все красиво и здорово, но нам не подошло по трем причинам:
— тогда там не было автоматического режима, оно не работало как сервис. нельзя было один раз настроить и забыть.
— оно показывало много интересного, но нельзя было выдавать данные куда то в стороннее приложение, «для анализу».
— у нас немалое количество не-НР принтеров, а хотелось чтобы решение было универсальное. Скрипт этому требованию полностью удовлетворил.
Посмотрел более внимательно. Либо это ПО сильно развилось за последние 3 года, либо мы тогда пробовали что-то другое.
Как бы сказали на одном известном ресурсе. Автор жжет, пиши еще.
Полезно читать про такие мелочи.
По опыту предполагаю, что скоро появится следующий запрос от печатников — статистика по тому: кто, что и когда печатал. И вот тут так просто вопрос не закрыть :(
Это бывает. И в принципе все можно вытащить из логов Windows (традиционно принтера подключены через принт-сервера, т.е. есть единая точка сбора логов).
Но автоматизированного способа предложить не могу, т.к. на моем веку это было от силы несколько раз и каждый раз делалось тупо вручную: вытаскивались логи, загонялись в Excel, парсились на предмет нужного пользователя и т.д.
Наверняка есть всевозможный платный софт который эту задачу решает. На то он и платный софт.
с единой точкой сбора логов и snmp не нужно.
В этих логах не учитывается количество копий. Послал на печать 10 страниц, указав три копии, в логах будет 10 страниц. Так что через snmp информация более правильная поступает. А что, кто, когда печатал, так некоторые принтеры это тоже могут сказать.
именно. потмучто руководство, которое не просто собирает, а уже анализирует,
тутже решит расписывать затраты на бумагу по подразделениям пропорционально расходу.

и весь SNMP снова уходит в историю.
А как насчет сбора сразу в CSV file? Тоже по дефолту открывается экселем — и при этом пропускается этап макроса :)
макрос чуть более красиво все раскладывает, нежели «сбор в CSV».
Плюс я же писал -от меня требовалось выдать данные, а «анализировать» они хотели сами. Если хотите объединить все в один скрипт — велкам!
У меня ситуция другая. Принтеры все сетевые, но установлены на одном сервере, а пользователям шарятся как сетевой ресурс, причем насовываются политикой. То есть печатают все через один сервер.

Возникала задача подсчитать не просто сколько печатают. а кто именно сколько печатает. В решении этой задачи SNMP не поможет, по крайней мере не очень представляю как.

В итоге воспользовался тем, что Windows Server каждый чих — пишет в лог. Вообще связка PowerShell + EventLog дает очень много возможностей разных по сбору статичтики и агрегации информации.
Далее приведу скриптик, который агрегирует информацию из системного лога сервера печати и строит статистику по пользователям. Если таких серверов больше одного, то не фокус модифицировать скрипт, для сбора логов с нескольких серверов. Также можно агрегировать логи еще и с машин пользователей, но Spooler на десктопных версиях Window по-умолчанию использует более низкий уровень логирования и не пишет в лог события удачной распечатки. Повысить его можно насунув политикой некий ключ реестра (не помню какой именно за давностью, но легко нагуглить).

Сразу оговорюсь. Глубоко в Powershell не лазил, так что может можно и красивее реализовать. Делал как знаю или как догадался сам.

-------------------------------------------------------------------------------------
$tm1 = get-date 6:00 #ставим дату на 6:00 сегодня
$ev = Get-EventLog -ComputerName servername -LogName System -Source Print -InstanceId 1073741834 -after $tm1
$typedef = "public struct userCntr {public string usr; public int cnt;}" #Описываем структуру
Add-Type -TypeDefinition $typedef #создаем тип по описанию

$buf1 = New-Object userCntr;
$buf2 = New-Object userCntr;

$allusers = $buf1,$buf2 #не нашел более простого способа создать массив объектов. Лень было разбираться, как конструктор кастомный написать. Проще потом отфильтровать две пустые записи в начале массива, которые возникнут при таком его создании. Они никак не мешеют, только глаза мазолят

foreach ($el in $ev)
{
$buf3 = New-Object userCntr;
$buf3.usr = $el.replacementstrings[2];
$buf3.cnt = $el.replacementstrings[6];
$mrk = 0
for ($i=0; $i -lt $allusers.Length; $i++)
{
if ($allusers[$i].usr -eq $buf3.usr) {$allusers[$i].cnt += $buf3.cnt; $mrk = 1}
}
if ($mrk -ne 1) {$allusers += $buf3} else {$mrk = 0}
}
$allusers | ? {$_.usr -ne $buf1.usr} > ("C:\PrintStat\" + (get-date -UFormat "%d-%m-%Y") + ".txt") #фильтр нужен, чтобы убрать первые две пустые записи, которые возникают при создании массива объектов

-------------------------------------------------------------------------------------


Если запускать скрипт на машине, на которой установлены расширения PowerShell для работы с AD, то можно еще по логинам и имена из AD выдергивать (Get-ADUser user1).name
Выше говорили, что логи Windows не учитывают количество копий. т.е. если вы пошлете один документ на 1 страницу, в количестве 1000 копий, то Windows в лог запишет что был послан один документ на 1 страницу, и не запишет что на самом деле было потреблено 1000 страниц.
У вас это учитывается?
Нет. не думал об этом, если честно. Просто другого способа посчитать кто сколько печатал я не нашел. А про количество копий — не подумал вообще, если честно.
Подскажите, скрипт вываливается с
Cannot index into a null array.
At line:14 char:36
+ $buf3.usr = $el.replacementstrings[ <<<< 2];
+ CategoryInfo : InvalidOperation: (2:Int32) [], RuntimeException
+ FullyQualifiedErrorId : NullArray

что делаю не так?
ошибка возникает потому, что в переменную $ev не загружено ни одного события.
Вариянтов два. Либо не верно указано имя сервера(компьютера) с которого нужно получть eventLog.
Либо нет ни одного нужного события. Если целевая ОС — не серверная. Нужно повышать уровень логирования. События успешной печати по-умолчанию включены только в серверных ОС-ях.

Попробуйте просто вывести список событий:

$tm1 = get-date 6:00 #ставим дату на 6:00 сегодня
Get-EventLog -ComputerName servername -LogName System -Source Print -InstanceId 1073741834 -after $tm1


Скорее всего он будет пуст. Если будет пуст, попробуйте убрать ключ -after, чтобы вывести все.

Я тестил на WinServ2003R2 и 2008R2, работает. Когда выклдывал сам скрипт — немного его отредактировал (привел в божеский вид), но проверил перед тем как выкладывать.

Делал подобное. Только в компании на тот момент уже стояла система мониторинга — Zabbix, про который не раз уже писали на Хабре. Так что принтеры по SNMP опрашивались раз в час занося данные не только о напечатанных страницах, но и количестве оставшегося тонера и т.д. (что например удобно для понимаю когда нужно менять картридж). Потом можно посмотреть графики в Zabbix-е и построить интересную статистику. У нас например больше всего печатали менеджеры и причем утром после прихода на работу (видимо договора для тех, кому вчера не отправили или договорились вечером) и ближе к вечеру. А по оставшемуся количеству тонера можно понять с какой периодичностью необходимо заказывать картриджи, чтобы они всегда были в наличии, но не захламляли склад.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории