@echo off
ver | find "10.0." >nul && chcp 65001 >nul || chcp 28591 >nul
color 0A
setlocal EnableExtensions EnableDelayedExpansion
mode con: cols=90 lines=30
: -------------------------------------------------------------------------------------------------------------------------
: on définit les variables
: -------------------------------------------------------------------------------------------------------------------------
set "site=client2"
set "allowNetworkScan=0"
set "driversStore=%~dp0Drivers Store"
set "port=9100"
set "nmapVersion=nmap-7.92"
title Installation d'imprimantes reseau - %site%
: -------------------------------------------------------------------------------------------------------------------------
: on vérifie l'existence du dossier contenant tous les pilotes
: -------------------------------------------------------------------------------------------------------------------------
cd /d %driversStore% || (
echo. & echo ^>^>^> Impossible de trouver le dossier des pilotes, le script va quitter
echo. & timeout /t 5 /nobreak >nul
exit /b 1
)
: -------------------------------------------------------------------------------------------------------------------------
: on détermine si le système est 32 ou 64 bits
: -------------------------------------------------------------------------------------------------------------------------
wmic os get osarchitecture /value | find "64" >nul && set "arch=x64" || set "arch=x86"
: -------------------------------------------------------------------------------------------------------------------------
: on recherche les imprimantes à installer
: -------------------------------------------------------------------------------------------------------------------------
if not exist "%~dp0printers_list.csv" (
echo. & echo ^>^>^> Impossible de trouver la liste des imprimantes, le script va quitter
echo. & timeout /t 5 /nobreak >nul
echo #modèle;nom affiché;adresse mac;adresse ip;site;>"%~dp0printers_list.csv"
exit /b 1
)
for /f "delims=" %%H in ('findstr "%site%" "%~dp0printers_list.csv"') do (
call :filling "%%~H"
for /f "eol=# tokens=1-4 delims=;" %%A in ('echo !line!') do (
set "printerModel=%%~A"
set "printerName=%%~B"
set "printerMacAddress=%%~C"
set "printerIpAddress=%%~D"
set "printerModel=!printerModel:###=!"
set "printerName=!printerName:###=!"
set "printerMacAddress=!printerMacAddress:###=!"
set "printerIpAddress=!printerIpAddress:###=!"
)
if defined printerModel (
if exist "%driversStore%\!printerModel!" (
pushd "%driversStore%\!printerModel!"
call :process
popd
)
)
timeout /t 5 /nobreak
)
exit /b 0
: -------------------------------------------------------------------------------------------------------------------------
: début de la routine d'installation
: -------------------------------------------------------------------------------------------------------------------------
:process
: -------------------------------------------------------------------------------------------------------------------------
: on vérifie si l'imprimante n'est pas déjà installée
: -------------------------------------------------------------------------------------------------------------------------
wmic printer get Name,DriverName /format:table | find /i "!printerModel!" >nul && (
echo. & echo ^>^>^> L'imprimante !printerModel! est déjà installée sur le poste de travail
echo.
exit /b 1
)
: -------------------------------------------------------------------------------------------------------------------------
: on recherche le script d'installation (fichier .inf) du pilote de l'imprimante
: -------------------------------------------------------------------------------------------------------------------------
set "infPrint="
cls
echo.
echo ######################################################
echo Etape 1 - Recherche du pilote d'impression
echo ######################################################
rem on recherche dans les fichiers .inf correspondants à l'architecture
for %%A in (*%arch%*.inf) do (
find /i "Class" "%%~A" | find /i "Printer" >nul && if not defined infPrint (call :extraction "%%~A" infPrint || exit /b 1)
find /i "Class" "%%~A" | find /i "Image" >nul && if not defined infScan (call :extraction "%%~A" infScan || exit /b 1)
)
rem on recherche dans tous les fichiers .inf
for %%A in (*.inf) do (
find /i "Class" "%%~A" | find /i "Printer" >nul && if not defined infPrint (call :extraction "%%~A" infPrint || exit /b 1)
find /i "Class" "%%~A" | find /i "Image" >nul && if not defined infScan (call :extraction "%%~A" infScan || exit /b 1)
)
if not defined infPrint (
echo.
echo ^>^>^> Aucun script d'installation n'a été trouvé pour l'imprimante '!printerModel!'
echo.
exit /b 1
)
: -------------------------------------------------------------------------------------------------------------------------
: on lance l'installation si l'adresse ip a été renseignée au début du script, sinon on fait appel à Nmap
: -------------------------------------------------------------------------------------------------------------------------
timeout /t 3 /nobreak >nul
if defined printerIpAddress (
call :installation "!printerIpAddress!"
exit /b 0
)
if "%allowNetworkScan%"=="0" (exit /b 1)
: -------------------------------------------------------------------------------------------------------------------------
: on vérifie les prérequis pour le téléchargement et l'extraction du programme Nmap
: -------------------------------------------------------------------------------------------------------------------------
if not defined printerMacAddress (
echo. & echo ^>^>^> Vous avez omis d'indiquer au début du script l'adresse MAC de l'imprimante
echo. & timeout /t 5 /nobreak >nul
exit /b 1
)
2>nul call 7za | find "Pavlov" >nul || (
echo. & echo ^>^>^> L'outil 7za est manquant, il est disponible ici : https://www.7-zip.fr/download.html
echo. & timeout /t 5 /nobreak >nul
exit /b 1
)
2>nul call curl -V | find "libcurl" >nul || (
echo. & echo ^>^>^> L'outil curl est manquant, il est disponible ici : https://curl.se/download.html
echo. & timeout /t 5 /nobreak >nul
exit /b 1
)
: -------------------------------------------------------------------------------------------------------------------------
: on télécharge le scanner réseau NMAP
: -------------------------------------------------------------------------------------------------------------------------
set "PATH=%TMP%\%nmapVersion%;%PATH%"
pushd %TMP%
nmap -V >nul 2>&1 || (
echo ######################################################
echo Etape requise - Téléchargement de l'outil NMAP
echo ######################################################
echo.
curl -# -k -o "%nmapVersion%-win32.zip" "https://nmap.org/dist/%nmapVersion%-win32.zip"
cls & echo.
echo ######################################################
echo Etape requise - Décompression de l'outil NMAP
echo ######################################################
7za x "%nmapVersion%-win32.zip" -y
)
popd
: -------------------------------------------------------------------------------------------------------------------------
: on vérifie si NpCap est installé
: -------------------------------------------------------------------------------------------------------------------------
:verif
nmap -V 2>&1 | find "WARNING:" >nul && (
echo. & echo ### Veuillez d'abord installer le programme NpCap
for %%A in ("%TMP%\%nmapVersion%\npcap*.exe") do set "npcap=%%~A"
echo. & pause
start "" /D "%TMP%\%nmapVersion%" /WAIT "%npcap%"
goto :verif
)
: -------------------------------------------------------------------------------------------------------------------------
: on scanne le réseau avec l'outil NMAP
: -------------------------------------------------------------------------------------------------------------------------
for /f "tokens=2 delims=:(" %%A in ('netsh interface ip show address ^| find "/" ^| findstr /v "127.0."') do if not defined network (set "network=%%~A")
set "network=!network: =!"
set "deviceMacAddress="
cls & echo.
echo ######################################################
echo Etape 2 - Recherche de l'IP imprimante
echo ######################################################
echo.
set "log=%TMP%\report_nmap.txt"
nmap.exe -n -oN %log% --open -p T:%port% !network!
timeout /t 2 /nobreak >nul
: -------------------------------------------------------------------------------------------------------------------------
: on analyse le fichier journal pour extraire l'ip de l'imprimante concernée
: -------------------------------------------------------------------------------------------------------------------------
for /f "tokens=5" %%M in ('findstr /i /C:"Nmap scan report for" "%log%"') do set "printerIpAddress=%%M"
for /f "tokens=3-8 delims=:( " %%P in ('findstr /i /C:"MAC Address" "%log%"') do set "deviceMacAddress=%%P:%%Q:%%R:%%S:%%T:%%U"
if "!deviceMacAddress!"=="!printerMacAddress!" (call :installation "!printerIpAddress!") else (echo. & echo ^>^>^> L'imprimante ciblée est éteinte/inaccessible)
exit /b 0
: -------------------------------------------------------------------------------------------------------------------------
: on crée un port TCP/IP contenant l'ip de l'imprimante
: -------------------------------------------------------------------------------------------------------------------------
:installation
cls & echo.
echo ^>^>^>^>^> !printerModel! = [ %~1 ] ^<^<^<^<^<
echo. & echo.
echo ######################################################
echo Etape 3 - Création du port d'impression TCP/IP
echo ######################################################
echo.
for /f "tokens=1 delims={}" %%A in ('wmic os get MUILanguages ^| find "-"') do if not defined locale (set "locale=%%~A")
cscript "%WINDIR%\System32\Printing_Admin_Scripts\%locale%\prnport.vbs" -a -r "IP_%~1" -h %~1 -o raw -n %port%
: -------------------------------------------------------------------------------------------------------------------------
: on ajoute/installe l'imprimante dans le système
: -------------------------------------------------------------------------------------------------------------------------
echo. & echo.
echo ######################################################
echo Etape 4 - Ajout de l'imprimante réseau
echo ######################################################
echo.
if not defined printerName (set "printerName=!printerModel!")
rundll32 printui.dll,PrintUIEntry /if /b "!printerName!" /f "!infPrint!" /r "IP_%~1" /h %arch% /m "!printerDriverName!" /z
IF %ERRORLEVEL% NEQ 0 (set "result=NOK") else (set "result=OK")
echo ^=^=^>^> ajout imprimante : !result!
call :logging !result!
rundll32 printui.dll,PrintUIEntry /y /n "!printerName!"
IF %ERRORLEVEL% NEQ 0 (set "result=NOK") else (set "result=OK")
echo. & echo ^=^=^>^> imprimante par défaut : !result!
exit /b 0
: -------------------------------------------------------------------------------------------------------------------------
: on récupère le nom du pilote contenu dans le .inf
: -------------------------------------------------------------------------------------------------------------------------
:extraction
set "driverName="
for /f "skip=2 tokens=1,2 delims=,=""" %%E in ('find "!printerModel!" "%~1"') do (
if not defined driverName (echo %%~E | findstr "Printer series Series LAN" >nul && set "driverName=%%~E")
)
if not defined driverName (pause & exit)
:supEspace
if defined driverName (
if "!driverName:~-1!"==" " (
set "driverName=!driverName:~0,-1!"
goto :supEspace
)
set "driverName=!driverName:"=!"
set "%2=%~1"
) else (exit /b 1)
if "%2"=="infPrint" (set "printerDriverName=!driverName!")
if "%2"=="infScan" (set "scannerDriverName=!driverName!")
: -------------------------------------------------------------------------------------------------------------------------
: on affiche les informations issues du fichier .inf
: -------------------------------------------------------------------------------------------------------------------------
for /f "tokens=2,3 delims=,=" %%A in ('find /i "DriverVer" "%~1"') do set "version=%%B" & set "creation=%%A"
echo.
echo ^>^>^> Modèle : '!printerModel!'
echo ^>^>^> Fichier INF : '%~1'
echo ^>^>^> Nom du pilote : '!driverName!'
echo.
echo ^>^>^> Script d'installation : OK
set "inf=%~1"
if exist "!inf:inf=cat!" (echo ^>^>^> Catalogue de sécurité : OK) else (exit /b 1)
echo.
echo ^>^>^> Version du pilote : !version: =!
echo ^>^>^> Date du pilote : !creation: =!
echo.
echo ######################################################
goto :eof
: -------------------------------------------------------------------------------------------------------------------------
: on remplit les champs vides avec un motif
: -------------------------------------------------------------------------------------------------------------------------
:filling
rem echo $ %~1
set "line=%~1"
:boucle
set "line=!line:;;=;###;!"
echo.!line! | findstr ";;" >nul && goto :boucle
goto :eof
: -------------------------------------------------------------------------------------------------------------------------
: routine permettant la journalisation
: -------------------------------------------------------------------------------------------------------------------------
:logging
if not exist "%~dp0Log" (mkdir "%~dp0Log")
for /f "tokens=1,2,3 delims=/ " %%a in ('date /t') do set "maDate=%%a-%%b-%%c"
for /f "tokens=1,2 delims=:" %%a in ('time /t') do set "heure=%%a:%%b:%time:~6,2%"
(echo.
echo ^>^>^>^>^> date : !maDate! à !heure!
echo ^>^>^>^>^> ajout imprimante "!printerModel!" : !REG3XP0!>%~1
echo ^>^>^>^>^> nom de l'ordinateur : %COMPUTERNAME%)>>"%~dp0Log\%site%.txt"
goto :eof
rem
Comments