Автоматическое подключение сетевых МФУ с возможностью сканирования [Часть 1] / Habr
Я думаю, многим системным администраторам известны описанные в заголовке мфу, отличаются они, в первую очередь, не очень удобной установкой и от этого имеют дурную славу. Однажды, копируя на очередной компьютер сквозь узкий канал пакет fullsolution для мфу весом около 300 мегабайт, идея разобрать этот инсталлятор и автоматизировать установку вылезла попапом на глаза — работу пришлось приостановить.
Разбором драйвера я занимался уже около полутора лет назад, в то время интернет на эту тему был совершенно пуст. Сейчас быстро погуглил по теперь уже известным мне ключевым словам утилит и нашел немного разрозненной информации. Несмотря на это, я решил. что собранная в одно место информация все равно не помешает, при том, что в этом посте она более полная.
Настроим печать
Первым на запрос по snmp показался мфу HP LaserJet 1536, с него и решил начать. Для начала нужно понять. как его подключать как принтер под Windows 7; пожилую XP отбросил сразу, свежую Windows 8 в домене, есть мнение, мне не увидеть никогда. Вот и повод познакомиться с новым для себя PowerShell, подумал я, который в итоге был чуть ли не основной мотивацией в разборе драйвера. Подключение ip-принтера в Windows 7 состоит из трех этапов (в Windows 8 всё сильно упрощается встроенными командлетами, но про нее я уже говорил — не судьба), сначала создаем ip-порт, потом добавляем драйвер и подключаем, собственно, принтер. Для всех этих этапов в Windows есть уже готовые VBS скрипты, многим, я думаю, знакомые, в Windows 7 путь к ним: С:\Windows\System32\Printing_Admin_Scripts\
cscript C:\Windows\System32\Printing_Admin_Scripts\ru-RU\prnport.vbs -a -r "192.168.0.30" -h "192.168.0.30" -o RAW -n 9100
Добавление драйвера:cscript C:\Windows\System32\Printing_Admin_Scripts\ru-RU\prndrvr.vbs -a -m "HP LaserJet M1530 MFP Series PCL 6" -e "Windows NT x86" -h "C:\drivers\1536\"-i "C:\drivers\1536\hpc1530c.inf"
Тут стоит отметить одну важную особенность: имя принтера должно указываться точно так же как оно прописано в inf файле драйвера, ради примера уберите часть имени, скрипт выдаст ошибку: «Не удалось добавить драйвер принтера HP LaserJet Код ошибки Win32 87».
Отрывок файла драйвера с полным именем принтера:
Теперь осталось подключить принтер, для этого я остановился на замечательной программе printui, советую посмотреть на нее поближе, у нее есть интересные ключи.
&rundll32 printui.dll,PrintUIEntry /if /b "HP LaserJet M1530 MFP Series PCL 6" /r "192.168.0.30" /m "HP LaserJet M1530 MFP Series PCL 6" /u /K /q /Gw
Пришло время оформить все это в примерно следующего вида скрипт на PowerShell:
function Add-PrinterPort ($printersource) {
cscript C:\Windows\System32\Printing_Admin_Scripts\ru-RU\prnport.vbs `
-a -r $printersource -h $printersource -o RAW -n 9100 | Out-Null
}
function Add-PrinterDriver ($printername, $driverpath) {
$folder = Split-Path $driverPath
cscript C:\Windows\System32\Printing_Admin_Scripts\ru-RU\prndrvr.vbs `
-a -m $printername -e Get-Platform -h $folder -i $driverpath
}
function Get-Platform {
if ([System.Environment]::Is64BitOperatingSystem) {
"Windows x64"
} else {
"Windows NT x86"
}
}
Add-Type -As Microsoft.VisualBasic
$printerSource = [Microsoft.VisualBasic.Interaction]::InputBox("Укажите IP адрес принтера.")
if ($printerSource -match "^192\.168\.0\.[0-9]{1,3}$") {
$printername = "HP LaserJet M1530 MFP Series PCL 6"
$driverpath = "C:\drivers\1536\hpc1530c.inf"
Add-PrinterPort $printersource
Add-PrinterDriver $printername $driverpath
# знак & перед командой переключит режим и паремтры не сломаются
&rundll32 printui.dll,PrintUIEntry /if /b $printername /r $printersource /m $printername /u /K /q /Gw
Start-Sleep -Seconds 10
}
Сканирование
Копаясь в inf файлах драйвера, для поиска правильного имени принтера и попутно вообще разбираясь в структуре драйвера HP, глаз зацепился за следующие строки (выделил жирным):
;Windows Vista
[HP.NT.6.0]
«HP LJ M1530 MFP Series Scan»= WIA_1530_Inst.NT.6.0, USB\vid_03f0&pid_012a&mi_00
«HP LJ M1530 MFP Series Scan»= WIA_1530_NW.NT.6.0,vid_03f0&pid_012a&IP_SCAN;Windows Vista 64
[HP.NTAMD64.6.0]
«HP LJ M1530 MFP Series Scan»= WIA_1530_Inst_Vista64, USB\vid_03f0&pid_012a&mi_00
«HP LJ M1530 MFP Series Scan»= WIA_1530_NW_Vista64,vid_03f0&pid_012a&IP_SCAN
Тут бы хотелось лирики (казалось бы, при чем тут 1С? если вы понимаете о чём я), но опущусь до сухой констатации: попробуем devcon.exe.
DevCon — это программа с интерфейсом командной строки, которая используется в качестве альтернативы диспетчеру устройств С ее помощью можно включать, выключать, перезапускать, обновлять, удалять и опрашивать отдельные устройства или группы устройств. Программа DevCon также предоставляет необходимые разработчику драйвера сведения, которые недоступны с помощью диспетчера устройств.support.microsoft.com/kb/311272/ru
Добавляем устройство по ID указав драйвер:
.\devcon.exe /r install C:\drivers\1536scan\hppasc16.inf "vid_03f0&pid_012a&IP_SCAN"
Добавляем в реестр необходимые параметры, запускаем сканирование и… Бинго!
Сканер отлично работает, осталось все это оформить.
Настройки сканера в реестре хранятся по следующим путям:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{6BDD1FC6-810F-11D0-BEC7-08002BE2092F}
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root\IMAGE
Опытным путём определяем необходимые нам ключи реестра:
Для того что бы удобно добавить настройки реестра, создадим процитированный ниже файл, который послужит нам шаблоном для модификации внутри скрипта.
Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{6BDD1FC6-810F-11D0-BEC7-08002BE2092F}\_ITEM_\DeviceData]
«NetworkDeviceID»=»\\hostname:_NETWORK_NAME_.domain.local\\ipaddr:_IP_ADDRESS_\\guid:\\macaddr:_MAC_ADDRESS_\\port:1″
«PortID»=»_IP_ADDRESS_»
«NetworkHostName»=»_NETWORK_NAME_.domain.local»
«TulipIOType»=dword:00000005[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root\IMAGE\_ITEM_\Device Parameters]
«NetworkDeviceID»=»\\hostname:_NETWORK_NAME_.domain.local\\ipaddr:_IP_ADDRESS_\\guid:\\macaddr:_MAC_ADDRESS_\\port:1″
«PortID»=»_IP_ADDRESS_»
«NetworkHostName»=»_NETWORK_NAME_.domain.local»
«MAC»=»_MAC_ADDRESS_»
«PortNumber»=«1»
«Index»=»_ITEM_»
Готовый скрипт установки сканера примет следующий вид:
$IP_ADDRESS = "192.168.0.30" $MAC_ADDRESS = "001b00b2cc00" $NETWORK_NAME = "NPI3CPOF7" $source = "C:\drivers\1536scan" $dest = Join-Path (Get-Location).path "\temporary" Copy-Item $source $dest -Recurse -Force $dest = Join-Path $dest "\hppasc16.inf" # devcon лежит в одной директории со скриптом & .\devcon.exe /r install $dest "vid_03f0&pid_012a&IP_SCAN" $item = Get-ChildItem HKLM:\SYSTEM\CurrentControlSet\Control\Class\"{6BDD1FC6-810F-11D0-BEC7-08002BE2092F}" | Select-Object -Last 1 $item = $item.Substring($item.Length-4, 4) $pattern = ".\temporary\1536.reg" $result = ".\temporary\res.reg" Get-Content $pattern | ForEach-Object { $_ -replace "_IP_ADDRESS_", $IP_ADDRESS ` -replace "_MAC_ADDRESS_", $MAC_ADDRESS ` -replace "_NETWORK_NAME_", $NETWORK_NAME ` -replace "_ITEM_", $item } | Set-Content $result & regedit /s .\temporary\res.reg
Потираем руки, проверяем — работает, модифицируем под 1522 — работает, победно правим под 3055 — облом…
Сканер не дает выбрать планшет, в меню сканирования доступен только податчик, да и тот отказывается сканировать.
Серьезный разговор с 3055 или, Чувак ты поднял на гору не тот камень
Вот он, LaserJet 3055/3052 — самый вредный парень, на удивление вижу я его чаще всех. На самом деле — скажу по секрету — я начал заниматься им первым — пошел через дебри фильтрации вывода procmon при установке драйвера для поиска чего-нибудь интересного и утонул где-то посередине. Когда очередной раз procmon упал из-за нехватки памяти, я решил отложить эту затею до более дружелюбного и спокойного состояния.
Второй набег на разбор установщика МФУ дал результат: спустя часа полтора разбора логов в недрах вывода установщика была найдена жемчужина — hppniscan01.exe
Запуск с необходимыми параметрами моментально установил сканер в устройства и прописал необходимые ветки реестра:hppniscan01.exe -f "hppasc16.inf" -m "vid_03f0&pid_012a&IP_SCAN" -a "192.168.0.30" -n 1
В дистрибутивах драйверов других принтеров HP есть ее шестидесяти четырех разрядная версия, драйвер 3055 же поддерживает только x86 операционные системы.
Драйвера сканера я решил выдернуть из общей папки драйверов и сложить отдельно, необходимые файлы легко читаются из inf-файла драйвера. Дерево получилось следующего вида:
C:\Drivers\Scanners\ip\3055scan\hpgtpusd.dll
C:\Drivers\Scanners\ip\3055scan\hppasc01.cat
C:\Drivers\Scanners\ip\3055scan\hppasc01.dll
C:\Drivers\Scanners\ip\3055scan\hppasc01.inf
C:\Drivers\Scanners\ip\3055scan\hppniscan01.exe
C:\Drivers\Scanners\ip\3055scan\hpptpml3.dll
C:\Drivers\Scanners\ip\3055scan\hpxp3390.dll
C:\Drivers\Scanners\ip\3055scan\Drivers\dot4C:\Drivers\Scanners\ip\3055scan\Drivers\dot4\Win2000\hpzidr12.dll
C:\Drivers\Scanners\ip\3055scan\Drivers\dot4\Win2000\hpzipm12.dll
C:\Drivers\Scanners\ip\3055scan\Drivers\dot4\Win2000\hpzipr12.dll
C:\Drivers\Scanners\ip\3055scan\Drivers\dot4\Win2000\hpzipr12.sys
Функция установки сканера теперь стала совсем простой, хоть и с зависимостью от внешней компоненты.
Итоговый вид скрипта, с некоторыми захардкоженными упрощениями, примет следующий вид:
function Add-PrinterPort ($printerSource) {
&cscript C:\Windows\System32\Printing_Admin_Scripts\ru-RU\prnport.vbs `
-a -r $printerSource -h $printerSource -o RAW -n 9100 | Out-Null
}
function Add-PrinterDriver ($printerName, $driverPath) {
$folder = Split-Path $driverPath
&cscript C:\Windows\System32\Printing_Admin_Scripts\ru-RU\prndrvr.vbs `
-a -m $printerName -e Get-Platform -h $folder -i $driverPath
}
function Get-Platform {
if ([System.Environment]::Is64BitOperatingSystem) {
"Windows x64"
} else {
"Windows NT x86"
}
}
function Add-Scanner ($ipaddress, $printername) {
switch -regex ($printername) {
# добавить других мфу по вкусу
"1530" {
Push-Location 'C:\Drivers\Scanners\ip\1536scan\'
if ($(Get-Platform) -eq "Windows x64") {
.\hppniscan64.exe -f "hppasc16.inf" -m "vid_03f0&pid_012a&IP_SCAN" -a $ipaddress -n 1
} else {
.\hppniscan01.exe -f "hppasc16.inf" -m "vid_03f0&pid_012a&IP_SCAN" -a $ipaddress -n 1
}
Pop-Location
}
"(305\d)|(3390)" {
Push-Location 'C:\Drivers\Scanners\ip\3055scan\'
switch -regex ($printername) {
"3050" {
.\hppniscan01.exe -f "hppasc01.inf" -m "vid_03f0&pid_3217&IP_SCAN" -a $ipaddress -n 1
}
"3052" {
.\hppniscan01.exe -f "hppasc01.inf" -m "vid_03f0&pid_3317&IP_SCAN" -a $ipaddress -n 1
}
"3055" {
.\hppniscan01.exe -f "hppasc01.inf" -m "vid_03f0&pid_3417&IP_SCAN" -a $ipaddress -n 1
}
"3390" {
.\hppniscan01.exe -f "hppasc01.inf" -m "vid_03f0&pid_3517&IP_SCAN" -a $ipaddress -n 1
}
}
Pop-Location
}
}
}
Add-Type -As Microsoft.VisualBasic
$printerSource = [Microsoft.VisualBasic.Interaction]::InputBox("Укажите IP адрес принтера.")
if ($printersource -match "^192\.168\.0\.[0-9]{1,3}$") {
$printername = "HP LaserJet M1530 MFP Series PCL 6"
$driverpath = "C:\drivers\1536\hpc1530c.inf"
Add-PrinterPort $printersource
Add-PrinterDriver $printername $driverPath
# знак & перед коммандой переключит режим и параметры не сломаются
&rundll32 printui.dll,PrintUIEntry /if /b $printername /r $printersource /m $printername /u /K /q /Gw
Start-Sleep -Seconds 10
Add-Scanner $printersource $printername
}
Этот же способ отлично подходит для всех оказавшихся вокруг меня МФУ от HP, для которых я создал отдельные папки с драйверами и варианты выбора в свитче функции установки сканера.
Список файлов драйвера можно посмотреть в разделах inf-файла с именами [SourceDisksFiles], [RegisterDlls], [WIA_CopyFiles] и далее по файлу. Скриншот по драйверам 3055 и 1536, для наглядности:
Из описанных в этой заметке отрывков кода можно собрать полноценный скрипт автоматической установки МФУ, а если добавить в него немного гуя и snmp, то можно вообще навсегда закрыть для себя тему установки МФУ на новые машины.
На этом на сегодня всё, спасибо за внимание. Если в комментариях подскажут чего не хватает МФУ 3055 для работы при установке первым способом посредством devcon, буду сильно благодарен. Может быть кто-то проделал ту же работу, что и я, но добился больших успехов.
В следующей части, если кто-то кинет таки инвайт в песочницу, покажу как расширить наш сценарий для работы с МФУ Xerox и Kyocera.
Как настроить общий доступ к сканеру в локальной сети
Привет друзья! В прошлой статье «Локальная сеть между компьютером с Windows 7 и Windows 10» мы с Вами настроили общий доступ к принтеру со всех компьютеров, входящих в локальную сеть, но согласитесь, в жизни всё бывает и иногда присутствует необходимость использовать и удалённый сканер.В сегодняшней статье мы подключим к компьютеру с Windows 7 сканер HP Scanjet g2410, который будем использовать для сканирования документов по сети. Для осуществления задуманного нам понадобится две программы: Blind Scanner и XnView. Итак, поехали.
Как настроить общий доступ к сканеру в локальной сети
Наш сканер на компьютере с Windows 7Схема локальной сети будет следующаяПолучать удаленный доступ к сканеру будем используя программу Blind Scanner. Переходим по адресу www.blindscanner.com/ru/download.html и скачиваем к примеру Blind Scanner ProСкачанный установочный файлПроизводим установку. Запускаем установочный файл. ДалееПринимаем лицензионное соглашение
Оставляем по умолчанию. Далее
Так как мы будем управлять удаленным сканером с компьютера с Windows 10, выбираем BlindScanner Pro TWAIN-драйвер (Клиент)
УстановитьЗавершитьДля сканирования нам понадобится программа с функцией сканирования, например XnView. Переходим по адресу http://www.xnview.com/en/xnview/#downloads и скачиваем ееУстановочный файл программы XnView. Запускаем его и производим установкуNextПринимаем лицензионное соглашениеNext Оставляем по умолчанию. Далее
УстановитьУстановка завершенаПереходим на компьютер с Windows 7 и таким же образом (как и на Windows 8), устанавливаем на него программу BlindScanner Pro.
Так как наш сканер физически подключен к компьютеру с Windows 7, в данном окне выбираем BlindScanner Pro серверДалее
УстановитьЗавершитьЯрлык программы BlindScannerЗапускаем программу, выбираем наш сканер HP Scanjet G2410 TWAIN (сканер программа определяет автоматически), режим запуска выбираем Приложение и нажимаем СтартПриложение запущеноПереходим на компьютер с Windows 10 и запускаем XnWiew. Выбираем Файл-СканироватьОткроется окно программы BlindScanner. Нажимаем кнопку выбора сервера, к которому будем подключаться (он у нас один, это компьютер с Windows 7)Нажимаем SearchНаш сервер автоматически определилсяДалее выбираем наш удаленный сканер HP Scanjet G2410, опции сканирования, такие как разрешение сканирования, режим сканирования (в нашем случае мы будем сканировать текстовый документ, поэтому выбираем черно-белый). Нажимаем ScanПроцесс сканирования
Метки к статье: Сеть Принтер
Настроить сканер по локальной сети
- Запускаем скачанный файл, выбираем язык установки и жмем кнопку «Next».
- Следуем подсказкам Мастера-установщика и жмем «Далее». Соглашаемся с лицензией, а в окне опций ставим галочку «Install Server Software».
- Экземпляр программы будет установлен в режиме сервера, что даст возможность другим ПК пользоваться сетевым сканером.
- На следующем этапе нужно проследить, чтобы была поставлена галочка, как на скриншоте.
ВАЖНО! Брандмауэр может выдать запрос на разрешения для программы. В таком случае рекомендуется разрешить программу во всех сетях.
Запуск серверной версии
Нужно всего лишь выбрать сканирующее устройство, чтобы RemoteScan могла расшарить его. Кликните дважды по необходимому устройству.
Программа свернется в трей и в дальнейшем будет сама запускаться при включении компьютера.
Если появится необходимость перенастроить сканирующее устройство, вы всегда сможете сделать это, кликнув правой кнопкой по иконке программы RemoteScan, и выбрав пункт «Chose a Scanner».
Как видите, использование программы довольно простое.
Установка клиентской версии
Установка клиентской части аналогична серверной, только с той разницей, что теперь следует поставить галочку «Install Client Software».
Также необходимо разрешить работу во всех сетях, если брандмауэр спросит.
ВАЖНО! Брандмауэры (файерволы) некоторых антивирусов блокируют порты 6077 и 6078, которые необходимы для работы программы. Необходимо добавить в исключения exe-файл самой программы (на сервере) и вышеупомянутые порты (как на сервере, так и на клиенте).
Сканирование по сети
Воспользуйтесь знакомой вам программой для сканирования или, например, установите WinScan2PDF. Она совсем небольшая и не требует установки. Предназначена только для сканирования изображения в PDF-файлы.
Как сделать сканер по сети в Windows XP, 7, 8, 10
Как настроить сканер по локальной сети?
Немного поискав нашел, программу, которая делает сервер сканирования и соответственно может расшаривать usb принтер по сети!
Теперь смотрите как это работает:
1. Устанавливаем эту программу, на компьютере к которому подключен сканер. Устанавливаем в качестве сервера.
2. Теперь на компьютере на котором нет сканера, устанавливаем программу в режиме Client.
3. Чтобы отсканировать документ выбираем в качестве устройства RemoteScan.
1. Устанавливаем в качестве сервера
Как устанавливать не буду вам объяснять, там все просто далее, далее, но самое главное, устанавливайте как есть и при установке укажите галочку сервер.
Потом далее, далее. После установки, брандмауэр если у вас включен, спросит в каких сетях разрешать эту программу, я поставил во всех.
При запуске выбираем, сканер, через который будет производиться сканирование. Выбираем сканер, чтобы программа могла расшарить сканер по сети.
Все. Сервер свернут в трей и будет запускаться при запуске компьютера. Выключать его не нужно. При необходимости в трее можно менять сканер, если у вас их несколько.
2. Устанавливаем сканер в качестве клиента
Теперь устанавливаем сканер, на том компьютере, где будете сканировать.
Установка похожа, только при установке нужно выбрать галочку Client.
После установки если брандмауэр спросит, опять выберите в каких сетях вы будете его использовать.
Все. Теперь как сканировать.
3. Как сканировать по сети по USB
Теперь выбираем программу для сканирования. Я взял вторую, которая умеет сканировать несколько страниц pdf в один файл.
Выбираем в качестве сканера RemoveScan
И сканируем, как обычно) Вот таким способом можно сканировать по сети через usb сканер!
Возможно многим понадобится подключить принтер к виртуальной машине, по этому видео прилагаю)
PS: Если у кого-то возникают конфликты с этой программой на компьютерах, то попробуйте программу BlindScanner — это аналог.
Сканирование документов по сети / Habr
Сканирование документов по сети с одной стороны вроде бы есть, но с другой стороны не стало общепринятой практикой, в отличие от сетевой печати. Администраторы по-прежнему ставят драйвера, а настройка удаленного сканирования индивидуальная для каждой модели сканера. Какие же технологии есть на данный момент, и есть ли у такого сценария будущее.Устанавливаемый драйвер или прямой доступ
В настоящее время распространены четыре типа драйверов: TWAIN, ISIS, SANE и WIA. По сути, эти драйвера выполняют роль интерфейса между приложением и низкоуровневой библиотекой от производителя, которая связывается с конкретной моделью.
Упрощенная архитектура соединения со сканером
Обычно подразумевается, что сканер подключен напрямую к компьютеру. Однако, никто не ограничивает протокол между низкоуровневой библиотекой и устройством. Это может быть и TCP/IP. Таким образом сейчас работает большинство сетевых МФУ: сканер виден как локальный, но соединение идет через сеть.
Плюс у такого решения в том, что приложению все равно как именно сделано подключение, главное видеть знакомый TWAIN, ISIS или другой интерфейс. Не нужно реализовывать специальную поддержку.
Но и минусы очевидны. Решение завязано на декстопную ОС. Мобильные устройства сразу выпадают из поддержки. Второй минус, драйверы могут работать нестабильно на сложных инфраструктурах, например, на терминальные серверах с тонкими клиентами.
Выходом из положения будет поддержка прямого подключения к сканеру по HTTP/RESTful протоколу.
TWAIN Direct
TWAIN Direct был предложен консорциумом TWAIN Working Group как вариант бездрайверного доступа.
TWAIN Direct
Основная идея в том, что вся логика переносится на сторону сканера. А сканер предоставляет доступ по REST API. Дополнительно спецификация содержит описание публикации устройства (autodiscovery). Выглядит хорошо. Для администратора это избавление от возможных проблем с драйверами. Поддержка всех устройств, главное, чтобы было совместимое приложение. Для разработчика тоже есть плюсы, в первую очередь знакомый интерфейс взаимодействия. Сканер выступает веб-сервисом.
Если рассмотреть реальные сценарии использования, то минусы также найдутся. Первый — ситуация дедлока. На рынке нет устройств с TWAIN Direct и разработчикам нет смысла поддерживать эту технологию, и обратно. Второй — безопасность, спецификация не предъявляет требований к управлению пользователями, частоте обновлений для закрытия возможных дыр. Также непонятно, как администраторам контролировать апдейты и доступ. На компьютере есть антивирусное ПО. А в прошивке сканера, в которой очевидно будет веб-сервер, этого может и не быть. Или быть, но не то, что требует политика безопасности компании. Согласитесь, иметь зловреда, который будет отправлять налево все отсканированные документы не очень хорошо. То есть при внедрении данного стандарта задачи, которые решались настройками сторонних приложений перекладываются на производителей устройств.
Третий минус — возможная потеря функциональности. Драйвера могут иметь дополнительную пост-обработку. Распознавание штрихкодов, удаление фона. Некоторые сканеры имеют т.н. импринтер — функцию, которая позволяет сканеру печатать на обработанном документе. Этого нет в TWAIN Direct. Спецификация допускает расширение API, но это приведет к появлению множеств собственных реализаций.
И еще один минус в сценариях работы со сканером.
Сканирование из приложения, или сканирование от устройства
Давайте рассмотрим, как происходит обычное сканирование из приложения. Я кладу документ. Затем открываю приложение и сканирую. Затем забираю документ. Три шага. Теперь представьте, что сетевой сканер стоит в другом помещении. Нужно сделать как минимум 2 подхода к нему. Это менее удобно, чем сетевая печать.
Другое дело, когда сканер сам умеет отправлять документ. Например, на почту. Я кладу документ. Затем сканирую. Документ сразу летит в целевую систему.
В этом и есть основное отличие. Если устройство подключено к сети, то удобнее сканировать сразу в целевое хранилище: папку, почту или ECM систему. В этой схеме нет места драйверу.
Если посмотреть со стороны, мы используем сетевое сканирование, не меняя существующих технологий. Причем как из десктопных приложений через драйвер, так и прямо с устройства. Но удаленное сканирование с компьютера не стало настолько массовым, как сетевая печать, из-за различий в сценариях работы. Более востребованным становится сканирование сразу в нужное хранилище.
Поддержка сканерами TWAIN Direct как замена драйверам очень правильный шаг. Но стандарт немного запоздал. Пользователи хотят сканировать прямо с сетевого устройства, отправляя документы по назначению. Существующим приложениям нет необходимости поддерживать новый стандарт, так как и сейчас все работает прекрасно, а производителям сканеров нет нужды его реализовывать, так как нет приложений.
И в заключение. Общий тренд показывает, что простое сканирование одной — двух страничек будет замещаться камерами на телефонах. Останется промышленное сканирование, где важны скорость, поддержка функций постобработки, которые TWAIN Direct не может обеспечить, и где будет оставаться важной тесная интеграция с ПО.
Как установить сканер на Windows 7
Если вы приобрели сканирующую технику, то перед тем, как ее использовать, необходимо вначале подключить к компьютеру и настроить. Windows 7 позволяет установить сканирующее оборудование двумя способами – локально или по сети.
Как подключить локально
Большинство современных МФУ подключаются к компьютеру с помощью USB-кабеля. Для этого вставляем кабель в USB-порт компьютера, затем включаем сканирующее оборудование. ПК сам находит его, автоматически подключает.
Некоторые устаревшие модели требуют ручного подключения. Чтобы установить сканер вручную на Windows 7, выполняем следующие действия:
- Жмем «Пуск» ˃ «Панель управления» ˃ «Оборудование и звук» ˃ «Устройства и принтеры».
- Выбираем опцию «Добавление устройства». Ждем, пока ПК найдет всю сканирующую технику, установленную рядом, выбираем ту, которую необходимо подключить. Жмем соответствующую кнопку для добавления нашего сканера.
Есть другой способ: нажимаем «Пуск», в поле поиска вводим слово «скан», выделяем «Просмотр сканеров и камер».
ПРИМЕЧАНИЕ. Если сканирующее оборудование вмонтировано в многофункциональный или универсальный принтер, то при поиске высветится его имя. Для его активации необходимо на странице «Устройства и принтеры» выбрать значок МФУ, нажать «Управление», потом на имя нужной модели.
Для инсталляции должны быть установлены драйвера. Windows 7 производит их установку автоматически через «Центр обновления».
Драйвера также можно добавить вручную. Они находятся на диске, входящем в комплект с оборудованием. Как это сделать, указано в инструкции, поэтому перед подключением необходимо ознакомиться с рекомендациями производителя.
Если нет установочного диска, то драйвера скачиваются с официального сайта компании-производителя.
Чтобы установить драйвер вручную, необходимо:
- Из папки, загруженной с официального сайта, самостоятельно запустить setup.exe. Выполнять это нужно при полной совместимости с операционной системой.
- Проверить, находит ПК наше сканирующее оборудование или нет. Если он его не находит, значит драйвер установлен неправильно или нужно выполнить переустановку:
- заходим в «Диспетчер устройств»;
- выбираем неустановившееся МФУ;
- правой кнопкой мышки выделяем «Свойства» ˃ «Обновить драйвер», находим драйвера, указываем папку, где хранятся их разархивированные файлы.
Такие действия помогают компьютеру опознать наш сканер. После подключения можно сразу сканировать фото, документы, изображения.
Сетевое подключение
Если нужно установить сетевой сканер на Windows 7, выполняем действия:
- Подключаем USB-кабель к сетевому компьютеру или модему.
- Нажимаем «Пуск», активируем «Панель управления», затем «Устройства и принтеры», выбираем наше сетевое МФУ.
- Кликая правой клавишей мыши по значку МФУ, включаем функцию «Установить», затем «Добавить сетевой, беспроводной или Bluetooth-принтер». Теперь функция сканирования будет доступна другим компьютерам, подключенным к сети.
ВНИМАНИЕ. Если система не находит сетевой сканер, то необходимо проверить, включено ли сканирующее оборудование, не блокирует ли брандмауэр соединение с ним. Может быть, необходимо открыть порт брандмауэра, установить связь между устройствами. Если сеть имеет несколько подсетей, то сканер назначается в той подсети, где подключен компьютер. Также необходимо проверить настройки — подключена ли функция широкого вещания. Обычно она включается автоматически. Проконтролировать нужно также наличие IP-адреса и правильность заданных параметров сети. Проверив все, повторяем поиск. Если проблема решена, то выбираем наше МФУ и подключаем, в противном случае устанавливаем ручным способом.
Установить сканер на Windows 7 вручную можно таким способом:
- на соответствующей странице вписываем имя нашего сканирующего оборудования или выбираем вариант по умолчанию. Указанное имя будет высвечиваться на странице «Устройства и принтеры». Нажимаем кнопку «Далее»;
- настройки для общего доступа выполняются в автоматическом режиме. Отменить функцию можно, выбрав параметр «Нет общего доступа к этому устройству»;
- производится установка, теперь все готово к работе.
Подключить МФУ к компьютеру также можно, используя различные сторонние программы, сначала скачав их, а потом выполнив их инсталляцию на ПК.
Рекомендуем ознакомиться:
Автоматическое подключение сетевых МФУ с возможностью сканирования [Часть 2] / Habr
Как и обещал в первой части, за которую я успешно получил инвайт в песочнице, в этой заметке я покажу как подключить сетевые МФУ Kyocera M2035dn, Xerox WorkCentre 3615 и 6505DN, а в конце статьи добавлю небольшой бонус с которым любой скрипт связанный с сетью становится лучше.
Как бы небыли прекрасны гомогенные инфраструктуры, пусть даже в части принтеров и мфу, реальность зачастую ставит свои условия. В то время как пользователи сами в полный рост подключали и успешно сканировали с некогда проблемных МФУ HP, в компанию приехал японский гость — Kyocera M2035dn.
Приехал как всегда не в мое уютное админское логово, а сразу на объект и как и мфу от HP, в глаза его я, если честно, даже не видел.
Первым делом качаем драйвер и смотрим содержимое… ба, знакомые все люди:
Есть пометка о том, что подключение сетевое (network) и есть ID!
Попробуем подключить сканер через devcon, подобно тому как мы подключали МФУ от HP в первой части:.\devcon.exe /r install C:\Drivers\Scanners\2035dnscan\kmwiadrv.inf "KM_WC_ECOSYS_M2035dn_N_WIA"
Сканер подключился, прописываем в реестр адрес сканера параметром ScannerAddress и запускаем сканирование. Приложение сканирования показало отсканированный лист, все работает отлично. Казалось бы победа, но запуск второй, используемой у нас программы для сканирования, поубавил радости — сканер в ней не отображался.
Оказывается разработчики Kyocera почему-то в драйвере реализовали сканирование только через WIA, для TWAIN надо ставить отдельный косты.. враппер, который пробрасывает TWAIN интерфейс в WIA и возвращает обратно результат. Выглядит гуй этого TWAIN драйвера следующим образом:
При этом, по WIA мы можем подключить несколько сканеров Kyocera, в то время как TWAIN интерфейс у нас будет всегда только один. Либо пользуйтесь WIA, либо каждый раз запускайте нашу утилиту и переключайте сканер. Придется смириться, а пока посмотрим как нам обойти запуск этой утилиты на машине пользователя.
Утилита хранит настройки в ini-файлах, по одному файлу KM_TWAIN*.ini на каждый сетевой сканер и один результирующий файл с описанием сканеров и файлов их настроек.
Скрин обоих файлов, для одного подключенного сканера:
Теперь установка видится следующей:
— подключаем сканер через devcon
— если утилита TWAIN не установлена, ставим её
— добавляем адрес сканера в реестр
— проходимся по реестру в поиске подключенных сканеров Kyocera и на основе данных в реестре генерируем ini-файлы
Расширим функцию подключения сканера из предыдущей заметки следующим кодом, который я постарался по-максимуму прокомментировать:
# знакомый нам участок кода с подключением через devcon
"M2035dn" {
Push-Location 'C:\Drivers\Scanners\ip\2035dnscan\'
if ($(Get-Platform) -eq "Windows x64") {
.\devconx64.exe /r install $dest\kmwiadrv.inf "KM_WC_ECOSYS_M2035dn_N_WIA"
} else {
.\devcon.exe /r install $dest\kmwiadrv.inf "KM_WC_ECOSYS_M2035dn_N_WIA"
}
Pop-Location
# проверяем стоит ли костыль kyocera, если нет ставим в тихом режиме
$twain = Get-WMIObject -Class Win32_Product -Filter 'Name = "Kyocera TWAIN Driver"'
if (!($twain)) {
Push-Location 'C:\Drivers\Scanners\2035dnscan\TWAIN'
.\setup.exe /S /v /qn
Pop-Location
}
# получаем содержимое ветки реестра в которой хранятся настройки сканеров и камер
$scanclass = 'HKLM:\SYSTEM\CurrentControlSet\Control\Class\{6BDD1FC6-810F-11D0-BEC7-08002BE2092F}'
# так как мы только что поставили новый сканер, то его номер будет последним среди сканеров
$item = (Get-ChildItem $scanclass | Where-Object Name -match "\d{4}$" | Select -Last 1).PSChildName
# добавляем адрес сканера
New-ItemProperty "$scanclass\$item\DeviceData" -Name "ScannerAddress" -Value $ipaddress | Out-Null
# тут применил расширенный синтаксис Foreach-Object, состоящий из трех частей
# первая и последняя выполняются по одному разу, при запуске цикла и его окончании соответственно;
# код в секции process выполняется для каждого элемента цикла
Get-ChildItem $scanclass | Foreach-Object -Begin {
$count = 0
Add-Type -As System.Web
# стандартный пароль, который задает утилита
$pass = '43srWkUjR/8='
$scanitem = @{}
$filelist = @()
} -Process {
$path = $_.Name -replace 'HKEY_LOCAL_MACHINE', 'HKLM:'
$prop = Get-ItemProperty $path
if ($prop.Vendor -eq 'Kyocera') {
$count ++
$twfilename = "KM_TWAIN$count`.INI"
$devicedata = Get-ItemProperty "$path\DeviceData"
$cont = @{'Unit'='0';'ScannerAddress'=$devicedata.ScannerAddress; 'SSL'='0'}
$auth = @{'Auth'='0';'UserName'=''; 'Account'='0'; 'ID'='';'Password'=$pass}
$twcont = @{'Contents'=$cont; 'Authentication'=$auth}
Out-IniFile -inputobject $twcont -FilePath "$env:temp\$twfilename"
$filelist += , "$env:temp\$twfilename"
$devicename = $devicedata.'Model Name' + " #$count"
$modelname = $devicedata.'Model Name'
$scanreg = @{'Name'=$devicename;'Model'=$modelname;'DefFile'=$twfilename;'LastScan'='';'ScanList'='';'Pos'=($count-1)}
$scanitem.Add("Scanner$count", $scanreg)
}
} -End {
$regfilename = 'RegList.ini'
$settings = @{'Type'='4'; 'DefaultUse'=$count;'RegNum'=$count;}
$reglist = @{'Setting'=$settings}
$reglist += $scanitem
Out-IniFile -inputobject $reglist -FilePath "$env:temp\$regfilename"
$filelist += , "$env:temp\$regfilename"
}
# удаляем предыдущие ini-файлы и подкладываем сгенерированные выше с новым сканером
Get-ChildItem $env:systemdrive\users -Directory -Recurse -Include 'appdata' -Force | ForEach-Object {
$kyodir = $_.FullName + "\Roaming\Kyocera\KM_TWAIN"
If (!(Test-Path $kyodir)) {
New-Item -Type Directory -Path $kyodir
} else {
Remove-Item "$kyodir\*" -Recurse
}
$filelist | ForEach-Object {
Copy-Item $_ $kyodir -Force | Out-Null
}
}
}
В скрипте я использовал функцию вывода хэш-таблицы в ini-файл, вот её код:
function Out-IniFile($inputobject, $filepath) {
# .Example
# $Category1 = @{'Key1'='Value1';'Key2'='Value2'}
# $Category2 = @{'Key1'='Value1';'Key2'='Value2'}
# $NewINIContent = @{'Category1'=$Category1;'Category2'=$Category2}
# Out-IniFile -inputobject $NewINIContent -FilePath 'C:\MyNewFile.INI'
$outfile = New-Item -ItemType File -Path $filepath -Force
foreach ($i in $inputobject.keys) {
Add-Content -Path $outfile -Value "[$i]"
Foreach ($j in ($inputobject[$i].keys | Sort-Object)) {
Add-Content -Path $outfile -Value "$j=$($inputobject[$i][$j])"
}
Add-Content -Path $outfile -Value ''
}
}
Код этот успешно работал и проблем с ним не возникало, наверное, на протяжении полугода пока ветер опять не подул в другую сторону. В сторону Xerox.
В аутлук упало письмо с ip-адресами двух новых мфу, WorkCentre 3615 и WorkCentre 6505DN. Дорога хода мыслей при знакомстве с новым мфу уже проторена, открываем драйвер и видим знакомое:
И настроение мое улучшилось©
Распаковываем драйвер, запускаем консоль, выполняем:.\devcon.exe /r install C:\Drivers\Scanners\xx3615\xrszdim.inf "NON_PNP&WorkCentre3615"
Сканер подключился и на экран выскочил новый, как это принято говорить, воркэраунд, только уже от разработчиков Xerox:
Очередная странная утилита от авторов драйвера для прописывания IP, причем запускается она из драйвера при установке. Значит, для того что бы спрятать ее от пользователя, будем прибивать ее в скрипте, в общем-то не беда.
Сейчас покажу на примере 3615, как расширить функцию подключения сканера. От 6506DN она практически не отличается, разве что другое имя файла драйвера и ID:
"3615" {
Push-Location 'C:\Drivers\Scanners\xx3615\'
if ($(Get-Platform) -eq "Windows x64") {
.\devconx64.exe /r install C:\Drivers\Scanners\xx3615\xrszdim.inf "NON_PNP&WorkCentre3615"
} else {
.\devcon.exe /r install C:\Drivers\Scanners\xx3615\xrszdim.inf "NON_PNP&WorkCentre3615"
}
Pop-Location
Get-Process "AIOScanSettings" | Stop-Process -Force
# не могу вразумительно ответить почему я тут применил reg add,
# спишем на ностальгию по cmd, а замену на New-ItemProperty оставим домашкою читателю
&rеg.exe add "hklm\SOFTWARE\Xerox\WorkCentre 3615\TwainDriver" /v "EnableEnhancedBW" /t REG_DWORD /d 1 /f
&rеg.exe add "hklm\SOFTWARE\Xerox\WorkCentre 3615\TwainDriver" /v "ISO_B_Series" /t REG_DWORD /d 1 /f
&rеg.exe add "hklm\SOFTWARE\Xerox\WorkCentre 3615\TwainDriver" /v "IP Address" /t REG_SZ /d $ipAddress /f
}
Теперь мы умеем подключать целый зоопарк сетевых мфу и совершенно ничего не боимся, осталось добавить какой-нибудь магии… магии snmp!
SNMP (англ. Simple Network Management Protocol — простой протокол сетевого управления) — стандартный интернет-протокол для управления устройствами в IP-сетях на основе архитектур TCP/UDP.
ru.wikipedia.org/wiki/SNMP
Для работы с snmp из powershell я в скрипте использовал открытую библиотеку sharpsnmp, подробнее о ее использовании можно почитать по адресу: vwiki.co.uk/SNMP_and_PowerShell
После подключения библиотеки получение информации сводится к вызову функции Invoke-SNMPget с указанием Ip и uid, последний из которых легко гуглится.
Пример из кода:Invoke-SNMPget $ip .1.3.6.1.2.1.25.3.2.1.3.1
Результат работы поиска выводим на экран, о том как это сделать в одну комманду чуть ниже:
Остается выделить нужный принтер и нажать OK, кстати множественное выделение так же возможно, в этом случае подключатся все выделенные принтеры.
Эту удобную гуёвую магию обеспечивает командлет Out-GridView, отображающий любые переданные в него объекты. При вызове с параметром PassThru, после нажатия OK он передаст дальше по конвейеру выбранные объекты, нам остается только по очереди вызвать наши функции установки драйверов с параметрами пришедшими в объекте из конвейера.
В упрощенном виде скрипт примет вид:
$hosts | Out-GridView -Title "Выберите принтеры для установки" -PassThru | Foreach-Object {
$printername = $_.Name
$printersource = $_.Source
switch -regex ($printername) {
"xerox.+3615" {
$modelname = "Xerox WorkCentre 6505DN PCL 6"
$driverpath = 'C:\Drivers\Scanners\xx6505\xrxmozi.inf'
}
}
Write-Host "Добавляется порт IP принтера $printerName"
Add-PrinterPort $modelname $printersource
Write-Host "Добавляется драйвер принтера $printername"
Add-PrinterDriver $modelname $driverpath
Write-Host "Добавляется сканер принтера $printername"
Add-Scanner $printersource $modelname
}
В процессе изучения откликов принтеров, столкнулся с тем, что принтеры отдают порой имя отличающееся от имени прописанного в драйвере, для обхода этой особенности добавил в скрипт простой свитч с регулярками, которые никогда не промахиваются и как мы знаем полны по Тьюрингу 😉
switch -regex ($printername) {
"hp.+305\d" {
$modelName = "HP LaserJet 3050 Series PCL 6"
}
"hp.+3390" {
$modelName = "HP LaserJet 3390 Series PCL 6"
}
"xerox.+3615" {
$modelName = "Xerox WorkCentre 3615 PCL6"
}
"xerox.+650[0,5]DN" {
$modelName = "Xerox WorkCentre 6505DN PCL 6"
}
}
Полный код готового скрипта поиска и подключения сетевого принтера$ErrorActionPreference = "silentlycontinue"
function Main {
# путь к драйверам
$driversdistrib = 'C:\Drivers\'
# загружаем snmp либу
$snmplibpath = Join-Path (Get-Location).path "\SharpSnmpLib.dll"
if (Test-Path $snmplibpath) {
[reflection.assembly]::LoadFrom((Resolve-Path $snmplibpath))
} else {
Write-Host "Не удалось найти SharpSnmpLib"
Exit
}
# вычисляем подсеть, без хитрой математики, в лоб и только /24
$network = (Get-IPaddress).ToString() -replace "\.[0-9]{1,3}$"
# в диапазоне закрепленном за принтерами ищем устройства
$hosts = 10..40 | ForEach-Object {
$ip = "$network.$_"
$snmpanswer= $null
$snmpanswer = Invoke-SNMPget $ip .1.3.6.1.2.1.25.3.2.1.3.1
if ($snmpanswer) {
# формируем объект с двумя свойствами который улетит в переменную $hosts
[pscustomobject]@{
Name = $snmpanswer.Data;
Source = $ip;
}
}
}
# выводим объекты в гуй с параметром PassThru, который передаст выбранные дальше по конвейеру
$hosts | Out-GridView -Title "Выберите принтеры для установки" -PassThru | Foreach-Object {
$printername = $_.Name
$printersource = $_.Source
switch -regex ($printername) {
"hp.+305\d" {
$printername = "HP LaserJet 3050 Series PCL 6"
$driverpath = Join-Path $driversdistrib 'Printers\3050\hppcp601.inf'
}
"hp.+3390" {
$printername = "HP LaserJet 3390 Series PCL 6"
$driverpath = Join-Path $driversdistrib 'Printers\3050\hppcp601.inf'
}
"hp.+153[0,6]" {
$printername = "HP LaserJet M1530 MFP Series PCL 6"
$driverpath = Join-Path $driversdistrib 'Printers\1530\hpc1530c.inf'
}
"hp.+1522" {
$printername = "HP LaserJet M1522 MFP Series PCL 6"
$driverpath = Join-Path $driversdistrib 'Printers\1522\hppcp608.inf'
}
"M2035dn" {
$printername = "Kyocera ECOSYS M2035dn KX"
$driverpath = Join-Path $driversdistrib 'Printers\2035dn\OEMSETUP.INF'
}
"xerox.+3615" {
$printername = "Xerox WorkCentre 3615 PCL6"
$driverpath = Join-Path $driversdistrib 'Scanners\xx3615\x2GPROX.inf'
}
"xerox.+650[0,5]DN" {
$printername = "Xerox WorkCentre 6505DN PCL 6"
$driverpath = Join-Path $driversdistrib 'Scanners\xx6505\xrxmozi.inf'
}
}
Write-Host "Добавляется порт IP принтера $printerName"
Add-PrinterPort $printername $printersource
Write-Host "Добавляется драйвер принтера $printername"
Add-PrinterDriver $printername $driverpath
Write-Host "Добавляется сканер принтера $printername"
Add-Scanner $printersource $printername
}
}
function Add-PrinterPort ($printersource) {
&cscript C:\Windows\System32\Printing_Admin_Scripts\ru-RU\prnport.vbs `
-a -r $printersource -h $printersource -o RAW -n 9100 | Out-Null
}
function Add-PrinterDriver ($printerName, $driverpath) {
$folder = Split-Path $driverpath
cscript C:\Windows\System32\Printing_Admin_Scripts\ru-RU\prndrvr.vbs `
-a -m $printerName -e Get-Platform -h $folder -i $driverpath
}
function Add-Scanner ($ipaddress, $printername) {
switch -regex ($printername) {
"1530" {
Push-Location (Join-Path $driversdistrib 'Scanners\1536scan\')
if ($(Get-Platform) -eq "Windows x64") {
.\hppniscan64.exe -f "hppasc16.inf" -m "vid_03f0&pid_012a&IP_SCAN" -a $ipAddress -n 1
} else {
.\hppniscan01.exe -f "hppasc16.inf" -m "vid_03f0&pid_012a&IP_SCAN" -a $ipAddress -n 1
}
Pop-Location
}
"(305\d)|(3390)" {
Push-Location (Join-Path $driversdistrib 'Scanners\3055scan\')
switch -regex ($printername) {
"3050" {
.\hppniscan01.exe -f "hppasc01.inf" -m "vid_03f0&pid_3217&IP_SCAN" -a $ipAddress -n 1
}
"3052" {
.\hppniscan01.exe -f "hppasc01.inf" -m "vid_03f0&pid_3317&IP_SCAN" -a $ipAddress -n 1
}
"3055" {
.\hppniscan01.exe -f "hppasc01.inf" -m "vid_03f0&pid_3417&IP_SCAN" -a $ipAddress -n 1
}
"3390" {
.\hppniscan01.exe -f "hppasc01.inf" -m "vid_03f0&pid_3517&IP_SCAN" -a $ipAddress -n 1
}
}
Pop-Location
}
"1522" {
Push-Location (Join-Path $driversdistrib 'Scanners\1522scan\')
if ($(Get-Platform) -eq "Windows x64") {
.\hppniscan64.exe -f "hppasc08.inf" -m "vid_03f0&pid_4517&IP_SCAN" -a $ipAddress -n 1
} else {
.\hppniscan01.exe -f "hppasc08.inf" -m "vid_03f0&pid_4517&IP_SCAN" -a $ipAddress -n 1
}
Pop-Location
}
"M2035dn" {
Push-Location (Join-Path $driversdistrib 'Scanners\2035dnscan\')
if ($(Get-Platform) -eq "Windows x64") {
.\devconx64.exe /r install $dest\kmwiadrv.inf "KM_WC_ECOSYS_M2035dn_N_WIA"
} else {
.\devcon.exe /r install $dest\kmwiadrv.inf "KM_WC_ECOSYS_M2035dn_N_WIA"
}
Pop-Location
$twain = Get-WMIObject -Class Win32_Product -Filter 'Name = "Kyocera TWAIN Driver"'
if (!($twain)) {
Push-Location (Join-Path $driversdistrib 'Scanners\2035dnscan\TWAIN')
.\setup.exe /S /v /qn
Pop-Location
}
$scanclass = 'HKLM:\SYSTEM\CurrentControlSet\Control\Class\{6BDD1FC6-810F-11D0-BEC7-08002BE2092F}'
$item = (Get-ChildItem $scanclass | Where-Object Name -match "\d{4}$" | Select -Last 1).PSChildName
New-ItemProperty "$scanclass\$item\DeviceData" -Name "ScannerAddress" -Value $ipAddress | Out-Null
Get-ChildItem $scanclass | ForEach-Object -Begin {
$count = 0
Add-Type -As System.Web
$pass = [System.Web.Security.Membership]::GeneratePassword(12,2)
$scanitem = @{}
$filelist = @()
} -Process {
$path = $_.Name -replace 'HKEY_LOCAL_MACHINE', 'HKLM:'
$prop = Get-ItemProperty $path
if ($prop.Vendor -eq 'Kyocera') {
$count ++
$twfilename = "KM_TWAIN$count`.INI"
$devicedata = Get-ItemProperty "$path\DeviceData"
$cont = @{'Unit'='0';'ScannerAddress'=$devicedata.ScannerAddress; 'SSL'='0'}
$auth = @{'Auth'='0';'UserName'=''; 'Account'='0'; 'ID'='';'Password'=$pass}
$twcont = @{'Contents'=$cont; 'Authentication'=$auth}
Out-IniFile -inputobject $twcont -FilePath "$env:temp\$twfilename"
$filelist += , "$env:temp\$twfilename"
$devicename = $devicedata.'Model Name' + " #$count"
$modelname = $devicedata.'Model Name'
$scanreg = @{'Name'=$devicename;'Model'=$modelname;'DefFile'=$twfilename;'LastScan'='';'ScanList'='';'Pos'=($count-1)}
$scanitem.Add("Scanner$count", $scanreg)
}
} -End {
$regfilename = 'RegList.ini'
$settings = @{'Type'='4'; 'DefaultUse'=$count;'RegNum'=$count;}
$reglist = @{'Setting'=$settings}
$reglist += $scanitem
Out-IniFile -inputobject $reglist -FilePath "$env:temp\$regfilename"
$filelist += , "$env:temp\$regfilename"
}
Get-ChildItem $env:systemdrive\users -Directory -Recurse -Include 'appdata' -Force | ForEach-Object {
$kyodir = $_.FullName + "\Roaming\Kyocera\KM_TWAIN"
If (!(Test-Path $kyodir)) {
New-Item -Type Directory -Path $kyodir
} else {
Remove-Item "$kyodir\*" -Recurse
}
$filelist | ForEach-Object {
Copy-Item $_ $kyodir -Force | Out-Null
}
}
}
"6505" {
Push-Location (Join-Path $driversdistrib 'Scanners\xx6505\')
if ($(Get-Platform) -eq "Windows x64") {
.\devconx64.exe /r install $dest\xrsmoim.inf "NON_PNP&WorkCentre6505"
} else {
.\devcon.exe /r install $dest\xrsmoim.inf "NON_PNP&WorkCentre6505"
}
Pop-Location
Get-Process "AIOScanSettings" | Stop-Process -Force
&rеg.exe add "hklm\SOFTWARE\Xerox\WorkCentre 6505\TwainDriver" /v "EnableEnhancedBW" /t REG_DWORD /d 1 /f
&rеg.exe add "hklm\SOFTWARE\Xerox\WorkCentre 6505\TwainDriver" /v "IP Address" /t REG_SZ /d $ipAddress /f
}
"3615" {
Push-Location (Join-Path $driversdistrib 'Scanners\xx3615\')
if ($(Get-Platform) -eq "Windows x64") {
.\devconx64.exe /r install $dest\xrszdim.inf "NON_PNP&WorkCentre3615"
} else {
.\devcon.exe /r install $dest\xrszdim.inf "NON_PNP&WorkCentre3615"
}
Pop-Location
Get-Process "AIOScanSettings" | Stop-Process -Force
# тут в слове rеg, средняя буква русская, дабы не превращался в ®
&rеg.exe add "hklm\SOFTWARE\Xerox\WorkCentre 3615\TwainDriver" /v "EnableEnhancedBW" /t REG_DWORD /d 1 /f
&rеg.exe add "hklm\SOFTWARE\Xerox\WorkCentre 3615\TwainDriver" /v "ISO_B_Series" /t REG_DWORD /d 1 /f
&rеg.exe add "hklm\SOFTWARE\Xerox\WorkCentre 3615\TwainDriver" /v "IP Address" /t REG_SZ /d $ipAddress /f
}
}
}
function Get-IPaddress {
$ipWmiObject = Get-WmiObject Win32_NetworkAdapterConfiguration -filter "IPEnabled = 'True'"
$ipWmiObject.IPAddress -match "^192\.([0-9]{1,3}\.){2}[0-9]{1,3}$"
}
function Get-Platform {
if ([System.Environment]::Is64BitOperatingSystem) {
"Windows x64"
} else {
"Windows NT x86"
}
}
function Out-IniFile($inputobject, $filepath) {
# .Example
# $Category1 = @{'Key1'='Value1';'Key2'='Value2'}
# $Category2 = @{'Key1'='Value1';'Key2'='Value2'}
# $NewINIContent = @{'Category1'=$Category1;'Category2'=$Category2}
# Out-IniFile -inputobject $NewINIContent -FilePath 'C:\MyNewFile.INI'
$outfile = New-Item -ItemType File -Path $filepath -Force
foreach ($i in $inputobject.keys) {
Add-Content -Path $outfile -Value "[$i]"
Foreach ($j in ($inputobject[$i].keys | Sort-Object)) {
Add-Content -Path $outfile -Value "$j=$($inputobject[$i][$j])"
}
Add-Content -Path $outfile -Value ''
}
}
function Invoke-SNMPget {
param (
[string]$sIP,
$sOIDs,
[string]$Community = "public",
[int]$UDPport = 161,
[int]$TimeOut=30
)
$vList = New-Object 'System.Collections.Generic.List[Lextm.SharpSnmpLib.Variable]'
foreach ($sOID in $sOIDs) {
$oid = New-Object Lextm.SharpSnmpLib.ObjectIdentifier ($sOID)
$vList.Add($oid)
}
$ip = [System.Net.IPAddress]::Parse($sIP)
$svr = New-Object System.Net.IpEndPoint ($ip, 161)
$ver = [Lextm.SharpSnmpLib.VersionCode]::V1
try {
$msg = [Lextm.SharpSnmpLib.Messaging.Messenger]::Get($ver, $svr, $Community, $vList, $TimeOut)
} catch {
return $null
}
$res = @()
foreach ($var in $msg) {
$line = "" | Select OID, Data
$line.OID = $var.Id.ToString()
$line.Data = $var.Data.ToString()
$res += $line
}
$res
}
. Main
На этом на сегодня всё, надеюсь мои заметки помогут вам забыть о проблемах с сетевыми принтерами и освободят время для изучения PowerShell.
Спасибо за внимание тем, кто дочитал до этого момента 😉