How to Set Up a Print Server on Windows Server 2025

A dedicated print server centralizes printer management across an organization, reducing the administrative burden of maintaining drivers and connections on individual workstations. Windows Server 2025 includes a robust Print Server role with full PowerShell management capabilities, enabling automated deployment of printers, drivers, and ports—along with centralized job management and Group Policy-based printer deployment to client machines. This tutorial walks through installing the Print Server role, adding TCP/IP ports, installing printer drivers, sharing printers, deploying connections via Group Policy, and managing print jobs using both the Print Management console and PowerShell.

Prerequisites

  • Windows Server 2025 (Standard or Datacenter edition)
  • Static IP address assigned to the print server
  • Network-connected printers with known IP addresses or hostnames
  • Printer driver packages (INF files or setup executables) for each printer model
  • Domain membership (required for Group Policy-based deployment)
  • Local Administrator rights on the server

Step 1: Install the Print Server Role

The Print Server role installs the Print Spooler service, the Print Management console (printmanagement.msc), and the PowerShell PrintManagement module. The -IncludeManagementTools flag ensures all management utilities are included.

# Install the Print and Document Services role with all management tools
Install-WindowsFeature Print-Server -IncludeManagementTools

# Verify the installation
Get-WindowsFeature Print-Server | Select-Object Name, InstallState

# Confirm the Print Spooler service is running
Get-Service Spooler | Select-Object Name, Status, StartType

# Set Spooler to automatic start (should already be set, but verify)
Set-Service -Name Spooler -StartupType Automatic
Start-Service -Name Spooler

# Open Print Management console (GUI)
# printmanagement.msc

# Import the PrintManagement PowerShell module
Import-Module PrintManagement
Get-Command -Module PrintManagement | Select-Object Name | Sort-Object Name

Step 2: Adding Printer Ports

Before adding a printer, you must create a port that defines how the server communicates with the physical printer. The Standard TCP/IP port (TCPIP) is the most common for network printers. LPR ports are used for Unix/Linux print servers and older network-attached devices.

# Add a Standard TCP/IP port for a network printer
Add-PrinterPort -Name "IP_192.168.1.100" `
    -PrinterHostAddress "192.168.1.100" `
    -PortNumber 9100

# Add a second Standard TCP/IP port for another printer
Add-PrinterPort -Name "IP_192.168.1.101" `
    -PrinterHostAddress "192.168.1.101" `
    -PortNumber 9100

# Add an LPR port (for Unix/Linux print server compatibility)
Add-PrinterPort -Name "LPR_192.168.1.102" `
    -PrinterHostAddress "192.168.1.102" `
    -LprHostPrinter "lp" `
    -LPRQ

# List all configured printer ports
Get-PrinterPort | Select-Object Name, PrinterHostAddress, PortNumber | Format-Table -AutoSize

# Remove a port (only possible if no printer is using it)
Remove-PrinterPort -Name "IP_192.168.1.101" -Confirm:$false

Step 3: Installing Printer Drivers

Windows Server 2025 includes a selection of built-in generic drivers, but manufacturer-specific drivers provide full feature access (duplex, tray selection, stapling). Drivers must be installed on the print server before printers can be added.

# List currently installed printer drivers
Get-PrinterDriver | Select-Object Name, Manufacturer, DriverVersion | Format-Table -AutoSize

# Add a built-in generic PCL driver
Add-PrinterDriver -Name "Generic / Text Only"

# Install a manufacturer driver from an INF file
# First, stage the driver package into the driver store
pnputil.exe /add-driver "C:DriversHP_LaserJethpljp.inf" /install

# Then add it to the print server driver store
Add-PrinterDriver -Name "HP LaserJet PCL 6" `
    -InfPath "C:DriversHP_LaserJethpljp.inf"

# Add a driver from the already-installed driver store
Add-PrinterDriver -Name "HP Universal Printing PCL 6"

# Verify driver was added
Get-PrinterDriver -Name "HP Universal Printing PCL 6" | Format-List *

# Remove an unused driver
Remove-PrinterDriver -Name "Generic / Text Only" -Confirm:$false

Step 4: Adding and Sharing Printers

With ports and drivers in place, you can add printers to the server and immediately share them. The share name is what domain clients use to connect (\printserverShareName).

# Add a printer using the port and driver configured above
Add-Printer `
    -Name "HP-LaserJet-Floor2" `
    -DriverName "HP Universal Printing PCL 6" `
    -PortName "IP_192.168.1.100" `
    -Location "Building A, Floor 2" `
    -Comment "HP LaserJet managed by IT - Floor 2"

# Share the printer with a clean share name
Set-Printer `
    -Name "HP-LaserJet-Floor2" `
    -Shared $true `
    -ShareName "Floor2-HP" `
    -Published $true

# Publish the printer to Active Directory
# ($Published $true automatically publishes if server is domain-joined)

# Verify printer configuration
Get-Printer -Name "HP-LaserJet-Floor2" | Format-List *

# Add and share a second printer (e.g., a copier/MFP)
Add-Printer `
    -Name "Ricoh-MFP-Reception" `
    -DriverName "Generic / Text Only" `
    -PortName "IP_192.168.1.101" `
    -Location "Reception Area" `
    -Comment "Ricoh MFP - scan/copy/print"

Set-Printer -Name "Ricoh-MFP-Reception" -Shared $true -ShareName "Reception-MFP" -Published $true

# List all printers on this server
Get-Printer | Select-Object Name, ShareName, DriverName, PortName, Published | Format-Table -AutoSize

Step 5: Configuring Printer Pooling

Printer pooling allows a single printer object to span multiple physical devices using the same driver. Print jobs are distributed across the pooled devices, improving throughput for high-volume printing. All printers in the pool must use identical drivers.

# Add a second port for the pooled physical printer
Add-PrinterPort -Name "IP_192.168.1.103" `
    -PrinterHostAddress "192.168.1.103" `
    -PortNumber 9100

# Create a pooled printer by specifying multiple ports
Add-Printer `
    -Name "HP-Pool-Accounts" `
    -DriverName "HP Universal Printing PCL 6" `
    -PortName "IP_192.168.1.100", "IP_192.168.1.103" `
    -Location "Accounts Department" `
    -Comment "Pooled HP printers for high-volume printing"

Set-Printer -Name "HP-Pool-Accounts" -Shared $true -ShareName "Accounts-Pool" -Published $true

# Verify pooling — PortName will show both ports
Get-Printer -Name "HP-Pool-Accounts" | Select-Object Name, PortName

Step 6: Configuring Separator Pages

Separator pages (banner pages) print between jobs to help users identify their printouts in high-volume environments. Windows Server 2025 includes four built-in separator page files in %SystemRoot%System32.

# Built-in separator pages:
# sysprint.sep  — PostScript, prints separator with username/date
# sysprtj.sep   — PostScript, Japanese
# pcl.sep       — PCL, prints separator with username/date  
# pscript.sep   — PostScript, switches printer to PS mode (no visible page)

# Assign a separator page to a printer
Set-Printer -Name "HP-LaserJet-Floor2" `
    -SeparatorPageFile "C:WindowsSystem32pcl.sep"

# Verify the separator page assignment
Get-Printer -Name "HP-LaserJet-Floor2" | Select-Object Name, SeparatorPageFile

# Remove separator page
Set-Printer -Name "HP-LaserJet-Floor2" -SeparatorPageFile ""

Step 7: Deploying Printers via Group Policy

Group Policy Preferences provide the most flexible method for deploying printer connections to domain users and computers. Connections can be targeted by OU, security group, or even IP subnet using item-level targeting.

# Method 1: Use Push-PrinterConnections (requires printers published in AD)
# Run on client or via GPO startup/logon script
# Push-PrinterConnections.exe is located in System32

# Method 2: Deploy via GPO using Group Policy Preferences
# In GPMC: User Configuration > Preferences > Control Panel Settings > Printers
# New > Shared Printer > Action: Create
# Share path: \PRINTSERVER01Floor2-HP
# Set as Default: Yes (optional)
# Item-level targeting: IP Address Range, Security Group, etc.

# Method 3: PowerShell — add printer connection from client (logon script)
Add-PrinterConnection -ConnectionName "\PRINTSERVER01Floor2-HP"
Set-Printer -Name "\PRINTSERVER01Floor2-HP" -Default $true

# Verify connections from a client
Get-Printer | Where-Object { $_.ComputerName -ne $env:COMPUTERNAME } |
    Select-Object Name, ComputerName, Shared

# Deploy printer connections using GPO Preferences — verify target computers
# Force Group Policy update on clients
Invoke-GPUpdate -Computer "WORKSTATION01" -Force -RandomDelayInMinutes 0

Step 8: Managing Print Jobs

The Get-PrintJob and Remove-PrintJob cmdlets allow you to monitor and control the print queue programmatically—useful for clearing stuck jobs or auditing print activity.

# List all print jobs on all printers
Get-PrintJob -PrinterName "HP-LaserJet-Floor2"

# List print jobs across all printers on this server
Get-Printer | ForEach-Object {
    $printer = $_.Name
    Get-PrintJob -PrinterName $printer -ErrorAction SilentlyContinue |
        Select-Object @{N="Printer";E={$printer}}, Id, UserName, DocumentName, 
                      JobStatus, TotalPages, SubmittedTime
} | Format-Table -AutoSize

# Remove a specific stuck print job by ID
Remove-PrintJob -PrinterName "HP-LaserJet-Floor2" -ID 5

# Clear all jobs from a printer queue
Get-PrintJob -PrinterName "HP-LaserJet-Floor2" | 
    ForEach-Object { Remove-PrintJob -PrinterName "HP-LaserJet-Floor2" -ID $_.Id }

# Restart the Print Spooler to clear all queues (use with caution in production)
Restart-Service Spooler -Force

# Suspend and resume a print job
Suspend-PrintJob -PrinterName "HP-LaserJet-Floor2" -ID 3
Resume-PrintJob -PrinterName "HP-LaserJet-Floor2" -ID 3

Step 9: Monitoring with Print Management Console

The Print Management console (printmanagement.msc) provides a centralized GUI for managing all printers across multiple print servers in the domain. You can add remote servers, view all queues, filter printers by status, and set up notifications for printers that have errors.

# Open Print Management console
Start-Process printmanagement.msc

# Add a remote print server to manage remotely
# In Print Management: Right-click "Print Servers" > Add/Remove Servers

# Monitor printer status across all servers via PowerShell
Get-Printer -ComputerName PRINTSERVER01 | 
    Select-Object Name, PrinterStatus, JobCount | 
    Format-Table -AutoSize

# Check for printers in error state
Get-Printer -ComputerName PRINTSERVER01 | 
    Where-Object { $_.PrinterStatus -ne "Normal" } |
    Select-Object Name, PrinterStatus, PortName

# Export printer inventory for documentation
Get-Printer -ComputerName PRINTSERVER01 |
    Select-Object Name, ShareName, DriverName, PortName, Location, Published |
    Export-Csv -Path "C:ReportsPrinterInventory.csv" -NoTypeInformation

Conclusion

Setting up a print server on Windows Server 2025 with PowerShell provides a repeatable, scriptable foundation for managing an organization’s entire printing infrastructure from a single point. By installing the Print Server role, configuring Standard TCP/IP ports, staging manufacturer drivers, creating shared and published printer objects, enabling printer pooling for high-volume departments, and deploying connections via Group Policy Preferences with item-level targeting, you can eliminate the chaos of ad-hoc printer installations on individual workstations. Combine Get-PrintJob and Remove-PrintJob for automated queue management and integrate the Print Management console for day-to-day monitoring, and you have a production-ready print environment that scales cleanly across sites and organizational units.