I'm trying to install a printer driver on a Windows 7 machine via a Powershell v2 script. I have everything now to get the port and driver installed and configured properly but I can't seem to find anything in regards on how to set print server property forms.
I'm in need of a way to set the print server property forms to get the correct sizes for printing. Does anyone know where these sizes are stored in Windows or the registry?
For reference, here is what I have so far in regards to the script:
# Printer Info
$printerID = "HP Designjet Z3200 24in Photo"
$printerID1 = "HP Designjet Z3200 24in Photo - Canvas"
$printerID2 = "HP Designjet Z3200 24in Photo - Cover"
$printerIP = Read-Host 'What is the Poster Printer IP Address?'
$portName = $printerIP
$portName1 = $printerIP + "_1"
$portName2 = $printerIP + "_2"
$printerModel = "HP Designjet Z3200 24in Photo"
$driverINFPath = "C:\V5\HP WFP\Driver\hpdjz3200serieswx64pcl\hpi32pxs.inf"
$driverConfigPath = "C:\V5\HP WFP\Config\Photo.dat"
$driverConfigPath1 = "C:\V5\HP WFP\Config\Canvas.dat"
$driverConfigPath2 = "C:\V5\HP WFP\Config\Cover.dat"
#installs the printer port
Function CreatePort {
param ($printerIP, $portName)
$newPort = ([wmiclass]"Win32_TcpIpPrinterPort").CreateInstance()
$newPort.HostAddress = $printerIP
$newPort.Name = $portName
$newPort.portNumber = "9100"
$newPort.Protocol = "1"
$newPort.SNMPEnabled = $true
$newPort.Put()
}
CreatePort -printerIP $printerIP -portName $portName
CreatePort -printerIP $printerIP -portName $portName1
CreatePort -printerIP $printerIP -portName $portName2
#installs the printer driver and printer
printui.exe /if /b "$printerID" /f "$driverINFPath" /u /r "$portName" /m "$printerModel"
Start-Sleep -s 10
printui.exe /if /b "$printerID1" /f "$driverINFPath" /u /r "$portName1" /m "$printerModel"
Start-Sleep -s 10
printui.exe /if /b "$printerID2" /f "$driverINFPath" /u /r "$portName2" /m "$printerModel"
#Configures the printer from specified file
printui.exe /Sr /n "$printerID" /a "$driverConfigPath" d g r
Start-Sleep -s 10
printui.exe /Sr /n "$printerID1" /a "$driverConfigPath1" d g r
Start-Sleep -s 10
printui.exe /Sr /n "$printerID2" /a "$driverConfigPath2" d g r
You could use the [System.Printing]
.Net class for WPF applications. Here's a function that I converted from a script that I made to set Duplex and Color Modes.
Function Set-PrinterPageSize {
param (
[string]$PrinterName,
[ValidateSet("NorthAmericaLegal","NorthAmerica11x17","NorthAmericaLetter")]
[String]
$PageSize
)
Try {
#Set Perms to a variable to use when constructing instance of PrintServer
$Permissions = [System.Printing.PrintSystemDesiredAccess]::AdministrateServer
#Set Perms to a variable to use when retrieving Queues from PrintServer
$QueuePerms = [System.Printing.PrintSystemDesiredAccess]::AdministratePrinter
#Construct using PrintServer as using LocalPrintServer
$PrintServer = new-object System.Printing.LocalPrintServer -argumentList $Permissions
#Create New Queue object to assign properties to WITH permissions to change settings (getting queue from printserver won't have perms)
$NewQueue = new-object System.Printing.PrintQueue -argumentList $PrintServer,$PrinterName,1,$QueuePerms
#Check that Queue is capable of that page size, and set if so
$PageCaps = $NewQueue.GetPrintCapabilities().PageMediaSizeCapability
if ($null -ne $PageCaps) {
if ($PageCaps.PageMediaSizeName.Contains([System.Printing.PageMediaSizeName]::$PageSize)) {
#Set Page Size in default settings
$NewQueue.DefaultPrintTicket.PageMediaSize = [System.Printing.PageMediaSizeName]::$PageSize
#Win7 also requires setting userprint ticket
$NewQueue.UserPrintTicket.PageMediaSize = [System.Printing.PageMediaSizeName]::$PageSize
} else {
Write-Warning "$PageSize unavailable"
}
}
#Save changes and cleanup
$NewQueue.commit()
$NewQueue.dispose()
$PrintServer.commit()
$PrintServer.dispose()
}
Catch {
Write-Warning "Error Setting $PrinterName to $PageSize"
}
}