locked
Déploiement en ligne de commandes des imprimantes réseaux RRS feed

  • Question

  • Bonjour,

    Quelle méthode faut-il employer pour déployer les imprimantes réseaux, au travers de ligne de commande ?
    Je précise :
    + Le serveur d'impression (W2K8_R2_64) est opérationnel avec toutes les files d'attentes et les pilotes 32 et 64 bits..
    + L'ancien serveur d'impression (W2K8_32) sera arrêté plus tard.
    + Les utilisateurs se servent de l'ancien serveur d'impression.

    Le but est de lister pour chaque PC la ou les files d'attente des imprimantes et de les recréer avec le nouveau chemin et forcement les nouveaux pilotes, en ligne de commande (batch ou PowerShell).

    (il me sera très difficile de créer des groupes AD pour chaque imprimante, et d'utiliser le logonscript)

    Cdlt,



    • Modifié Cerkyr vendredi 29 juin 2018 14:21
    vendredi 29 juin 2018 14:19

Réponses

  • ' Thierry DEMAN (tdeman@free.fr)
    Dim CleReg,arrSubkeys,StrComputer
    Dim imp1(),imp2(),srv1(),srv2(),i,nbi,x
    
    dim Queue,Server,file,objfs,WshShell
    
    
    
    'Lecture des arguments
    If WScript.Arguments.named.Count=0 Then
      MsgBox("Mov printers Tool"+Newline+"Usage: movPrinter.vbs"+Newline+"Necessary Option /P:printerFile")
      wscript.quit
    End If
    
    If WScript.Arguments.Named.exists("P") Then
      PrinterFile=WScript.Arguments.Named.Item("P")
    End If
    
    SET objFS=CreateObject ("Scripting.FileSystemObject")
    Set WshShell = WScript.CreateObject ("WScript.Shell")
    
    'Lecture de clé de registre
    
    CleReg="Printers\connections"
    Const HKEY_CURRENT_USER = &H80000001 
    
    strComputer = "."
    
    nbi=ChargeImprimantes(PrinterFile)
    'wscript.echo nbi
    
    Set objRegistry = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv") 
    
    objRegistry.EnumKey HKEY_CURRENT_USER, CleReg, arrSubkeys 
    If IsArray(arrSubkeys) Then 
      For Each strSubkey In arrSubkeys 
        x=instr(3,strSubkey,",")+1
        server=mid(strsubkey,3,x-4)
        queue=mid(strsubkey,x)
    '    wscript.echo "\\"+server+"\"+queue
        for i=1 To NBI
          If Ucase(Server)=Ucase(srv1(i)) AND ucase(Queue)=Ucase(imp1(i)) Then
            wscript.echo "Replace \\"+srv1(i)+"\"+imp1(i)+" By \\"+srv2(i)+"\"+imp2(i)
            objRegistry.DeleteKey HKEY_CURRENT_USER, CleReg +"\"+ strSubkey
            nk=CleReg +"\,,"+srv2(i)+","+imp2(i)
            objRegistry.CreateKey HKEY_CURRENT_USER, nk
            objRegistry.SetStringValue HKEY_CURRENT_USER,nk,"Provider","win32spl.dll"
            objRegistry.SetStringValue HKEY_CURRENT_USER,nk,"Server","\\"+srv2(i)
    
            ObjRegistry.getStringValue HKEY_CURRENT_USER,"Software\Microsoft\Windows NT\CurrentVersion\Devices","\\"+srv1(i)+"\"+imp1(i),OldDevice
            objRegistry.Deletevalue HKEY_CURRENT_USER, "Software\Microsoft\Windows NT\CurrentVersion\Devices","\\"+srv1(i)+"\"+imp1(i)
            objRegistry.SetStringValue HKEY_CURRENT_USER,"Software\Microsoft\Windows NT\CurrentVersion\Devices","\\"+srv2(i)+"\"+imp2(i),OldDevice
    
            DefaultPrinter = WshShell.RegRead("HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows\Device")
            DefaultPrinter = replace(ucase(DefaultPrinter),Ucase("\\"+srv1(i)+"\"+imp1(i)),"\\"+srv2(i)+"\"+imp2(i))
            wshShell.regwrite "HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows\Device", DefaultPrinter
          End If
        next 
      Next 
    End If 
    
    Function ChargeImprimantes(sfile)
    i=0
    on error resume next
    Set File = objFS.OpenTextFile( sFile, 1)
    if err.number<>0 Then
      wscript.echo "No replacement printers file"
      err.clear
      wscript.quit
    End If
    on error goto 0
    Do While not File.AtEndOfStream
      sLigne=trim(File.readLine)
      IF left(sligne,1)<>";" Then
        i=i+1
        redim Preserve imp1(i),imp2(i),srv1(i),srv2(i)
        x=instr(sligne,",")
        srv1(i)=left(sligne,x-1)
        sligne=mid(sligne,x+1)
    
        x=instr(sligne,",")
        imp1(i)=left(sligne,x-1)
        sligne=mid(sligne,x+1)
    
        x=instr(sligne,",")
        srv2(i)=left(sligne,x-1)
        imp2(i)=mid(sligne,x+1)
    '  wscript.echo srv1(i),imp1(i),srv2(i),imp2(i)
      End If
    Loop
    File.Close
    
    If i=0 Then
      wscript.echo "No replacement programmed"
      wscript.quit
    End If
    
    ChargeImprimantes=i
    
    End Function
    


    Thierry DEMAN. Exchange MVP. MCSE:Messaging 2013,MCSE:Server Infrastructure 2012(83 MCPs). MCSA Office 365 https://mvp.microsoft.com/en-us/mvp/Thierry%20Deman-7660 http://base.faqexchange.info

    lundi 2 juillet 2018 16:37

Toutes les réponses

  • Bonjour,

    soit l'on sait qui utilise quoi, et l'on peut utiliser les stratégies pour "mapper" les imprimantes sur les bons groupes/utilisateurs.

    soit on ne sait pas, et là, le script de connexion est la meilleure solution.

    En fait plusieurs exemples de script ont été publiés récemment...

    Il n'est pas nécessaire de connaître les drivers/pilotes ou autres, du moment que l'on connaît le nom du/des serveurs sources, les noms des partages actuellement utilisés, et la destination.

    Le script parcourt les imprimantes connectées de l'utilisateur et met à jour avec la destination.

    Le fichier texte de paramètre est sous la forme, Il contient autant de lignes que d'imprimantes à mettre à jour

    serveurSource,PARTAGEsource,ServeurDestination,PARTAGEDestination

    Seuls les utilisateurs possédant une ou plusieurs imprimantes de la liste sont mis à jour...

    http://base.faqexchange.info/TOUTE%20LA%20DOCUMENTATION%20EST%20ICI/Scripting/VbScript/movprinter.vbs.txt

    Le script est indépendant du système 32 ou 64 bits.

    A bientôt,


    Thierry DEMAN. Exchange MVP. MCSE:Messaging 2013,MCSE:Server Infrastructure 2012(83 MCPs). MCSA Office 365 https://mvp.microsoft.com/en-us/mvp/Thierry%20Deman-7660 http://base.faqexchange.info

    • Proposé comme réponse matteu31400 lundi 2 juillet 2018 06:36
    vendredi 29 juin 2018 16:40
  • Malheureusement, l'URL proposée est bloquée par la sécurité informatique de l'entreprise ....
    lundi 2 juillet 2018 12:48
  • ' Thierry DEMAN (tdeman@free.fr)
    Dim CleReg,arrSubkeys,StrComputer
    Dim imp1(),imp2(),srv1(),srv2(),i,nbi,x
    
    dim Queue,Server,file,objfs,WshShell
    
    
    
    'Lecture des arguments
    If WScript.Arguments.named.Count=0 Then
      MsgBox("Mov printers Tool"+Newline+"Usage: movPrinter.vbs"+Newline+"Necessary Option /P:printerFile")
      wscript.quit
    End If
    
    If WScript.Arguments.Named.exists("P") Then
      PrinterFile=WScript.Arguments.Named.Item("P")
    End If
    
    SET objFS=CreateObject ("Scripting.FileSystemObject")
    Set WshShell = WScript.CreateObject ("WScript.Shell")
    
    'Lecture de clé de registre
    
    CleReg="Printers\connections"
    Const HKEY_CURRENT_USER = &H80000001 
    
    strComputer = "."
    
    nbi=ChargeImprimantes(PrinterFile)
    'wscript.echo nbi
    
    Set objRegistry = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv") 
    
    objRegistry.EnumKey HKEY_CURRENT_USER, CleReg, arrSubkeys 
    If IsArray(arrSubkeys) Then 
      For Each strSubkey In arrSubkeys 
        x=instr(3,strSubkey,",")+1
        server=mid(strsubkey,3,x-4)
        queue=mid(strsubkey,x)
    '    wscript.echo "\\"+server+"\"+queue
        for i=1 To NBI
          If Ucase(Server)=Ucase(srv1(i)) AND ucase(Queue)=Ucase(imp1(i)) Then
            wscript.echo "Replace \\"+srv1(i)+"\"+imp1(i)+" By \\"+srv2(i)+"\"+imp2(i)
            objRegistry.DeleteKey HKEY_CURRENT_USER, CleReg +"\"+ strSubkey
            nk=CleReg +"\,,"+srv2(i)+","+imp2(i)
            objRegistry.CreateKey HKEY_CURRENT_USER, nk
            objRegistry.SetStringValue HKEY_CURRENT_USER,nk,"Provider","win32spl.dll"
            objRegistry.SetStringValue HKEY_CURRENT_USER,nk,"Server","\\"+srv2(i)
    
            ObjRegistry.getStringValue HKEY_CURRENT_USER,"Software\Microsoft\Windows NT\CurrentVersion\Devices","\\"+srv1(i)+"\"+imp1(i),OldDevice
            objRegistry.Deletevalue HKEY_CURRENT_USER, "Software\Microsoft\Windows NT\CurrentVersion\Devices","\\"+srv1(i)+"\"+imp1(i)
            objRegistry.SetStringValue HKEY_CURRENT_USER,"Software\Microsoft\Windows NT\CurrentVersion\Devices","\\"+srv2(i)+"\"+imp2(i),OldDevice
    
            DefaultPrinter = WshShell.RegRead("HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows\Device")
            DefaultPrinter = replace(ucase(DefaultPrinter),Ucase("\\"+srv1(i)+"\"+imp1(i)),"\\"+srv2(i)+"\"+imp2(i))
            wshShell.regwrite "HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows\Device", DefaultPrinter
          End If
        next 
      Next 
    End If 
    
    Function ChargeImprimantes(sfile)
    i=0
    on error resume next
    Set File = objFS.OpenTextFile( sFile, 1)
    if err.number<>0 Then
      wscript.echo "No replacement printers file"
      err.clear
      wscript.quit
    End If
    on error goto 0
    Do While not File.AtEndOfStream
      sLigne=trim(File.readLine)
      IF left(sligne,1)<>";" Then
        i=i+1
        redim Preserve imp1(i),imp2(i),srv1(i),srv2(i)
        x=instr(sligne,",")
        srv1(i)=left(sligne,x-1)
        sligne=mid(sligne,x+1)
    
        x=instr(sligne,",")
        imp1(i)=left(sligne,x-1)
        sligne=mid(sligne,x+1)
    
        x=instr(sligne,",")
        srv2(i)=left(sligne,x-1)
        imp2(i)=mid(sligne,x+1)
    '  wscript.echo srv1(i),imp1(i),srv2(i),imp2(i)
      End If
    Loop
    File.Close
    
    If i=0 Then
      wscript.echo "No replacement programmed"
      wscript.quit
    End If
    
    ChargeImprimantes=i
    
    End Function
    


    Thierry DEMAN. Exchange MVP. MCSE:Messaging 2013,MCSE:Server Infrastructure 2012(83 MCPs). MCSA Office 365 https://mvp.microsoft.com/en-us/mvp/Thierry%20Deman-7660 http://base.faqexchange.info

    lundi 2 juillet 2018 16:37