Wednesday 11 July 2012

Install network printers that are not already installed

Very handy VBScript which I found at WinVistaTips.com thanks to user "markm75". It lets you set up a list of network printers that a PC needs to have installed on it, checks to see which (if any) are not currently installed, and installs only the missing printers.

I've previously used .bat scripts to install network printers, but the problem with those is that the way we had to connect to them (using a command like the following: explorer \\printserver\printername$), once installed the print queue window would always be opened for every printer that was connected to. So if we had 3 printers that had to go on each PC and that script would run on each login, those 3 printers would run through the install process & the 3 print queue windows will open up on each login as well. Even if the printers were already installed.

This script handily works around both issues: printers that are already installed are just skipped from further processing, and if missing, the installation is silent without any dialogs or windows popping up (unless if UAC is required to install a driver or some such).

So here it is for posterity (in case those forums are ever shut down – and to improve it’s discoverability – it’s quite useful). Hopefully it will help others. I've adjusted the script a little from the original here, but it's identical where it counts.

Option Explicit
On Error Resume next
 
Dim Printers(3), WshNetwork, objWMIService, colPrinters, bFound, InstalledPrinter, Printer
 
'array of network printers we need to have installed
Printers(0) = "\\printserver\HP2600"    
Printers(1) = "\\printserver\HP4200"
Printers(2) = "\\printserver\Lexmark360"
 
Set WshNetwork = CreateObject("WScript.Network") 
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
' "." = local PC, else put in PC name instead of the dot
Set colPrinters = objWMIService.ExecQuery _
                ("Select * From Win32_Printer Where Local = False")     
                'Populate Printers Collection on the PC specified above
 
If colPrinters.Count <> 0 Then
    'loop through array of Printers we need to have installed
    For each Printer In Printers  
        bFound = False
        'loop through printers currently installed on target machine, 
        'compare each to the printer we need installed:
        For Each InstalledPrinter In colPrinters
            '.ShareName is the share ' servername for server 
            If Ucase(InstalledPrinter.ServerName & "\" & InstalledPrinter.ShareName) = _
               Ucase(Printer) Then
                   bFound = True 'if Printer is already installed/found, skip to next printer
                   Exit For
            End If
        Next 
        
        If bFound = False Then    'if Printer is not installed, install it
            If Printer <> "" Then '(if Printer is named/not null string)
                WshNetwork.AddWindowsPrinterConnection Printer
            End If
        End If        
    Next
 
End If
 
Set WshNetwork = Nothing
Set objWMIService = Nothing
Set colPrinters = Nothing