{"id":33,"date":"2008-07-30T22:04:26","date_gmt":"2008-07-30T13:04:26","guid":{"rendered":"http:\/\/www.jhouseconsulting.com\/index.php\/jhouseconsulting\/2008\/07\/30\/script-to-remove-printers\/"},"modified":"2008-10-21T01:19:49","modified_gmt":"2008-10-20T16:19:49","slug":"script-to-remove-printers","status":"publish","type":"post","link":"https:\/\/www.jhouseconsulting.com\/jhouseconsulting\/2008\/07\/30\/script-to-remove-printers-33","title":{"rendered":"Script to remove printers"},"content":{"rendered":"<p>I wrote this script to help a customer cleanup\u00a0user profiles and remove unsupported printers. This script can safely be executed in each user session and works a treat. It stamps the registry after the first time it runs, so that it can be left in place to capture all users, whilst only ever removing the printers once. A nice polite message box will appear to let the user know that their printers have been removed and tell them how to add new ones.<\/p>\n<p>If, however, you find that some printers just cannot be removed, try my other <a target=\"_blank\" href=\"http:\/\/www.jhouseconsulting.com\/index.php\/jhouseconsulting\/2008\/07\/29\/script-to-remove-orphanedstale-printer-objects\/\">script to remove orphaned\/stale printer objects<\/a>.<\/p>\n<p>Enjoy!<!--more--><span id=\"more-31\"><\/span><\/p>\n<pre name=\"code\" class=\"vb.net\">\r\n\r\nOption Explicit\r\n\r\n' This script will enumerate all printers and then remove the ones that do not match an array of printers that\r\n' should not be removed. Nor will it remove any Terminal Server or Citrix client printer mappings.\r\n' It will tatoo the registry to ensure it only runs once per user, which makes it easy to manage for the future.\r\n' Note that there are two separate subroutines. One to remove network printers, and another to remove local printers.\r\n\r\n' IMPORTANT: This script DOES NOT remove the drivers.\r\n\r\n' Written by Jeremy@jhouseconsulting.com on 8th July 2008\r\n\r\nDim WshShell, WSHNetwork, WSHPrinters, arrPrinters, LOOP_COUNTER, strPrinter, strKey, strValue\r\nDim strComputer, objWMIService, colInstalledPrinters, objPrinter\r\n\r\n'These are the printers we DO NOT want to remove.\r\narrPrinters = Array(\"Send To OneNote 2007\",\"Microsoft XPS Document Writer\",\"Microsoft Office Document Image Writer\",\"Adobe PDF\",\"Generic \/ Text Only\")\r\n\r\nset WshShell = WScript.CreateObject(\"WScript.Shell\")\r\nSet wshNetwork = CreateObject(\"WScript.Network\")\r\nSet WSHPrinters = WSHNetwork.EnumPrinterConnections\r\n\r\nstrKey = \"HKCU\\Printers\\\"\r\nIf RegValueExists(strKey &amp; \"PrintersRemoved\") Then\r\n\u00a0 strValue = WshShell.RegRead(strKey &amp; \"PrintersRemoved\")\r\n\u00a0 If instr(lCase(strValue),\"yes\")&lt;&gt;1 Then\r\n\u00a0\u00a0\u00a0 RemoveNetworkPrinters()\r\n\u00a0\u00a0\u00a0 DeleteLocalPrinters()\r\n\u00a0\u00a0\u00a0 UserMessageWithTimeout()\r\n\u00a0 End If\r\nElse\r\n\u00a0 RemoveNetworkPrinters()\r\n\u00a0 DeleteLocalPrinters()\r\n\u00a0 UserMessageWithTimeout()\r\nEnd If\r\n\r\n'Clean Up Memory We Used\r\nSet WshShell = Nothing\r\nset WSHNetwork = Nothing\r\nSet WSHPrinters = Nothing\r\n\r\nwscript.quit(0)\r\n\r\nSub RemoveNetworkPrinters()\r\n\u00a0 Dim BlnReturn\r\n\u00a0 For LOOP_COUNTER = 0 To WSHPrinters.Count - 1 Step 2\r\n\u00a0\u00a0\u00a0 If Instr(WSHPrinters.Item(LOOP_COUNTER +1),\"in session\")=0 Then\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 BlnReturn=InArray(WSHPrinters.Item(LOOP_COUNTER +1),arrPrinters)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 If BlnReturn=False Then\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 On Error Resume Next\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 WSHNetwork.RemovePrinterConnection WSHPrinters.Item(LOOP_COUNTER +1),True,True\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 If Err.Number = -2147022646 Then\r\n'\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 wscript.echo \"This is a local printer and cannot be removed using the RemovePrinterConnection method.\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 On Error Goto 0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 End If\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 End If\r\n\u00a0\u00a0\u00a0 End If\r\n\u00a0 NEXT\r\n\u00a0 WshShell.RegWrite strKey &amp; \"PrintersRemoved\", \"Yes - on \" &amp; date &amp; \" at \" &amp; time\r\nEnd Sub\r\n\r\nSub DeleteLocalPrinters()\r\n\u00a0 Dim BlnReturn\r\n\u00a0 strComputer = \".\"\r\n\u00a0 Set objWMIService = GetObject(\"winmgmts:\" _\r\n\u00a0\u00a0\u00a0 &amp; \"{impersonationLevel=impersonate}!\\\\\" &amp; strComputer &amp; \"\\root\\cimv2\")\r\n' query for installed local printers\r\n\u00a0 Set colInstalledPrinters =\u00a0 objWMIService.ExecQuery _\r\n\u00a0\u00a0\u00a0 (\"Select * from Win32_Printer\")\r\n\u00a0 For Each objPrinter in colInstalledPrinters\r\n\u00a0\u00a0\u00a0 If Instr(lcase(objPrinter.Name),\"in session\")=0 Then\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 BlnReturn=InArray(objPrinter.Name,arrPrinters)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 If BlnReturn=False Then\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 objPrinter.delete_\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 End If\r\n\u00a0\u00a0\u00a0 End If\r\n\u00a0 Next\r\n\u00a0 Set objWMIService = Nothing\r\nEnd Sub\r\n\r\nFunction RegValueExists(sRegValue)\r\n' Returns True or False based of the existence of a registry value.\r\n\u00a0 Dim oShell, RegReadReturn\r\n\u00a0 Set oShell = CreateObject(\"WScript.Shell\")\r\n\u00a0 RegValueExists = True\u00a0 ' init value\r\n\u00a0 On Error Resume Next\r\n\u00a0 RegReadReturn = oShell.RegRead(sRegValue)\r\n\u00a0 If Err.Number &lt;&gt; 0 Then\r\n\u00a0\u00a0\u00a0 RegValueExists = False\r\n\u00a0 End if\r\n\u00a0 On Error Goto 0\r\n\u00a0 Set oShell = Nothing\r\nEnd Function\r\n\r\nFunction InArray(item,myarray)\r\n\u00a0 Dim i\r\n\u00a0 For i=0 To UBound(myarray) Step 1\r\n\u00a0\u00a0\u00a0 If lcase(item)=lcase(myarray(i)) Then\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 InArray=True\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 Exit Function\r\n\u00a0\u00a0\u00a0 End If\r\n\u00a0 Next\r\n\u00a0 InArray=False\r\nEnd Function\r\n\r\nSub UserMessageWithTimeout()\r\n\u00a0 Dim strMessage, objShell, intReturn\r\n\u00a0 Const wshOK = 1\r\n\u00a0 Const wshYes = 6\r\n\u00a0 Const wshNo = 7\r\n\u00a0 Const wshOKButton = 0\r\n\u00a0 Const wshCriticalMessage = 16\r\n\u00a0 Set objShell = CreateObject(\"Wscript.Shell\")\r\n\u00a0 strMessage = \"** Your printers have now been deleted. **\" &amp; VbCr &amp; VbCr &amp; _\r\n\u00a0 \"* You will need to reinstall your printers.\" &amp; VbCr &amp; _\r\n\u00a0 \"* To do this go to http:\/\/myiprint.mydomain.com.au\/ipp\" &amp; VbCr &amp; _\r\n\u00a0 \"* Note: Printer naming conventions have been modified.\" &amp; VbCr &amp; _\r\n\u00a0 \"* Note: Detailed printer locations have been added to help you locate your printers.\" &amp; VbCr &amp; VbCr &amp; _\r\n\u00a0 \"Need Help?\" &amp; VbCr &amp; _\r\n\u00a0 \"* The IT Helpdesk will be manned for any assistance users may require.\"\r\n\u00a0 intReturn = objShell.Popup(strMessage, 60, \"Printing Maintenance\", wshOKButton + wshCriticalMessage)\r\n'\u00a0 If intReturn = wshOK Then\r\n'\u00a0\u00a0\u00a0 Wscript.Echo \"You clicked the OK button.\"\r\n'\u00a0 Else\r\n'\u00a0\u00a0\u00a0 Wscript.Echo \"The popup timed out.\"\r\n'\u00a0 End If\r\n\u00a0 Set objShell = Nothing\r\nEnd Sub\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>I wrote this script to help a customer cleanup\u00a0user profiles and remove unsupported printers. This script can safely be executed in each user session and works a treat. It stamps the registry after the first time it runs, so that it can be left in place to capture all users, whilst only ever removing the &#8230; <a title=\"Script to remove printers\" class=\"read-more\" href=\"https:\/\/www.jhouseconsulting.com\/jhouseconsulting\/2008\/07\/30\/script-to-remove-printers-33\" aria-label=\"Read more about Script to remove printers\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[5],"tags":[47],"class_list":["post-33","post","type-post","status-publish","format-standard","hentry","category-scripting","tag-delete-printers"],"aioseo_notices":[],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/www.jhouseconsulting.com\/jhouseconsulting\/wp-json\/wp\/v2\/posts\/33","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.jhouseconsulting.com\/jhouseconsulting\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.jhouseconsulting.com\/jhouseconsulting\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.jhouseconsulting.com\/jhouseconsulting\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.jhouseconsulting.com\/jhouseconsulting\/wp-json\/wp\/v2\/comments?post=33"}],"version-history":[{"count":1,"href":"https:\/\/www.jhouseconsulting.com\/jhouseconsulting\/wp-json\/wp\/v2\/posts\/33\/revisions"}],"predecessor-version":[{"id":61,"href":"https:\/\/www.jhouseconsulting.com\/jhouseconsulting\/wp-json\/wp\/v2\/posts\/33\/revisions\/61"}],"wp:attachment":[{"href":"https:\/\/www.jhouseconsulting.com\/jhouseconsulting\/wp-json\/wp\/v2\/media?parent=33"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.jhouseconsulting.com\/jhouseconsulting\/wp-json\/wp\/v2\/categories?post=33"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.jhouseconsulting.com\/jhouseconsulting\/wp-json\/wp\/v2\/tags?post=33"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}