We have a number of 32-bit Windows 2008 print servers that we want to migrate to Windows Server 2012, for the printer management PowerShell cmdlets, among other things. I found a helpful blog post about using the PRINTBRM utility to migrate print queues, which mentions that you need to have both 32-bit and 64-bit drivers versions of all the drivers in order to migrate from a 32-bit to a 64-bit OS instance.
I wrote a little script to quickly show me which print drivers need a 64-bit version installed. It can take a moment to run if you have many printers configured.
UPDATE: I made a couple changes, most notably that the count of printers using a driver is now optional (since it can take a while on a system with lots of printers).
<# .SYNOPSIS Lists printer drivers, whether 32- and 64-bit versions are installed, and how many printers are using each driver. .PARAMETER Printers Includes a counter of the printers using each printer driver. On a system with many installed printers, this can take a a little time, so this functionality is optional. .EXAMPLE PS C:\local\scripts> .\Get-PrinterDriverArchitecture.ps1 | format-table -auto Name x86 x64 ---- --- --- Brother HL-5250DN True False Epson LQ-570+ ESC/P 2 True False HP Business Inkjet 2230/2280 True False HP Business Inkjet 2250 (PCL5C) True True HP Business Inkjet 2800 PCL 5 True False This command lists the installed printer drivers, and whether 32-bit (x86) or 64-bit (x64) drivers are available. .EXAMPLE PS C:\local\scripts> .\Get-PrinterDriverArchitecture.ps1 | where x64 -eq $false | ft -a Name x86 x64 ---- --- --- Brother HL-5250DN True False Epson LQ-570+ ESC/P 2 True False HP Business Inkjet 2230/2280 True False HP Business Inkjet 2800 PCL 5 True False This command uses the Where[-Object] cmdlet to filter out those drivers that have a 64-bit driver installed. .EXAMPLE PS C:\local\scripts> .\Get-PrinterDriverArchitecture.ps1 -Printers | ft -a Enumerating printers: WID - Kyocera TASKalfa 3050ci KX WC - Kyocera TASKalfa 300ci KX UFS - Canon iR-ADV C5035 ... Name x86 x64 Printers ---- --- --- -------- Brother HL-5250DN True False 5 Epson LQ-570+ ESC/P 2 True False 0 HP Business Inkjet 2230/2280 True False 1 HP Business Inkjet 2250 (PCL5C) True True 0 HP Business Inkjet 2800 PCL 5 True False 1 This command includes the -Printers switch parameter to add a count of the printers using each driver. Enumerating the printers can take a while if there are lots of them installed, so this behavior is optional. .NOTES - Author : Geoffrey.Duke@uvm.edu - Mod. Date : May 28, 2013 #> param( [switch] $printers ) $wmi_drivers = get-wmiobject Win32_PrinterDriver -Property Name $drivers = @{} foreach ($driver in $wmi_drivers) { # Isolate the driver name and platform $name,$null,$platform = $driver.Name -split ',' if ( -not $drivers[$name] ) { switch ( $platform ) { 'Windows NT x86' { $drivers[$name] = [ordered]@{ 'Name'=$name; 'x86'=$true; 'x64'=$false }; break } 'Windows x64' { $drivers[$name] = [ordered]@{ 'Name'=$name; 'x86'=$false; 'x64'=$true }; break } default { write-warning "Unexpect platform $platform on driver $name"} } } else { switch ( $platform ) { 'Windows x64' { $drivers[$name]['x64'] = $true; break } 'Windows NT x86' { $drivers[$name]['x86'] = $true; break } default { write-warning "Unexpect platform $platform on driver $name"} } } } if ( $printers ) { # Initialize all printer counts $drivers.keys | foreach { $drivers[$_]['Printers'] = 0 } # Add a count of the number of printers using each driver # With some progress info write-host 'Enumerating printers:' $count = 0 get-wmiobject Win32_Printer -Property Name,DriverName | foreach { write-host " $($_.Name)" -foreground darkgray $drivers[$_.DriverName]['Printers']++ $count++ } write-host "Retrieved $count printers" } # Output collection of objects $drivers.keys | sort | foreach { New-Object PSObject -Property $drivers[$_] }
I hope this is useful to others.
I made a couple changes, most notably that the count of printers using a driver is now optional (since it can take a while on a system with lots of printers).