![]() |
![]() |
ICC Home / Members / Meetings / Peer Support / Documentation / Projects
The |
IntroductionThe script below includes code for deleting existing printers. printers.vbs
'***IFAS Printer Mapping Script
'***Last Modified: July 27, 2012
'***By: Santos Soler (ssoler@ufl.edu)
'***Normal Syntax: cscript \\ad.ufl.edu\netlogon\ifas\printers.vbs Print_Server_Name
'***Example: cscript \\ad.ufl.edu\netlogon\ifas\printers.vbs if-srvv-print
'***Debug Mode Syntax: cscript printers.vbs Print_Server_Name /debug
'***Example: cscript \\ad.ufl.edu\netlogon\ifas\printers.vbs if-srvv-print /debug
'***Debug mode will run the script, output status messages and install the printers
On Error Resume Next
'initialize DebugMode to 0 (off)
intDebugMode = 0
Dim objWSHShell
Dim strLogonServer
Set objWSHShell = Wscript.CreateObject("Wscript.Shell")
strLogonServer = objWSHShell.ExpandEnvironmentStrings("%LOGONSERVER%")
StrLogonServer = Right(strLogonServer,Len(strLogonServer)-2)
'Perform an action depending on the number of arguments entered on the command line
Select Case Wscript.Arguments.Count
'With zero arguments, the print server name has not been specified so the script will display an error message and exit
Case 0
Wscript.echo "Incorrect Syntax: Print server name is required."
Wscript.echo ""
Wscript.echo "Example: printers.vbs if-srvv-print"
Wscript.echo "or"
Wscript.echo "Example: printers.vbs if-srvv-print /debug"
Wscript.echo "To run the script with debugging information output to the screen"
Wscript.quit
'If one argument is given, set it as the print server name
Case 1
strPrintServer = Wscript.Arguments(0)
'With two arguments, set the print server name to the first argument, and check the second argument
'To determine if the user wants to run the script in debug mode
Case 2
strPrintServer = Wscript.Arguments(0)
If strcomp(lcase(Wscript.Arguments(1)), "/debug") = 0 Then
intDebugMode = 1
End If
'if there are more than two arguments, assume the user has made an error, display an error message and exit.
Case Else
Wscript.echo "Incorrect Syntax: Too many arguments"
Wscript.echo ""
Wscript.echo "This script onlt accepts two arguments - the print server name and the /debug flag"
Wscript.echo "Example: printers.vbs if-srvv-print"
Wscript.echo "or"
Wscript.echo "Example: printers.vbs if-srvv-print /debug"
Wscript.echo "To run the script with debugging information output to the screen"
Wscript.quit
End Select
'***********Start DebugMode Code*****************
if intDebugMode = 1 then
wscript.echo (now) & " - Starting printer script"
wscript.echo "Waiting 10 seconds, this is normal"
wscript.echo ""
end if
'***********End DebugMode Code*******************
'sleep for 10 seconds
wscript.sleep 10000
Const ADS_SCOPE_SUBTREE = 2
Set objNetwork = CreateObject("WScript.Network")
Set objConnection = CreateObject("ADODB.Connection")
Set objDNCommand = CreateObject("ADODB.Command")
Set objPrintQueueCommand = CreateObject("ADODB.Command")
objConnection.Open "Provider=ADsDSOObject;"
'Printers which will not be deleted from computers (mostly used in labs)
PrintersExemptFromDeletion = "EYN-hp4300pcl6, EYN-hp4300ps, agr-hpbi1200"
'Get the user's username and computername
strUsername = objNetwork.UserName
strComputername = objNetwork.ComputerName
'***********Start DebugMode Code*****************
if intDebugMode = 1 then
Wscript.echo "Username: " & strUsername
Wscript.echo "Computer name: " & strComputername
Wscript.echo "Print Server: " & strPrintServer
Wscript.echo "Printers Exempt From Deletion: " & PrintersExemptFromDeletion
wscript.echo ""
end if
'***********End DebugMode Code*******************
'Make sure the script is not being run on the print server
if strcomp(lcase(strComputername), lcase(strPrintServer)) = 0 then
wscript.echo "This script should not be run on the print server. Please run this script from client computers only"
wscript.quit
end if
'make sure that the print server is available (responding to pings)
'this ensures that mapped printers are not deleted due to network or server problems
set objPing = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery _
("select * from Win32_PingStatus where address = '" & strPrintServer & "'")
for each objRetStatus in objPing
if IsNull(objRetStatus.StatusCode) or objRetStatus.StatusCode<>0 then
'***********Start DebugMode Code*****************
if intDebugMode = 1 then
WScript.Echo strPrintServer &" is not available"
end if
'***********End DebugMode Code*******************
wscript.quit
Else
'***********Start DebugMode Code*****************
if intDebugMode = 1 then
wscript.echo strPrintServer & " is available"
end if
'***********End DebugMode Code*******************
end if
next
'Search for the Distinguished Name of the print server
Set objDNCommand.ActiveConnection = objConnection
objDNCommand.Properties("Page Size") = 1000
objDNCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
objDNCommand.CommandText = _
"SELECT distinguishedName FROM 'LDAP://" & strLogonServer & ".ad.ufl.edu' WHERE objectCategory='computer' " & _
"AND CN='" & strPrintServer & "'"
Set objDNRecordSet = objDNCommand.Execute
objDNRecordSet.MoveFirst
strPrintServerDn = objDNRecordSet.Fields("distinguishedName").Value
'***********Start DebugMode Code*****************
if intDebugMode = 1 then
wscript.echo strPrintServer & " Distinguished Name: " & strPrintServerDN
wscript.echo ""
wscript.echo (now) & " - Enumerating Printers on " & strPrintServer
end if
'***********End DebugMode Code*******************
'Enumerates printers on print server
Set objPrintQueueCommand.ActiveConnection = objConnection
objPrintQueueCommand.CommandText = "Select printShareName from 'LDAP://" & strPrintServerDN & "' where objectClass='printQueue'"
objPrintQueueCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
objPrintQueueCommand.Properties("Cache Results") = False
Set objPrintQueueRecordSet = objPrintQueueCommand.Execute
'***********Start DebugMode Code*****************
if intDebugMode = 1 then
wscript.echo (now) & " - Done Enumerating Printers on "& strPrintServer
Wscript.echo (now) & " - Enumerating Printers on local machine"
end if
'***********End DebugMode Code*****************
'Enumerates printers on local machine and removes erroneous printers
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colPrinters = objWMIService.ExecQuery ("Select ShareName, ServerName, Name, Attributes from Win32_Printer")
'***********Start DebugMode Code*****************
if intDebugMode = 1 then
Wscript.echo (now) & " - Done Enumerating Printers on local machine"
end if
'***********End DebugMode Code*****************
'For each local Printer
For each objPrinter in colPrinters
If objPrinter.ShareName <> "" then
'Check if the local printer points to an old server and delete
If lcase(objPrinter.ServerName) = "\\if-srv-print" or lcase(objPrinter.ServerName) = "\\nt-file" or lcase(objPrinter.ServerName) = "\\if-wec-srv" or lcase(objPrinter.ServerName) = "\\if-srv-milton" or lcase(objPrinter.ServerName) = "\\if-srv-polk" or lcase(objPrinter.ServerName) = "\\if-srv-dixie" or lcase(objPrinter.ServerName) = "\\if-srv-jay" or lcase(objPrinter.ServerName) = "\\if-srv-aquatic" or lcase(objPrinter.ServerName) = "\\if-srv-putnam" or lcase(objPrinter.ServerName) = "\\if-srv-escambia" or lcase(objPrinter.ServerName) = "\\if-srv-ruskin" or lcase(objPrinter.ServerName) = "\\if-srv-manatee" or lcase(objPrinter.ServerName) = "\\if-srv-lake" or lcase(objPrinter.ServerName) = "\\if-srv-bradford" or lcase(objPrinter.ServerName) = "\\if-srv-jackson" or lcase(objPrinter.ServerName) = "\\if-srv-jeffersn" or lcase(objPrinter.ServerName) = "\\if-srv-wakulla" or lcase(objPrinter.ServerName) = "\\if-srv-suwannee" or lcase(objPrinter.ServerName) = "\\if-srv-brooks" or lcase(objPrinter.ServerName) = "\\if-srv-sumter" or lcase(objPrinter.ServerName) = "\\if-srv-hardee" or lcase(objPrinter.ServerName) = "\\if-srv-ona" then
objPrinter.Delete_
end if
'Check that the local printer is on the print server
if lcase(objPrinter.ServerName) = "\\"& strPrintServer then
curLocalPrinter = objprinter.servername & "\" & objprinter.sharename
'***********Start DebugMode Code*****************
if intDebugMode = 1 then
Wscript.echo ""
wscript.echo "Local Printer: " &curLocalPrinter
wscript.echo "Printer is on " & strprintserver
end if
'***********End DebugMode Code*******************
'reset valid printer to 0
'all printers start out as erroneous and need to be checked before they are cnsidered valid
ValidPrinter = 0
'check if the printer is in the exemption list (exempt from deletion)
'and set the printer as valid if it is on the exemption list
if InStr(lcase(PrintersExemptFromDeletion), lcase(objprinter.sharename)) > 0 then
ValidPrinter = 1
'***********Start DebugMode Code*****************
if intDebugMode = 1 then
wscript.echo "Printer is in the exemptionlist"
end if
'***********End DebugMode Code*******************
elseIf objPrintQueueRecordSet.EOF = False then
objPrintQueueRecordSet.MoveFirst
'Loop through each remote printer and compare it against the current local printer to determine if the local printer is valid
'The loop will exit when the local printer is found to be valid or it has been checked against all remote printers and found to be invalid
Do Until objPrintQueueRecordSet.EOF OR ValidPrinter = 1
printShareName = objPrintQueueRecordSet.Fields("printShareName").Value
curRemotePrinter= "\\" & strPrintServer & "\" & printShareName(0)
'***********Start DebugMode Code*****************
if intDebugMode = 1 then
wscript.echo "Remote Printer: " & curRemotePrinter
end if
'***********End DebugMode Code*******************
'compare the current local printer against the current remote printer
PrinterComp =(strcomp(lcase(curLocalPrinter), lcase(CurRemotePrinter)))
'if the current local printer matches the current remote printer, then the local printer is not erroneous (is valid).
If (PrinterComp = 0) Then
ValidPrinter = 1
'***********Start DebugMode Code*****************
if intDebugMode = 1 then
wscript.echo "** Printer match, user has permission **"
end if
'***********End DebugMode Code*******************
else
'move to the next remote printer in the list
objPrintQueueRecordSet.MoveNext
end if
Loop
End If
'if the local printer does not have a match in the remote printer list
If ValidPrinter = 0 Then
'The user no longer has permission to the remote printer, so delete it fom the local computer
objprinter.delete_
end if
'move to the first remote printer in preparation for checking the next local printer
objPrintQueueRecordSet.MoveFirst
'If the printer is not on the print server, ignore it
else
'***********Start DebugMode Code*****************
if intDebugMode = 1 then
wscript.echo ""
wscript.echo "Local Printer: " & objprinter.servername & "\" & objprinter.sharename
wscript.echo "Printer is not on "& strPrintServer
end if
'***********End DebugMode Code*******************
end if
End If
'move to the next local printer
Next
'***********Start DebugMode Code*****************
if intDebugMode = 1 then
wscript.echo ""
wscript.echo (now) & " - Install printers"
end if
'***********End DebugMode Code*******************
'Installs printers not already installed
objPrintQueueRecordSet.MoveFirst
If objPrintQueueRecordSet.EOF = FALSE then
objPrintQueueRecordSet.MoveFirst
Do Until objPrintQueueRecordSet.EOF
printShareName = objPrintQueueRecordSet.Fields("printShareName").Value
'***********Start DebugMode Code*****************
if intDebugMode = 1 then
wscript.echo lcase("\\"& strPrintServer & "\" & printShareName(0))
end if
'***********End DebugMode Code*******************
objNetwork.AddWindowsPrinterConnection "\\" & strPrintServer & "\" & printShareName(0)
objPrintQueueRecordSet.MoveNext
Loop
End If
'***********Start DebugMode Code*****************
if intDebugMode = 1 then
wscript.echo ""
wscript.echo (now) & " - Printer script completed"
end if
'***********End DebugMode Code*******************
ImplementationThis script is called from the main co-managed "LoginScript.vbs" |
last edited 10 October 2012 by Santos Soler