Serveur d'impression

Utiliser un script de connexion PowerShell pour mettre à jour les mappages d'imprimantes | Apprendre Powershell – Serveur d’impression

Le 24 novembre 2019 - 2 minutes de lecture

On m'a récemment demandé de proposer une solution PowerShell pour redistribuer toutes les imprimantes de notre domaine d'un serveur d'impression 32 bits à un serveur d'impression 64 bits. Cela devait être fait à l'ouverture de session, ce qui voulait dire qu'il devait s'agir d'un script d'ouverture de session. Heureusement, nous utilisons Windows 7, ce qui en fait un candidat idéal pour un script de connexion PowerShell!

Les exigences de ce script d'ouverture de session sont les suivantes:

  • Ne nécessite aucune interaction de l'utilisateur
  • Mappe la même imprimante sur le nouveau serveur que l'ancien serveur (les serveurs migrés conservent le même nom d'imprimante Vieux: \ Server1 B24-R Nouveau: \ Server2 B24-R)
  • Supprimer l'ancien mappage d'imprimante
  • Ecrire un fichier journal de la suppression, l'ajout et les erreurs rencontrées dans un répertoire partagé

La première exigence est quasiment irréfléchie. Si vous écrivez un script d'ouverture de session, il est préférable de ne pas demander d'effort à l'utilisateur. Heureusement, nous avons pu tirer parti de la fonctionnalité de Windows 2008 R2 qui permettait à vos scripts de connexion pour la stratégie de groupe de spécifier un script PowerShell en tant que script de connexion. Cela fera automatiquement en sorte que le script s'exécute avec le Contourne stratégie d'exécution et l'exécute dans une fenêtre cachée.

Param (
    $ newPrintServer = "Server2",
    $ PrinterLog = "\ LogSVR  PrintMigration $  PrintMigration.csv"
)
<#
    #Header for CSV log file:
    "COMPUTERNAME,USERNAME,PRINTERNAME,RETURNCODE-ERRORMESSAGE,DATETIME,STATUS" | 
        Out-File -FilePath $PrinterLog -Encoding ASCII
#>

Cette partie est la configuration initiale des paramètres pour inclure le nouveau serveur d'impression et le journal qui sera utilisé pour suivre les mappages (répondant aux exigences de la journalisation). Le bloc de commentaires est le code qui doit être exécuté en premier pour configurer le fichier journal. Remarque: Ce script suppose que vous utilisez PowerShell V2. Si vous exécutez la V3, vous pouvez ignorer cela et mettre à jour les commandes Out-File avec Export-Csv avec le paramètre –Append.

Essayez {
    Write-Verbose ("0: vérification des imprimantes mappées sur l'ancien serveur d'impression" -f $ Env: USERNAME)
    $ printers = @ (Get-WmiObject -Class Win32_Printer -Filter "SystemName = '\\ Server1'" -ErrorAction Stop)
    
    Si ($ printers.count -gt 0) 
        ForEach ($ imprimante dans $ imprimantes) 
            Write-Verbose ("0: remplacement par un nouveau nom de serveur d'impression: 1" -f $ Printer.Name, $ newPrintServer)
            $ newPrinter = $ printer.Name -replace "Server1", $ newPrintServer
            $ returnValue = ([wmiclass]"Win32_Printer"). AddPrinterConnection ($ newPrinter) .ReturnValue   

Je vérifie d'abord qu'il existe encore d'anciens mappages de serveur d'impression avant de continuer avec le script d'ouverture de session. Une fois que cela est fait, je parcourt ensuite chaque ancien mappage d'imprimantes et effectue un remplacement de l'ancien serveur d'impression par un nouveau. Cela sera ensuite utilisé pour tenter de mapper vers le nouveau serveur d'impression. Je conserve la valeur de retour de la tentative de connexion à l'imprimante à l'aide de la classe Win32_Printer et de la méthode AddPrinterConnection (). Ceci est utilisé dans la partie suivante du script pour déterminer l'action suivante.

                                                Si ($ returnValue -eq 0)  Out-File -FilePath $ PrinterLog -Append -Encoding ASCII
             Autre 
                Write-Verbose ("0 a renvoyé le code d'erreur: 1" -f $ newPrinter, $ returnValue) -Verbose
                "0, 1, 2, 3, 4, 5" -f $ Env: NOMORDINATEUR,
                                             $ env: USERNAME,
                                             $ newPrinter,
                                             $ returnValue,
                                             (Avoir un rendez-vous),
                                             "Erreur lors de l'ajout d'une imprimante" 
        
    
} Capture  Out-File -FilePath $ PrinterLog -Append -Encoding ASCII

Le reste du code gère ce qui se passe en fonction de la valeur de retour. Si la valeur est 0, cela signifie que la connexion a été établie et enregistrée. Tout le reste est considéré comme un échec et sera ensuite enregistré comme tel. Une fois la connexion établie, la suppression du mappage de l’autre imprimante est alors effectuée. Une fois terminé, celui-ci est enregistré et le processus se poursuit jusqu'à ce que toutes les imprimantes soient prises en charge. Un exemple de fichier journal est ci-dessous:

Sommaire

Code complet

<#
    .SYNOPSIS
        Logon Script to migrate printer mapping
    
    .DESCRIPTION
        Logon Script to migrate printer mappings
    
    .NOTES
        Author: Boe Prox
        Create: 09 NOV 2012
        Modified:
        Version 1.0 - Initial Script Creation
                1.1 Added Header Text for CSV file
#>



Param (
    $ newPrintServer = "Server2",
    $ PrinterLog = "\ LogSVR  PrintMigration $  PrintMigration.csv"
)
<#
    #Header for CSV log file:
    "COMPUTERNAME,USERNAME,PRINTERNAME,RETURNCODE-ERRORMESSAGE,DATETIME,STATUS" | 
        Out-File -FilePath $PrinterLog -Encoding ASCII
#>
Essayez {
    Write-Verbose ("0: vérification des imprimantes mappées sur l'ancien serveur d'impression" -f $ Env: USERNAME)
    $ printers = @ (Get-WmiObject -Class Win32_Printer -Filter "SystemName = '\\ Server1'" -ErrorAction Stop)
    
    Si ($ printers.count -gt 0) 
        ForEach ($ imprimante dans $ imprimantes) 
            Write-Verbose ("0: remplacement par un nouveau nom de serveur d'impression: 1" -f $ Printer.Name, $ newPrintServer)
            $ newPrinter = $ printer.Name -replace "Server1", $ newPrintServer
            $ returnValue = ([wmiclass]"Win32_Printer"). AddPrinterConnection ($ newPrinter) .ReturnValue
            Si ($ returnValue -eq 0)  Out-File -FilePath $ PrinterLog -Append -Encoding ASCII
             Autre 
                Write-Verbose ("0 a renvoyé le code d'erreur: 1" -f $ newPrinter, $ returnValue) -Verbose
                "0, 1, 2, 3, 4, 5" -f $ Env: NOMORDINATEUR,
                                             $ env: USERNAME,
                                             $ newPrinter,
                                             $ returnValue,
                                             (Avoir un rendez-vous),
                                             "Erreur lors de l'ajout d'une imprimante" 
        
    
} Capture  Out-File -FilePath $ PrinterLog -Append -Encoding ASCII

Commentaires

Laisser un commentaire

Votre commentaire sera révisé par les administrateurs si besoin.