Как стать автором
Обновить

Скрипт/Исполняемый файл для автоматической установки принтера на Win10/11

Готового решения найти не удалось, так что, поехали что-то делать кривыми ручками.

Но для начала, что имеем?
- Отсутствие AD, а так же возможно управления GPO.
- Офис на 300 человек и очень разношёрстный парк техники, MacOS, GNU/Linux и конечно Windows 10 и 11. Для первых двух развернут Cups а вот для вторых он не подходит, не буду распинаться почому))...
- 6 принтеров:
- 3шт. Kyocera ECOSYS M3145dn
- 1шт. Kyocera ECOSYS M4132idn
- 1шт. HP PageWide 377dw MFP
- 1шт. HP LaserJet MFP M426fdn
- 1шт. Kyocera ECOSYS MA4000cix

Для начала накидал кратко то, что собираюсь реализовать (aka ТЗ):
- Желание подключать пользователям Win принтера в один клик, а лучше чтобы этот клик и вовсе они сами делали;
- Ставится принтер должен с понятным именем для конечного пользователя
- Подключение по TCP/IP;
- И самое главное - Использование оригинальных драйверов производителя, во избежание каких либо конфликтов с форматом и для доступа к более широкому спектру настроек.

Придумалось следующее решение:
Создаем скрипт PowerShell

# InstallPrinter.ps1

# Переменные для подключения принтера
$printerIP = "192.168.27.247" # Адрес Подключаемого принтера
$printerPort = "9100" # Используем стандартный порт
$printerModel = "HP LaserJet Pro MFP M426f-M427f PCL-6" # Тут самое сложное, нужно
                                                        # точь в точь указать модель принтера,
                                                        # так, как он указан разработчиками драйверов
                                                        # проще всего его узнать установив принтер
                                                        # вручную и так же вручную добавить драйвер
                                                        # используя нужный *.inf файл
                                                        # из скаченных драйверов
$printerName = "reception" # (Удобное) имя, для конечного пользователя
$driverFolder = Get-ChildItem -Path $scriptDir -Directory | Select-Object -First 1 -ExpandProperty Name

# Определяем путь к исполняемому скрипту и директории с драйверами
$scriptPath = $MyInvocation.MyCommand.Path
$scriptDir = Split-Path -Parent $scriptPath
$driverDir = Join-Path -Path $scriptDir -ChildPath $driverFolder

# Функция для поиска нужного INF-файла
# Эта функция ищет все файлы с расширением .inf в указанной директории и поддиректориях,
# затем проверяет их содержимое на наличие строки, соответствующей модели принтера.
# Если такой файл найден, возвращается его полный путь.
# Если нужный файл не найден, возвращается null.

function Find-InfFile {
    param (
        [string]$driverDir,
        [string]$printerModel
    )
    $infFiles = Get-ChildItem -Path $driverDir -Filter *.inf -Recurse
    foreach ($infFile in $infFiles) {
        $content = Get-Content $infFile.FullName
        if ($content -match [regex]::Escape($printerModel)) {
            return $infFile.FullName
        }
    }
    return $null
}

# Поиск INF-файла
$infPath = Find-InfFile -driverDir $driverDir -printerModel $printerModel

if (-Not $infPath) {
    Write-Error "INF file for printer model $printerModel not found in $driverDir"
    exit 1
}

# Выполнение скрипта для создания порта
$createPortCmd = "cscript C:\Windows\System32\Printing_Admin_Scripts\ru-RU\prnport.vbs -a -r `"$printerIP`" -h `"$printerIP`" -o RAW -n $printerPort"
Execute-Command $createPortCmd

# Выполнение скрипта для установки драйвера
$installDriverCmd = "cscript C:\Windows\System32\Printing_Admin_Scripts\ru-RU\prndrvr.vbs -a -m `"$printerModel`" -e 'Windows x64' -i `"$infPath`" -h `"$driverDir`""
Execute-Command $installDriverCmd

# Добавление принтера
$addPrinterCmd = "rundll32 printui.dll,PrintUIEntry /if /b `"$printerName`" /r `"$printerIP`" /m `"$printerModel`" /u /K /q /Gw"
Execute-Command $addPrinterCmd

Write-Output "Printer installation completed successfully."

Этот скрипт полностью рабочий, но есть НО, что бы его запустить потребуется изменить политику выполнения скриптов powershell, но мы же не будем делать это вручную, верно?
Для решения этого вопроса создадим bat'ник, который за нас поменяет нужную нам политику, найдет и запустит наш скрипт, а после вернет политику к исходному значению, какой бы она не была.

setlocal

REM Определение текущей директории, где расположен файл .bat
set scriptDir=%~dp0

REM Определение полного пути к PowerShell скрипту (ищет единственный .ps1 файл в директории)
for %%f in ("%scriptDir%*.ps1") do set scriptPath=%%f

REM Сохранение текущей политики выполнения скриптов PowerShell на уровне локальной машины
for /f "tokens=*" %%i in ('powershell Get-ExecutionPolicy -Scope LocalMachine') do set "currPolicy=%%i"

REM Изменение политики выполнения скриптов на "Unrestricted" для выполнения скрипта без ограничений
powershell Set-ExecutionPolicy Unrestricted -Scope LocalMachine -Force

REM Запуск PowerShell скрипта с обходом политики выполнения
powershell -ExecutionPolicy Bypass -File "%scriptPath%"

REM Возвращение политики выполнения скриптов к исходному значению
powershell Set-ExecutionPolicy %currPolicy% -Scope LocalMachine -Force

endlocal

Теперь как все это собрать в один файл?

Для начала нужно поместить всё необходимое в одну директорию: выше упомянутый *.ps1 и *.bat а так же добавим поддиректорию, в которой содержаться распакованные драйвера для нашего устройства, ничего лишнего быть не должно, иначе все сломается и не будет работать.

Последний шаг, объединить все в один исполняемый файл, я для себя нашел следующий способ, для начала я переделал *.bat в *.exe с помощью весьма сомнительного софта bat2exe, после содержимое директории записал в самораспаковывающийся архив с помощью WinRaR с указанием запуска моего *.exe файла, запрашивания пути для распаковывания (это оставлю на ваш вкус и цвет) и добавления красивой иконки.

Итог

Цели достигнуты, хоть и есть большой минус с использованием сомнительного софта bat2exe, связано это с тем, что я банально не знаю как сделать архив таким образом, чтобы он запускал .bat файл, так же вполне вероятно что есть и более удобные инструменты, для достижения конечной цели, буду очень рад почитать ваши предложения по усовершенствованию и оптимизации работы.

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.