Winnt is not NT

Récupération manuelle des pilotes windows pour une imprimante partagée avec Samba

Posté le 05/11/2013

Mon serveur d’impression actuel (un boîtier acheté il y a plusieurs années) n’étant pas allumé en permanence (cela oblige a patienter plusieurs minutes avant de pouvoir imprimer). De plus, comme il donne des signes de faiblesse, je me suis penché sur l’installation d’un serveur d’impression avec partage d’imprimante via Samba pour Windows sur mon raspberry pi récemment acquis.

Si l’installation de Cups et son paramétrage sur mes machines Linux a été plutôt simple (en dehors d’un petit souci pour déterminer la forme exact de l’adresse IPP pour joindre correctement le serveur), il en a été tout autrement pour mes machines encore sous windows.

En effet, je souhaitais centraliser les pilotes afin de ne pas passer mon temps à les installer sur chaque machine windows (même si ce n’est pas très long) et cela me permettais de me pencher sur la possibilité de Samba de proposer les pilotes Windows en installation automatique.

À ceci venais s’ajouter une petite difficulté supplémentaire. Je n’utilise pas d’annuaire LDAP et je ne souhaite pas que l’utilisateur soit obligé de s’authentifier pour l’accès aux partages de fichiers puisque c’est pour une utilisation sur un petit réseau privé à la maison.

Les explications qui suivent sont données pour une architecture x86 32bits. Je détaillerais à la fin les quelques modifications à effectuer pour une architecture x64.

Quelques informations à connaître avant de commencer

Configuration du smb.conf de Samba

Il semble que pour que Samba s’annonce comme serveur 64 bits (en plus du fait qu’il soit déjà serveur 32 bits), il faille rajouter la ligne suivante dans la configuration.

[global]
spoolss: architecture = Windows x64

Voici la section la localisation des pilotes imprimante (path), ainsi que les autorisation d’écriture (write list). À noter que guest ok =yes est indispensable pour permettre l’accès aux utilisateurs non privilégiés à ce partage.

[print$]
comment = Pilotes imprimante
path = /var/lib/samba/printers
browseable = yes
read only = no
guest ok = yes
write list = root
writable = yes
create mask = 0644
directory mask = 0775

Informations supplémentaires à connaître

La variable path indique à Samba ou sont localisés les pilotes. C’est dans ce répertoire que l’on arrive si dans un gestionnaire de fichier on tape la commande :

\\<nom du serveur Samba>\print$

Dans ce répertoire apparaissent plusieurs répertoires correspondant chacun à une architecture. En voici la liste :

W32X86 # drivers Windows NT x86
x64 # drivers Windows x64
WIN40 # drivers Windows 95/98
W32ALPHA # drivers Windows NT Alpha_AXP
W32MIPS # drivers Windows NT R4000
W32PPC # drivers Windows NT PowerPC

Préparation de la machine virtuelle avec Virtualbox

  1. Paramétrer l’interface réseau comme ceci «Pont avec l’interface eth0».
  2. Lancer la machine virtuelle et affecter une adresse à la carte réseau incluse dans le réseau privé afin d’y avoir accès.
  3. Installer l’imprimante (ici une EPSON SX235) sur la machine virtuelle windows, qui doit être dans le réseau et accessible, en lui fournissant les pilotes comme pour une installation classique.
  4. Partager l’imprimante windows de la machine virtuelle (sinon rpcclient retourne un message d’erreur).
  5. Se connecter à la machine serveur Samba (via ssh par exemple).

Récupération des informations nécessaires à la suite des opérations

Depuis le serveur Samba exécuter la commande suivante :

rpcclient -c 'enumprinters' <Nom de la machine virtuelle>

Résultat obtenu

flags:[0x800000]
name:[<Nom de la machine virtuelle>EPSON SX235 Series]
description:[<Nom de la machine virtuelle>EPSON SX235 Series,EPSON SX235Series,]
comment:[]

La commande ci-dessus permet d»énumérer les imprimantes installées sur la machine virtuelle et de connaître le nom exact du pilote dont nous aurons besoin par la suite.

Récupération de la liste des fichiers du pilote

rpcclient -c 'getdriver "EPSON SX235 Series"' <Nom de la machine virtuelle> > <fichier_sauvegarde>

Ainsi on crée un début de script pour récupération presque automatique (on évite surtout la saisie manuelle des noms de fichiers qui est source d’erreur).

Résultat obtenu

[Windows NT x86]
Printer Driver Info 3:
    Version: [3] <= à retenir
    Driver Name: [EPSON SX235Series] <= à retenir
    Architecture: [Windows NTx86] <= à retenir
    Driver Path: [\\<Nom de la machine virtuelle>\print$\W32X86\3\
    Datafile : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FVIFHLE.VIF]
    Configfile : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FUICHLE.DLL]
    Helpfile : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FHLDRHLE.CHM]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FDSPHLE.DLL]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FJBCHLE.DLL]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FCONHLE.DLL]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FAUDHLE.DLL]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FREDHLE.DLL]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_DATO46.EXE]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FUIRHLE.DLL]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FUI1HLE.DLL]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FUIXHLE.DLL]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FUIXHLE.XML]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FCF0HLE.CFG]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FCF0HLE.DEV]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FGRCHLE.DLL]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FPRUHLE.DLL]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FPREHLE.EXE]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FPI1HLE.DAT]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FLMWHLE.DLL]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FLC1HLE.LMC]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FLC2HLE.LMC]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\EPSET32.DLL]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FHM0HLE.DLL]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FMW0HLE.DLL]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FHT0HLE.DLL]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FSR0HLE.DLL]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FHBRHLE.DLL]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FHUTHLE.DLL]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FHUTHLE.EXE]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FHSRHLE.DLL]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FBA6HLE.DLL]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FBL6HLE.DLL]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FBIDHLE.LMD]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FBAPHLE.DLL]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\EBAPI4.DLL]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\EBPBIDI.DLL]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FINSHLE.EXE]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FINSHLE.DAT]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FINSHLE.DLL]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FARNHLE.EXE]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FASKHLE.DLL]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FAIRHLE.DLL]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FAPRHLE.DLL]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FATIHLE.EXE]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FABRHLE.DLL]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FASRHLE.DLL]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FBCSHLE.EXE]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FAIFHLE.DAT]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FGEPHLE.DLL]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FASOHLE.DLL]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_S50RP7.EXE]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_S50ST7.EXE]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FHLIAHLE.CHM]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\OSASOI.EXE]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\OSASOI.CFG]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FUCHLE.EXE]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FURHLE.DLL]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FUWHLE.DLL]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FUDHLE.EXE]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FUFHLE.EXE]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_FUAHLE.EXE]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_UPEULA.EXE]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_UPNFLE.DLL]
    Dependentfiles : [\\< Nom de la machine virtuelle >\print$\W32X86\E_UPNFL0.DAT]
    Monitorname : [ EPSON SX235 Series 32 MonitorBE]
    Defaultdataty p e : [( null )]

Les indications notées « à retenir » serviront plus tard pour la construction de la commande d’ajout des pilotes à la base de donnée de Samba.

Récupération des fichiers du pilote

On doit recopier tout ces fichiers dans /var/lib/samba/printers/W32X86 (ligne path de [print$] dans smb.conf).

On se place dans le répertoire /var/lib/samba/printers/W32X86 dans lequelon aura recopier le script auparavant.

On lance le script par la commande ./ qui récupérera tout les fichiers dans le répertoire /var/lib/samba/printers/W32X86.

Voici le script qui demandera le mot de passe de l’admin samba :

smbclient //<Nom de la machine virtuelle>/print$<<FIN_RECUP
cd W32X86/3
get E_FMAIHLE.DLL
get E_FVIFHLE.VIF
get E_FUICHLE.DLL
get E_FHLDRHLE.CHM
get E_FDSPHLE.DLL
get E_FJBCHLE.DLL
get E_FCONHLE.DLL
get E_FAUDHLE.DLL
get E_FREDHLE.DLL
get E_DATO46.EXE
get E_FUIRHLE.DLL
get E_FUI1HLE.DLL
get E_FUIXHLE.DLL
get E_FUIXHLE.XML
get E_FCF0HLE.CFG
get E_FCF0HLE.DEV
get E_FGRCHLE.DLL
get E_FPRUHLE.DLL
get E_FPREHLE.EXE
get E_FPI1HLE.DAT
get E_FLMWHLE.DLL
get E_FLC1HLE.LMC
get E_FLC2HLE.LMC
get EPSET32.DLL
get E_FHM0HLE.DLL
get E_FMW0HLE.DLL
get E_FHT0HLE.DLL
get E_FSR0HLE.DLL
get E_FHBRHLE.DLL
get E_FHUTHLE.DLL
get E_FHUTHLE.EXE
get E_FHSRHLE.DLL
get E_FBA6HLE.DLL
get E_FBL6HLE.DLL
get E_FBIDHLE.LMD
get E_FBAPHLE.DLL
get EBAPI4.DLL
get EBPBIDI.DLL
get E_FINSHLE.EXE
get E_FINSHLE.DAT
get E_FINSHLE.DLL
get E_FARNHLE.EXE
get E_FASKHLE.DLL
get E_FAIRHLE.DLL
get E_FAPRHLE.DLL
get E_FATIHLE.EXE
get E_FABRHLE.DLL
get E_FASRHLE.DLL
get E_FBCSHLE.EXE
get E_FAIFHLE.DAT
get E_FGEPHLE.DLL
get E_FASOHLE.DLL
get E_S50RP7.EXE
get E_S50ST7.EXE
get E_FHLIAHLE.CHM
get OSASOI.EXE
get OSASOI.CFG
get E_FUCHLE.EXE
get E_FURHLE.DLL
get E_FUWHLE.DLL
get E_FUDHLE.EXE
get E_FUFHLE.EXE
get E_FUAHLE.EXE
get E_UPEULA.EXE
get E_UPNFLE.DLL
get E_UPNFL0.DAT
quit
FIN_RECUP

Ajout du pilote dans la base de données de Samba

Une fois la récupération des fichiers du pilote, il faut encore ajouté celui-ci dans la base de données des pilotes de Samba.

Voici le script préalablement recopié dans /var/lib/samba/printers/W32X86 qui se lance avec la commande ./nom_du_script.

rpcclient -c ’adddriver "Windows NT x86" "EPSON SX235 Series:E_FMAIHLE.DLL:E_FVIFHLE.VIF:E_FUICHLE.DLL :
E_FHLDRHLE.CHM:EPSON SX235 Series 32 MonitorBE:NULL:E_FDSPHLE.DLL,E_FJBCHLE.DLL,E_FCONHLE.DLL,E_FAUDHLE
. DLL,E_FREDHLE.DLL,E_DATO46.EXE,E_FUIRHLE.DLL,E_FUI1HLE.DLL,E_FUIXHLE.DLL,E_FUIXHLE.XML,E_FCF0HLE.CFG ,
E_FCF0HLE.DEV,E_FGRCHLE.DLL,E_FPRUHLE.DLL,E_FPREHLE.EXE,E_FPI1HLE.DAT,E_FLMWHLE.DLL,E_FLC1HLE.LMC ,
E_FLC2HLE.LMC,EPSET32.DLL,E_FHM0HLE.DLL,E_FMW0HLE.DLL,E_FHT0HLE.DLL,E_FSR0HLE.DLL,E_FHBRHLE.DLL ,
E_FHUTHLE.DLL,E_FHUTHLE.EXE,E_FHSRHLE.DLL,E_FBA6HLE.DLL,E_FBL6HLE.DLL,E_FBIDHLE.LMD,E_FBAPHLE.DLL ,
EBAPI4.DLL,EBPBIDI.DLL,E_FINSHLE.EXE,E_FINSHLE.DAT,E_FINSHLE.DLL,E_FARNHLE.EXE,E_FASKHLE.DLL,E_FAIRHLE .
DLL,E_FAPRHLE.DLL,E_FATIHLE.EXE,E_FABRHLE.DLL,E_FASRHLE.DLL,E_FBCSHLE.EXE,E_FAIFHLE.DAT,E_FGEPHLE.DLL ,
E_FASOHLE.DLL,E_S50RP7.EXE,E_S50ST7.EXE,E_FHLIAHLE.CHM,OSASOI.EXE,OSASOI.CFG,E_FUCHLE.EXE,E_FURHLE.DLL ,
E_FUWHLE.DLL,E_FUDHLE.EXE,E_FUFHLE.EXE,E_FUAHLE.EXE,E_UPEULA.EXE,E_UPNFLE.DLL,E_UPNFL0.DAT" "3"’
< Nom  de la machine virtuelle >

Attention tout doit tenir sur une seule ligne sans aucun retour ligne.

Les « : » et la « , » séparant les noms de fichiers sont impératifs. Il ne doit y avoir aucune espace entre les « : » et « , » et le texte qui les suit.

Tout doit être collé en dehors du texte entre guillemets séparé par une espace.

Les antislash ne servent que de façon esthétique à couper une ligne qui ne tiendrait pas dans la page sinon. Il ne faut absolument pas les recopier ou intégrer.

Vous devriez obtenir le message suivant si l’installation est réussie :

Printer Driver EPSON SX235 Seriessuccessfully installed

Si à ce moment vous obtenez un message d’erreur c’est très certainement que vous avez oublié une virgule ou des double points, avez mis une espace de trop. Revérifiez bien ces points avant de continuer.

Petite explication de la conception de cette longue ligne qui reprend les informations obtenues lors de la récupération des noms de fichiers du driver

Les informations sont intégrées dans la ligne du script dans l’ordre donné ci-dessus.

L’utilisation des couleur permet de se repérer facilement.

Les 3 lignes suivantes nécessitent une explication complémentaire.

  1. rpcclient −c ’addriver : commande d’ajout du driver.
  2. Windows NT x86 : 1re ligne obtenue lors de la récupération des fichiers du driver. Il s’agit de l’architecture cible.
  3. EPSON SX235 Series : Driver Name.
  4. E_FMAIHLE.DLL : Driver Path.
  5. E_FVIFHLE.VIF : Datafile.
  6. E_FUICHLE.DLL : Configfile.
  7. E_FHLDRHLE.CHM : Helpfile.
  8. EPSON SX235 Series 32MonitorBE => Monitorname : si inexistant remplacer par NULL
  9. NULL => Defaultdatatype : si existant remplacer par la chaîne de caractères
  10. E_FDSPHLE.DLL, … ,E_UPNFL0.DAT : les Dependent files
  11. "3" => Type du pilote pour Windows. J’ai forcé cette information explicitement car bien que de type 3 ces pilotes étaient considérés de type 2 par Samba. Cela ne coûte rien d’ajouter cette information et assure que le type des pilotes sera correctement pris en compte.

Association d’un pilote et d’une imprimante

Une fois le pilote intégré à la base de données, il faut indiquer à Samba quel pilote est associé à quelle imprimante.

C’est le rôle de la commande suivante :

rpcclient ­-­c 'setdriver <nom donné à l'imprimante dans cups>"Nom du pilote d'imprimante (voir Driver Name avec la commande getdriver)"'<nom du serveur samba>

Vous devriez obtenir le message suivant si l’association s’est bien déroulée :

Successfully set <nom donné à l'imprimante dans cups> to driverEPSON SX235 Series.

Une fois tout terminé on peut vérifier ce que nous avons fait sur notre serveur Samba avec la commande suivante :

rpcclient -c 'enumdrivers' <nom du serveur samba>

Voici le résultat de la commande :

Enter root's password:
[Windows NT x86]
Printer Driver Info 1:
Driver Name: [EPSON SX235 Series]
[Windows x64]
Printer Driver Info 1:
Driver Name: [EPSON SX235 Series]

Nous obtenons bien le résultat souhaité qui est d’avoir les pilotes 32 et 64 bits prêts à être envoyés à nos clients windows.

Conclusion

Nous n’avons vu que la partie concernant les pilotes 32 bits. Mais c’est très exactement les mêmes manipulations pour les pilotes 64 bits si ce n’est que le répertoire devant contenir les fichiers du pilote se nomme x64 et non WX32X86.

Les pilotes peuvent avoir les mêmes noms en 32 et 64 bits (cela simplifie les choses d’ailleurs), il n’y a aucun problème ceux-ci étant dans des répertoires distincts.

Remarque importante

Lors de mes expérimentations j’ai supprimé les fichiers se trouvant dans WX32X86. Et là, surprise, l’ajout automatique des pilotes par connexion à l’imprimante ne fonctionnait plus.

Après avoir recopié les fichiers dans WX32X86 tout fonctionnai parfaitement.

J’en déduis qu’il ne faut pas toucher aux fichiers contenus dans ce répertoire malgré que ceux-ci soient recopiés par la commande adddriver dans le sous répertoire WX32X86\3 correspondant au type du pilote d’après la documentation de Samba.

Peut-être un bug ou une manipulation incomplète de ma part, je n’en sais rien. Mais toujours est-il que cela fonctionne. Si j’ai du temps et l’envie je chercherai ce qu’il en est et modifierai éventuellement ce billet.

Commentaires

comments powered by Disqus