Printer Migration: Client Side Script to Change Print Servers
Param([parameter(Mandatory=$true,Position=0, HelpMessage="Old Server")] $OldServer, [parameter(Mandatory=$true,Position=1, HelpMessage="New Server")] $NewServer, [parameter(Mandatory=$true,Position=2, HelpMessage="Workstation Name")] $ThisPC, [parameter(Mandatory=$true,Position=3, HelpMessage="Username")] $ThisUser, [parameter(Mandatory=$true,Position=4, HelpMessage="Path to Log")] $OutputLog) Clear-Host # Example command-line: .\Run-PrintMigration.ps1 -ExecutionPolicy Unrestricted -command "& '\\domain.com\scripts\Run_PrintMigration.ps1' '\\oldserver' '\\newserver' '$WkSta' '$UserID' '\\domain.com\logs$\'" # This procedure adds a new printer Function InstallNewPrinter{ Param ([string]$currentPrinter, [string]$newPrinter) $Global:TextLog += "++ Add: " + $newPrinter #Add new Printer $global:net.AddWindowsPrinterConnection($newPrinter) #Add current printer to the TobeDeleted List $global:PrintersTobeDeleted += $currentPrinter } # This procedure sets the respected new printer default Function SetPrinterDefault{ Param ([string]$defaultPrinter) #If current printer is default, make the new a default printer $global:net.SetDefaultPrinter($defaultPrinter) } # This procedure deletes all the old printer which were replaced by this script. Function DeleteCurrentPrinters{ foreach ($printerTodelete in $global:PrintersTobeDeleted) { $Global:TextLog += "-- Delete: " + $printerTodelete $global:net.RemovePrinterConnection($printerTodelete) } } # Set print server name $Printserver = "." # Uncomment to use these variables for the new/old print server names #$newServer = "\\NEWPRINT" #$oldServer = "\\OLDPRINT" $Global:TextLog = @() $Printers = @() $global:PrintersTobeDeleted = @() $OutputFile = $OutputLog+$ThisUser+"_"+$ThisPC+"_"+[DateTime]::Now.Year.ToString()+[DateTime]::Now.Month.ToString()+[DateTime]::Now.day.ToString()+[DateTime]::Now.hour.ToString()+[DateTime]::Now.Minute.ToString()+[DateTime]::Now.Second.ToString()+".txt" $Global:TextLog += "$OldServer $NewServer $ThisPC $ThisUser $OutputLog" # This section will identify all the installed Network printer under logged in users profile using WMI $Printers = Get-WMIObject Win32_Printer -computername $Printserver -Filter "Network=True" if($Printers) { # This is a blank array to store the installed Network printer under logged in users profile and pass it on $PrintersTobeDeleted = @() $newPrinter = "" $defaultPrinter = "" $Global:TextLog += "Log Start" # Get Network object $global:net = new-Object -com WScript.Network foreach ($Printer in $Printers) { #Check to see if it is a printer connected to the old server if ($Printer.SystemName -like "$oldServer*") { #A check to see if we have to add a new printer $AddNewPrinter = $true #Check to see if the printer also exists in the new server Foreach ($comparePrinter in $Printers) { If (($Printer.shareName -eq $comparePrinter.shareName) -and ($comparePrinter.SystemName -like "$newServer*")) { #Remove old printer by Adding current printer to the TobeDeleted List $global:PrintersTobeDeleted += $Printer.Name #New Printer has already been created no need to add another one. $AddNewPrinter = $false } } #If the new printer does not exist, create a new one if($AddNewPrinter) { switch ($Printer.ShareName) { "OLDPRN01" {$newPrinter = $newServer + "\NEWPRN01"} "OLDPRN02" {$newPrinter = $newServer + "\NEWPRN02"} "OLDPRN03" {$newPrinter = $newServer + "\NEWPRN03"} "OLDPRN04" {$newPrinter = $newServer + "\NEWPRN04"} default {$newPrinter = $newServer + "\" + $Printer.Sharename} } if ($Printer.Default) { $defaultPrinter = $newPrinter } InstallNewPrinter $Printer.Name $newPrinter $newPrinter = "" } } Else { $Global:TextLog += ".. NO Change: " + $Printer.Name } if ($defaultPrinter -ne "") { SetPrinterDefault $defaultPrinter } } DeleteCurrentPrinters $Global:TextLog += "Log End" #Write-output $Global:TextLog #Write-Output $OutputFile $Global:TextLog | Out-File $OutputFile }