Client printing to old print server

Tech Tip: Click here to run a free scan for Windows Errors and optimize PC performance



I have an old print server named "x"
I need any clients printing to the old server X to
(1) Deleted their connections
(2) Map to the new print server.
(3) This applies to even printers mapped that are not default printers too.

Script thus far:

On Error Resume Next
Dim strCaption, strComment, strName, strDeviceID, strComputer
Dim strStatusAdd, strStatusDelete, strDefaultPrinter, strSetDefaultPrinter,
strTempPrinter

Const ForWriting = 2

Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20

sComputer = "."

Set WshShell = WScript.CreateObject("WScript.Shell")
Set WshSysEnv = WshShell.Environment("PROCESS")
Set ws = wscript.CreateObject("Scripting.FileSystemObject")
logfile = WshSysEnv("TEMP") & "\" & "changeprt-status.log"
arrComputers = Array(sComputer)
strNewServer = "y"
strOldServer = "x"
blnDeleteNonExistentOldPrinter = true
silent = 0 ' 0 = verbose, 1 = silent

Set l = ws.OpenTextFile (logfile, ForWriting, True)
If silent = 0 Then strResult = MsgBox("This will attempt to map printers
from " & strOldServer _
& " to " & strNewServer & ". This process takes approximately 1 minute." &
vbcrlf & vbcrlf _
& "You will not see any output during this time until the script has
completed." & vbcrlf & vbcrlf _
& "Continue?",68,"Printer conversion script")

If strResult = 7 Then
l.writeline Now & " - User aborted printer conversion script."
wscript.quit
End If

For Each strComputer In arrComputers
l.writeline
"---------------------------------------------------------------------------"
l.writeline "Relocate printer script - " & vbcrlf & Now & vbcrlf &
"Computer: " & strComputer
l.writeline
"---------------------------------------------------------------------------"

l.writeline Now & " - Starting change printer script"
l.writeline Now & " - Converting local printer queues from " & strOldServer _
& " to " & strNewServer
l.writeline Now & " - Delete old printers that do not exist on new server is
Set to: " _
& blnDeleteNonExistentOldPrinter
strDefaultPrinter = lcase(GetDefaultPrinter())
l.writeline Now & " - Default printer is currently Set to: " &
strDefaultPrinter

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colOS = objWMIService.ExecQuery("SELECT caption FROM
Win32_OperatingSystem", "WQL", _
wbemFlagReturnImmediately +
wbemFlagForwardOnly)
For each objitem in colOS
If instr(objItem.caption,"2000") or instr(strOS,"Windows Powered")Then
Set colItems = objWMIService.ExecQuery("Select Caption, DriverName,
PortName from Win32_Printer",,48)
ElseIf instr(objItem.Caption,"XP") Then
Set colItems = objWMIService.ExecQuery("SELECT CAPTION, COMMENT,
DEFAULT, DEVICEID, NAME, NETWORK FROM Win32_Printer", "WQL", _
wbemFlagReturnImmediately + wbemFlagForwardOnly)
End If
strOS = objItem.caption
Next

l.writeline Now & " - Operating System on " & strComputer & " is " & strOS

'Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")

For Each objItem In colItems
If instr(strOS,"XP") Then
strCaption = objItem.Caption
strComment = objItem.Comment
strName = objItem.Name
strDeviceID = objItem.DeviceID
blnDefault = objItem.Default
ElseIf instr(strOS,"2000") or instr(strOS,"Windows Powered")Then
strCaption = objItem.Caption
strName = objItem.DriverName
strDeviceID = objItem.DeviceID

End If

l.writeline Now & " - Processing printer " & strDeviceID

If instr(lcase(strDeviceID),lcase(strOldServer)) Then
l.writeline Now & " - Found reference to old server. Printer: " &
strDeviceID

strQueueArray = split(strDeviceID,"\")
For i = 0 to ubound(strQueueArray)
strPrintQueue = strQueueArray(i)
Next

l.writeline Now & " - Queue name is: " & strPrintQueue
Set objNetwork = CreateObject("WScript.Network")
strStatusAdd = nothing

If blnDeleteNonExistentOldPrinter = true then strStatusDelete =
nothing
err.clear

l.writeline Now & " - Now attempting to add \\" & strNewServer & "\"
& strPrintQueue
objNetwork.AddWindowsPrinterConnection "\\" & strNewServer & "\" &
strPrintQueue
If instr(strDefaultPrinter,lcase(lcase(strPrintQueue))) then
strSetDefaultPrinter = "\\" & strNewServer & "\" & strPrintQueue
'wscript.echo "Setting variable for default printer to " & "\\" &
strNewServer & "\" & strPrintQueue
Else
'wscript.echo "not Setting new default printer to " & "\\" &
strNewServer & "\" & strPrintQueue
End If
If cstr(err.number) = -2147023095 then
l.writeline Now & " - ERROR: Could not add \\" & strNewServer &
"\" & strPrintQueue _
& ". This printer (" & strPrintQueue & ") may not exist on the
new server. Contact your system " _
& " administrator."
l.writeline Now & " - " & err.number & "; " & err.description & ";
" & err.source
err.clear
Else
strStatusAdd = strStatusAdd & "\\" & strNewServer & "\" &
strPrintQueue & " (" & strComment & ")" & vbcrlf
'Here's where you would put the default printer information
'wscript.echo StrDefaultPrinter & vbcrlf & strPrintQueue
'wscript.echo "strDefaultprinter(2): " & strDefaultPrinter(2)

End If

If blnDeleteNonExistentOldPrinter = true then
objNetwork.RemovePrinterConnection strDeviceID
If cstr(err.number) <> 0 then
l.writeline Now & " - ERROR: Could not remove " & strDeviceID &
". There may be a permissions " _
& "issue with this computer. Contact your system
administrator."
err.clear
If strTempPrinter <> "" Then strSetDefaultPrinter = strTempPrinter
Else
strTempPrinter = "\\" & strNewServer & "\" & strPrintQueue
End If
End If

If blnDeleteNonExistentOldPrinter = true then strStatusDelete =
strStatusDelete & strDeviceID & " (" & strComment & ")" & vbcrlf

End If
Next
Next

'wscript.echo "strSetDefaultPrinter: " & strSetDefaultPrinter

l.writeline Now & " - Now attempting to Set default printer to " &
strSetDefaultPrinter
If strSetDefaultPrinter <> "" Then objNetwork.SetDefaultPrinter
strSetDefaultPrinter


If cstr(err.number) <> 0 Then
l.writeline Now & " - There was an error while attempting to Set the
default printer."
err.clear
End If

l.writeline Now & " - Finished processing printers."
If strStatusAdd <> "" Then
l.writeline Now & " - Added the following printers: " & vbcrlf &
strStatusAdd
If silent = 0 then strmsg = "Added the following printers: " & vbcrlf &
strStatusAdd & vbcrlf & vbcrlf _
& "Your default printer is: " & strSetDefaultPrinter & vbcrlf & vbcrlf
Else
If silent = 0 then
strMsg = "No new printers were added. Click 'Start'> 'Settings' to " _
& "verify your printer connections. " & vbcrlf & vbcrlf _
& "Your default printer is: " & strDefaultPrinter

End If
End If
If strStatusDelete <> "" and blnDeleteNonExistentOldPrinter = true Then
l.writeline Now & " - Removed the following printers: " & vbcrlf &
strStatusDelete
If silent= 0 then strmsg = strmsg & "Removed the following printers: " &
vbcrlf & strStatusDelete
End If
If silent = 0 Then MsgBox strmsg,64,"Printer conversion completed"
l.writeline
"---------------------------------------------------------------------------"

l.close

Function GetDefaultPrinter()

PrinterCheck = DefaultPrtExist

TotalKey = "HKEY_CURRENT_USER\Software\Microsoft\Windows
NT\CurrentVersion\Windows\Device"

If PrinterCheck <> "" then
strDefault =
UCase(left(WshShell.RegRead(TotalKey),InStr(WshShell.RegRead(TotalKey),",") -
1))
GetDefaultPrinter = strDefault
exit function
Else
Counter = 0 ' Initialize Variables
Do
Dot = "."

Counter = Counter + 1
If Counter = 5 then
strDefault = "No Default Printer currently assigned!"
exit Do
End If

PrinterCheck = DefaultPrtExist

If PrinterCheck <> "" then
strDefault =
UCase(left(WshShell.RegRead(TotalKey),InStr(WshShell.RegRead(TotalKey),",") -
1))
GetDefaultPrinter = strDefault
wscript.sleep 2000
exit Do
End If
Wscript.Sleep 1000
Loop
End If

GetDefaultPrinter = strDefault

End Function


Function DefaultPrtExist()


Dim strKey, strValue, strDefault
Dim Shell


strKeyPath = "Software\Microsoft\Windows NT\CurrentVersion\Windows"
strValueName = "Device"

Const HKEY_CURRENT_USER = &H80000001
Const HKEY_LOCAL_MACHINE = &H80000002


Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" &_
strComputer & "\root\default:StdRegProv")
oReg.GetStringValue
HKEY_CURRENT_USER,strKeyPath,strValueName,DefaultPrtExist
'wscript.echo DefaultPrtExist

End function

.



Relevant Pages

  • Remove and Add Printer Script
    ... I found this script at; ... Dim strStatusAdd, strStatusDelete, strDefaultPrinter, ... & blnDeleteNonExistentOldPrinter ... GetDefaultPrinter = strDefault ...
    (microsoft.public.scripting.vbscript)
  • Remove and Add Printer Script
    ... I found this script at ... Dim strStatusAdd, strStatusDelete, strDefaultPrinter, ... & blnDeleteNonExistentOldPrinter ... GetDefaultPrinter = strDefault ...
    (microsoft.public.windows.server.scripting)