В этой статье, я покажу, как я реализовал сбор информации по сетевым принтерам. Главная задача, которая передо мной стояла, это мониторинг отпечатанных страниц.
Для решения этой задачи, я решил написать VBS скрипт, который будет обращаться к сетевым принтерам, например, с периодичностью 30мин, снимать показания счетчиков по протоколу SNMP, и записывать в MS SQL базу. Если быть точнее, то скрипт будет использовать стороннюю консольную программа, которую он будет запускать, и получать из нее данные по счетчикам принтеров. Отчет будет выводиться в сводную таблицу Excel.
Пример сводной таблице в Excel:
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 98 99 100 101 102 103 104 |
Set WshShell = CreateObject("WScript.Shell") Set objFSO = CreateObject("Scripting.FileSystemObject") Dim mas_text_ip() Dim printer_mas(5)'Массив:Счетчик, Название, Сер. номер, ip, Отдел, Предприятие Dim company,file_m ReDim mas_text_ip(1,0) printer_txt = "ip_printers.txt" Set file = objFSO.OpenTextFile(printer_txt,1,False) j=0 Do While (file.AtEndOfStream = false) file_m=file.ReadLine() if(Mid(file_m,1,5) = "10.99") Then file_m = Split(file_m,";") oid_zapros() 'ReDim Preserve mas_text_ip(1,j) Else if file_m <> "" Then company = file_m End If Loop '****************** 'OID Count HP,Canon,Samsung 'oid_c = "1.3.6.1.2.1.43.10.2.1.4.1.1" ' 'OID Name HP,Canon,Samsung 'oid_n = ".1.3.6.1.2.1.25.3.2.1.3.1" 'OID Serial HP,Canon,Samsung 'oid_s = ".1.3.6.1.2.1.43.5.1.1.17.1" '****************** Sub oid_zapros() Dim oid oid = Array("1.3.6.1.2.1.43.10.2.1.4.1.1",".1.3.6.1.2.1.25.3.2.1.3.1",".1.3.6.1.2.1.43.5.1.1.17.1") Dim startSnmp For n=0 To 2 startSnmp = "SnmpGet.exe -r:" & file_m(0) & " -t:20 -c:public" & " -o:" & oid(n) Set snmpExec = WshShell.Exec(startSnmp) snmpget = snmpExec.StdOut.ReadAll If InStr(snmpget, "Value=") > 0 Then getSplit = Split(snmpget, "Value=") value = Replace(Trim(getSplit(1)), Chr(34), "") Else value="" End If printer_mas(n)=value Next printer_mas(n)=file_m(0)'Записываем ip printer_mas(n+1)=file_m(1) printer_mas(n+2)=company If (IsNumeric(printer_mas(0)) And printer_mas(1)<>"") Then 'Если есть показания счетчика и определена модель принтера zapis_bd() 'Записываем в БД End If End Sub 'Записываем в БД Sub zapis_bd() 'Для записи/чтения БД MSSQL Dim pages_count,pages_schet, ser pages_count=-1 Set con = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") Set rs_r = CreateObject("ADODB.Recordset") con.Open "Provider=SQLOLEDB;User ID=snmp;Password=123456;Initial Catalog=snmp;Data Source=server01" 'Читаем последние показания счетчика, вычитаем - определяем кол-во страниц zapros="select top 1 schet from snmp where ip='" & printer_mas(3) & "' order by data desc" rs_r.Open zapros, con if rs_r.BOF=false Then 'Если есть записи в БД pages_schet = rs_r.GetString pages_count = printer_mas(0)-pages_schet End If rs_r.Close 'Иногда серийный номер не определяется, тогда запись в базу происходит без сер. номера, что портит отображение статистики в сводной табл. Поэтому, если раньше номер опр-ся, мы запишем предыдущий сер. номер 'Получаем последний серийный номер zapros_serial="select top 1 serial from snmp where ip='" & printer_mas(3) & "' and serial<>'' order by data desc" rs_r.Open zapros_serial, con if (rs_r.BOF=false And printer_mas(2)="") Then 'Если есть записи в БД pages_count=0 'Отменяю запись в БД End if zapros="SELECT ip,name,serial,schet,otdel,data,company,pages FROM dbo.snmp" 'Записываем в базу rs.CursorType = 1 rs.LockType = 3 If pages_count<>0 Then rs.Open zapros, con if IsNumeric(printer_mas(0)) Then'Если есть показания счетчика rs.AddNew rs.Fields("ip") = printer_mas(3) rs.Fields("name") = printer_mas(1) rs.Fields("serial") = printer_mas(2) rs.Fields("schet") = printer_mas(0) rs.Fields("data") = Now() rs.Fields("otdel") = printer_mas(4) rs.Fields("company") = printer_mas(5) rs.Fields("pages") = pages_count rs.Update End If End If End Sub |
Список принтеров хранится в файле ip_printers.txt, его структура следующая:
ip_printers.txt
Название предприятия
192.168.0.50; Отдел1
192.168.0.51; Отдел2
192.168.0.52; Отдел3
192.168.0.53; Отдел4
Для получения показания счетчиков используем программу [wpfilebase tag=fileurl id=6 linktext=’ SnmpGet’ /]
Следующим этапом, создаем базу в MS SQL, привожу запрос, для создания БД:
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 |
USE [snmp] GO /****** Object: Table [dbo].[snmp] Script Date: 10:54:30 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[snmp]( [ip] [char](15) NOT NULL, [name] [varchar](max) NULL, [serial] [varchar](max) NULL, [schet] [int] NOT NULL, [otdel] [varchar](max) NULL, [id] [int] IDENTITY(1,1) NOT NULL, [data] [datetime] NULL, [company] [varchar](max) NULL, [pages] [int] NULL, PRIMARY KEY CLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO SET ANSI_PADDING OFF GO |
Приведу свой вариант запроса сводной таблицы Exel, к MS SQL
1 2 3 |
select ip,serial,name as 'Принтер', schet as 'Счетчик', pages as 'Кол-во страниц',otdel as 'Отдел',company as 'Предприятие',YEAR(data) as 'Год', day(data) as 'День', case when MONTH(data)='1' Then 'Январь' when MONTH(data)='2' Then 'Февраль' when MONTH(data)='3' Then 'Март' when MONTH(data)='4' Then 'Апрель' when MONTH(data)='5' Then 'Май' when MONTH(data)='6' Then 'Июнь' when MONTH(data)='7' Then 'Июль' when MONTH(data)='8' Then 'Август' when MONTH(data)='9' Then 'Сентябрь' when MONTH(data)='10' Then 'Октябрь' when MONTH(data)='11' Then 'Ноябрь' when MONTH(data)='12' Then 'Декабрь' end as 'Месяц' from snmp where pages>0 |