day & night

Мониторинг печати в организации, Программирование
Дата обновления: , перейти к новому сообщению
#1
Anthony



профи!
Group Icon

Группа: Наши Люди
Сообщений: 799
Регистрация: 18.09.2004
Из: Москва
Пользователь №: 1.682


Респектов: 57
-----X----




Существует задача по сбору информации в организации о том кто сколько печатает.
Собственно есть два метода сбора информации:
а) Сбор информации непосредственно с принтеров
б) Сбор информации с компьютеров через WMI
* перехват заданий на печать сразу отмели
Выбран второй способ. Написана прога. Клиентская часть поставлена на компьютеры пользователей, которая отправляет информацию в определённую БД на SQL-сервер в сети.
Всё вроде хорошо, но.....
В сети несколько одинаковых принтеров. А идентификация идёт по наименованию (pPrinterName). HP LaserJet Pro M501n, к примеру. Как понять на какой именно принтер прошла печать?
Нужен какой-то уникальный параметр. Mac-адрес или имя хоста.
Параметры для сбора информации взяты отсюда:
хттп://msdn.microsoft.com/en-us/library/windows/desktop/dd162864(v=vs.85).aspx

Однако я не нашёл там ничего о mac-адресе или имени хоста.

Но и это не всё. Ведь у пользователей может стоять USB-принтер. А если таких принтеров много? HP P1005, к примеру. А если некоторые принтеры расшарены? Тут вообще непонятно есть ли у USB-принтеров какой-то уникальный идентификатор.

Сообщение отредактировал Anthony - 26.02.2018 - 14:49
User is offline
Go topGo end

Ответов(10 - 14)
5.03.2018 - 21:21
#11
kostya-chist



профи!
[SoftoRooMTeaM] Group Icon

Группа: Модераторы
Сообщений: 1.211
Регистрация: 20.04.2006
Из: Ростов Великий
Пользователь №: 152.532


Респектов: 192
-----X----




Цитата | Quote(Anthony @ 5.03.2018 - 18:26)
Средствами SNMP можно взять инфу, но для этого надо сперва знать IP-адрес.

В чём проблема получить IP адрес по имени принтера?
Если используется DHCP - запрос по имени выдаст IP, если статические адреса - значит нужна отдельная база, к которой программа сможет обращаться.
User is offline
Go topGo end
6.03.2018 - 12:48
#12
Anthony



профи!
Group Icon

Группа: Наши Люди
Сообщений: 799
Регистрация: 18.09.2004
Из: Москва
Пользователь №: 1.682


Респектов: 57
-----X----




Цитата | Quote(Henry723 @ 5.03.2018 - 20:21)
А присвоить постоянный IP адрес в качестве имени разве нельзя ?
*

Можно, только программа этого не делает. Это делает сисадмин.
А принцип программы заключается в том, чтобы собрать инфу вне зависимости от того если ли этот сисадмин или его нет. Я ж говорю... речь идёт не о конкретной сети, а о любой. В которой могут быть в теории разные принтеры с разными наименованиями или с одинаковыми. Где в наименовании порта может быть что угодно.

Цитата | Quote(kostya-chist @ 5.03.2018 - 21:44)
В чём проблема получить IP адрес по имени принтера?
Если используется DHCP - запрос по имени выдаст IP, если статические адреса - значит нужна отдельная база, к которой программа сможет обращаться.
*

Программа не знает логику сети. Есть там DHCP или нет, это не её дело.
Запрос по имени принтера для получения IP адреса - это здорово.
Но:
а) о каком имени принтера идёт речь? (выделено разными цветами)
Твой софтовый форум
б) программа делает запрос API по имени (синий цвет) и получает отказ разумеется.

Сообщение отредактировал Anthony - 6.03.2018 - 12:51
User is offline
Go topGo end
13.03.2018 - 18:49
#13
Anthony



профи!
Group Icon

Группа: Наши Люди
Сообщений: 799
Регистрация: 18.09.2004
Из: Москва
Пользователь №: 1.682


Респектов: 57
-----X----




Чтобы было понятнее... в PowerShell:
Code
# Collect port names and host addresses into hash table
$hostAddresses = @{}
Get-WmiObject Win32_TCPIPPrinterPort | ForEach-Object {
 $hostAddresses.Add($_.Name, $_.HostAddress)
}

Get-WmiObject Win32_Printer | ForEach-Object {
 New-Object PSObject -Property @{
   "Name" = $_.Name
   "DriverName" = $_.DriverName
   "HostAddress" = $hostAddresses[$_.PortName]
 }
}

Даёт мне
DriverName: HP LaserJet Pro MFP M521 PCL 6 (красным выделено)
Name: HP M521dn (синим выделено)
HostAddress: *пусто*
Твой софтовый форум

Code
get-wmiobject win32_printer |
ForEach-Object{ $port = $_.GetRelated('win32_tcpipprinterport').hostaddress
 $_ | Add-Member NoteProperty PortIPAddress $port -PassThru
}|
select Name, ShareName, PortIPAddress

даёт мне
Name: HP M521dn (тот же самый синим выделено)
ShareName: HP M521dn1 (это если я принтер расшарю)
PortIPAddress: *пусто*

Так вот какой мне код нужен чтобы из этого Win32_TCPIPPrinterPort выцепить эти PortIPAddress и HostAddress??

Сообщение отредактировал Anthony - 13.03.2018 - 18:50
User is offline
Go topGo end
icon1 13.03.2018 - 19:11
#14
Henry723



профи!
[SoftoRooMTeaM] Group Icon

Группа: СуперМодераторы
Сообщений: 29.347
Регистрация: 27.10.2005
Пользователь №: 59.366


Респектов: 7240
-----XXXXX




IP адрес присутствует на вкладке Порты на данном рисунке...
Их присваивает DHCP или он прописан статически...
В качестве основного признака там MAC адрес каждого принтера...
Если сделать постоянные IP адреса на каждом принтере и сохранить, то нужно просто доработать программу чтобы она брала IP адрес из вкладки Порты и потом находила нужный принтер по заранее сохраненной таблице...

Квалифицированному программисту по моему можно сделать легко...

Или я чего-то тупо не понимаю ?
User is offline
Go topGo end
14.03.2018 - 13:24
#15
Anthony



профи!
Group Icon

Группа: Наши Люди
Сообщений: 799
Регистрация: 18.09.2004
Из: Москва
Пользователь №: 1.682


Респектов: 57
-----X----




Цитата | Quote(Henry723 @ 13.03.2018 - 19:34)
IP адрес присутствует на вкладке Порты на данном рисунке...
Их присваивает DHCP или он прописан статически...
В качестве основного признака там MAC адрес каждого принтера...
Если сделать постоянные IP адреса на каждом принтере и сохранить, то нужно просто доработать программу чтобы она брала IP адрес из вкладки Порты и потом находила нужный принтер по заранее сохраненной таблице...

Квалифицированному программисту по моему можно сделать легко...

Или я чего-то тупо не понимаю ?
*


На вкладке "Порты" из поста #12 видно что там необязательно присутствует IP. Более того, в подавляющем большинстве случаев это норма. Все современные принтеры ставятся с фирменного ПО, которое прописывает в наименование порта что угодно, только не IP.

Программа рассчитана не на определённую сеть. А на любую.
Никто не будет ради одной программы резервировать IP адреса у принтеров, прописывать эти IP в наименования портов, составлять таблицы, добавлять их в программу и т.д.

Задумка такая..... даю всего один файлик для сети. Этот файл раскидывается по всем компам и прописывается в автозагрузку. Далее он создаёт процесс сбора информации с компа и передачу её на сервер SQL. Разумеется предварительно мне дают данные для этого SQL-сервера (Имя сервера, Имя БД, логин, пароль), эти данные вносятся в файл. Таким образом для каждой локальной сети свой уникальный файл.

Сообщение отредактировал Anthony - 14.03.2018 - 13:33
User is offline
Go topGo end

Topic Options
Сейчас: 29.03.2024 - 1:34
Мобильная версия | Lite версия