( Вход | Регистрация | Поиск )

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

·Anthony
Группа: Наши Люди

Сообщений: 799
Существует задача по сбору информации в организации о том кто сколько печатает.
Собственно есть два метода сбора информации:
а) Сбор информации непосредственно с принтеров
б) Сбор информации с компьютеров через 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 - 15:29


--------------------
Нас дни ужасные догнали.
И в ужасе предсмертных мук
Мы всю ужасность осознали,
Что ужас всюду, он вокруг!...


Ответов(10 - 14)

·kostya-chist
Группа: Дружинники

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

В чём проблема получить IP адрес по имени принтера?
Если используется DHCP - запрос по имени выдаст IP, если статические адреса - значит нужна отдельная база, к которой программа сможет обращаться.


--------------------
Что-то с памятью моей стало, 128 МБ мало ...


·Anthony
Группа: Наши Люди

Сообщений: 799
Цитата | 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 - 13:31


--------------------
Нас дни ужасные догнали.
И в ужасе предсмертных мук
Мы всю ужасность осознали,
Что ужас всюду, он вокруг!...


·Anthony
Группа: Наши Люди

Сообщений: 799
Чтобы было понятнее... в 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 - 19:30


--------------------
Нас дни ужасные догнали.
И в ужасе предсмертных мук
Мы всю ужасность осознали,
Что ужас всюду, он вокруг!...


Henry723
Группа: Модераторы

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

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

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


--------------------
Вам кофе в постель ? - Нет, лучше в чашку...


·Anthony
Группа: Наши Люди

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

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

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


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

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

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

Сообщение отредактировал Anthony - 14.03.2018 - 14:13


--------------------
Нас дни ужасные догнали.
И в ужасе предсмертных мук
Мы всю ужасность осознали,
Что ужас всюду, он вокруг!...