Script to remove orphaned/stale printer objects

I wrote this script to help a customer clean up old orphaned and stale printer objects from user profiles. This script can safely be executed in each user session and works a treat.

However, you may first want to try my script to remove printers the traditional way.

Here is the RemoveOrphanedPrinters.vbs script.


Option Explicit

' This script will remove registry keys and values. It was specifically written to clean out
' old orphaned/stale printer objects from a users registry hive that cannot be removed using
' the conventional methods.
' If any registry key or value contains the strings listed in the arrOrphanedPrinters array,
' it will be removed.

' This script could easily be modified to rename printer objects.

' Written by Jeremy@jhouseconsulting.com on 28th July 2008.

' Note that the RegValueExists and RegKeyExists functions were written by torgeir, a Microsoft
' MVP in Scripting and WMI. They were made freely available on the Internet.

Dim arrOrphanedPrinters, strComputer, strKeyRoot, strKeyPath, objRegistry, arrSubkeys
Dim strSubkey, return, BlnReturn

arrOrphanedPrinters = Array("iprint","printing")

Const HKEY_CURRENT_USER = &H80000001
strComputer = "."
Set objRegistry = GetObject("winmgmts:\\" & _
 strComputer & "\root\default:StdRegProv")

strKeyRoot = "HKCU\"
strKeyPath = "Printers\Connections"
If RegKeyExists(strKeyRoot & strKeyPath) Then
 return = objRegistry.EnumKey (HKEY_CURRENT_USER, strKeyPath, arrSubkeys)
 If return=0 and IsArray(arrSubkeys) Then
 For Each strSubkey In arrSubkeys
 BlnReturn=InArray(strSubkey,arrOrphanedPrinters)
 If BlnReturn Then
 DeleteSubkeys HKEY_CURRENT_USER, strKeyPath & "\" & strSubkey
 End If
 Next
 End If
End If

strKeyRoot = "HKCU\"
strKeyPath = "Printers\DevModePerUser"
If RegKeyExists(strKeyRoot & strKeyPath) Then
' wscript.echo strKeyRoot & strKeyPath & " exists."
 Call DeleteValues(strKeyRoot,strKeyPath)
End If

strKeyRoot = "HKCU\"
strKeyPath = "Printers\DevModes2"
If RegKeyExists(strKeyRoot & strKeyPath) Then
' wscript.echo strKeyRoot & strKeyPath & " exists."
 Call DeleteValues(strKeyRoot,strKeyPath)
End If

strKeyRoot = "HKCU\"
strKeyPath = "Printers\Settings"
If RegKeyExists(strKeyRoot & strKeyPath) Then
' wscript.echo strKeyRoot & strKeyPath & " exists."
 Call DeleteValues(strKeyRoot,strKeyPath)
End If

Set objRegistry = Nothing

wscript.quit(0)

Sub DeleteSubkeys(HKEY_CURRENT_USER, strKeyPath)
 Dim strComputer, objRegistry, arrSubkeys, strSubkey
 strComputer = "."
 Set objRegistry = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")
 objRegistry.EnumKey HKEY_CURRENT_USER, strKeyPath, arrSubkeys
 If IsArray(arrSubkeys) Then
 For Each strSubkey In arrSubkeys
 DeleteSubkeys HKEY_CURRENT_USER, strKeyPath & "\" & strSubkey
 Next
 End If
 objRegistry.DeleteKey HKEY_CURRENT_USER, strKeyPath
 Set objRegistry = Nothing
End Sub

Sub DeleteValues(strKeyRoot,strKeyPath)
 Dim strComputer, objRegistry, return, i, arrValueNames, arrValueTypes, BlnReturn
 strComputer = "."
 Set objRegistry = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")
 return = objRegistry.EnumValues (HKEY_CURRENT_USER, strKeyPath,_
 arrValueNames, arrValueTypes)
 If return=0 and IsArray(arrValueNames) Then
 For i=0 To UBound(arrValueNames)
 BlnReturn=InArray(arrValueNames(i),arrOrphanedPrinters)
 If BlnReturn Then
 objRegistry.DeleteValue HKEY_CURRENT_USER, strKeyPath, arrValueNames(i)
 End If
 Next
 End If
 Set objRegistry = Nothing
End Sub

Function RegValueExists(sRegValue)
' Returns True or False based of the existence of a registry value.
 Dim oShell, RegReadReturn
 Set oShell = CreateObject("WScript.Shell")
 RegValueExists = True ' init value
 On Error Resume Next
 RegReadReturn = oShell.RegRead(sRegValue)
 If Err.Number <> 0 Then
 RegValueExists = False
 End if
 On Error Goto 0
 Set oShell = Nothing
End Function

Function RegKeyExists(ByVal sRegKey)
' Returns True or False based on the existence of a registry key.
 Dim sDescription, oShell
 Set oShell = CreateObject("WScript.Shell")
 RegKeyExists = True
 sRegKey = Trim (sRegKey)
 If Not Right(sRegKey, 1) = "\" Then
 sRegKey = sRegKey & "\"
 End If
 On Error Resume Next
 oShell.RegRead "HKEYNotAKey\"
 sDescription = Replace(Err.Description, "HKEYNotAKey\", "")
 Err.Clear
 oShell.RegRead sRegKey
 RegKeyExists = sDescription <> Replace(Err.Description, sRegKey, "")
 On Error Goto 0
 Set oShell = Nothing
End Function

Function InArray(item,myarray)
 Dim i
 For i=0 To UBound(myarray) Step 1
 If instr(1,item,myarray(i),1) > 0 Then
 InArray=True
 Exit Function
 End If
 Next
 InArray=False
End Function

Enjoy!

Jeremy Saunders

Jeremy Saunders

Delivering customer success through tech: IT Infrastructure | Citrix | End User Computing | Platform Engineering | DevOps | Full Stack Developer | Technical Architect | Improvisor | Aspiring Comedian | Midlife Adventurer at J House Consulting
Jeremy Saunders is the Problem Terminator; the MacGyver of IT. Views and Intellectual Property (IP) published on this site belong to Jeremy. Please refer to the About page for more information about Jeremy.