Комментарии 20
познавательно.
Только малая поправка «у Ricoh страницы были активными» — наверное «динамическими».
Только малая поправка «у Ricoh страницы были активными» — наверное «динамическими».
Не пробовали применять HP Web Jetadmin?
Пробовали. Тогда это, кажется, называлось как-то иначе.
Там все красиво и здорово, но нам не подошло по трем причинам:
— тогда там не было автоматического режима, оно не работало как сервис. нельзя было один раз настроить и забыть.
— оно показывало много интересного, но нельзя было выдавать данные куда то в стороннее приложение, «для анализу».
— у нас немалое количество не-НР принтеров, а хотелось чтобы решение было универсальное. Скрипт этому требованию полностью удовлетворил.
Там все красиво и здорово, но нам не подошло по трем причинам:
— тогда там не было автоматического режима, оно не работало как сервис. нельзя было один раз настроить и забыть.
— оно показывало много интересного, но нельзя было выдавать данные куда то в стороннее приложение, «для анализу».
— у нас немалое количество не-НР принтеров, а хотелось чтобы решение было универсальное. Скрипт этому требованию полностью удовлетворил.
Посмотрел более внимательно. Либо это ПО сильно развилось за последние 3 года, либо мы тогда пробовали что-то другое.
Как бы сказали на одном известном ресурсе. Автор жжет, пиши еще.
Полезно читать про такие мелочи.
Полезно читать про такие мелочи.
По опыту предполагаю, что скоро появится следующий запрос от печатников — статистика по тому: кто, что и когда печатал. И вот тут так просто вопрос не закрыть :(
Это бывает. И в принципе все можно вытащить из логов Windows (традиционно принтера подключены через принт-сервера, т.е. есть единая точка сбора логов).
Но автоматизированного способа предложить не могу, т.к. на моем веку это было от силы несколько раз и каждый раз делалось тупо вручную: вытаскивались логи, загонялись в Excel, парсились на предмет нужного пользователя и т.д.
Наверняка есть всевозможный платный софт который эту задачу решает. На то он и платный софт.
Но автоматизированного способа предложить не могу, т.к. на моем веку это было от силы несколько раз и каждый раз делалось тупо вручную: вытаскивались логи, загонялись в Excel, парсились на предмет нужного пользователя и т.д.
Наверняка есть всевозможный платный софт который эту задачу решает. На то он и платный софт.
именно. потмучто руководство, которое не просто собирает, а уже анализирует,
тутже решит расписывать затраты на бумагу по подразделениям пропорционально расходу.
и весь SNMP снова уходит в историю.
тутже решит расписывать затраты на бумагу по подразделениям пропорционально расходу.
и весь SNMP снова уходит в историю.
А как насчет сбора сразу в CSV file? Тоже по дефолту открывается экселем — и при этом пропускается этап макроса :)
У меня ситуция другая. Принтеры все сетевые, но установлены на одном сервере, а пользователям шарятся как сетевой ресурс, причем насовываются политикой. То есть печатают все через один сервер.
Возникала задача подсчитать не просто сколько печатают. а кто именно сколько печатает. В решении этой задачи SNMP не поможет, по крайней мере не очень представляю как.
В итоге воспользовался тем, что Windows Server каждый чих — пишет в лог. Вообще связка PowerShell + EventLog дает очень много возможностей разных по сбору статичтики и агрегации информации.
Далее приведу скриптик, который агрегирует информацию из системного лога сервера печати и строит статистику по пользователям. Если таких серверов больше одного, то не фокус модифицировать скрипт, для сбора логов с нескольких серверов. Также можно агрегировать логи еще и с машин пользователей, но Spooler на десктопных версиях Window по-умолчанию использует более низкий уровень логирования и не пишет в лог события удачной распечатки. Повысить его можно насунув политикой некий ключ реестра (не помню какой именно за давностью, но легко нагуглить).
Сразу оговорюсь. Глубоко в Powershell не лазил, так что может можно и красивее реализовать. Делал как знаю или как догадался сам.
Если запускать скрипт на машине, на которой установлены расширения PowerShell для работы с AD, то можно еще по логинам и имена из AD выдергивать (Get-ADUser user1).name
Возникала задача подсчитать не просто сколько печатают. а кто именно сколько печатает. В решении этой задачи 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.
Либо нет ни одного нужного события. Если целевая ОС — не серверная. Нужно повышать уровень логирования. События успешной печати по-умолчанию включены только в серверных ОС-ях.
Попробуйте просто вывести список событий:
Скорее всего он будет пуст. Если будет пуст, попробуйте убрать ключ -after, чтобы вывести все.
Я тестил на WinServ2003R2 и 2008R2, работает. Когда выклдывал сам скрипт — немного его отредактировал (привел в божеский вид), но проверил перед тем как выкладывать.
Вариянтов два. Либо не верно указано имя сервера(компьютера) с которого нужно получть 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-е и построить интересную статистику. У нас например больше всего печатали менеджеры и причем утром после прихода на работу (видимо договора для тех, кому вчера не отправили или договорились вечером) и ближе к вечеру. А по оставшемуся количеству тонера можно понять с какой периодичностью необходимо заказывать картриджи, чтобы они всегда были в наличии, но не захламляли склад.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Опытные мелочи-6, или «Учет и контроль печатника Ивана Федорова»