' VBScript Source File -- Created with SAPIEN Technologies PrimalScript 2009
'
' NAME: Change printers
'
' AUTHOR: Erik Kottman , Atos Origin
' INPUT: Ismail Amozlouf, Atos Origin
' DATE : 04-01-2012
'
' VERSION : Draft 1.1
'
' COMMENT: Created for Akzo Nobel AAC to migrate server printer connections
' COMMENT: to local printer connections
'
' Printservers which can be used are: SASVN16 - SASN51
'==========================================================================
Option Explicit
'On Error Resume Next
' Declaration
Dim blnDefault
Dim objWMIService, objShell, objPort, objNewPort, objfso, objfile, objPrinter, objService
Dim colItems1, colItems2, colports, colServiceList
Dim arrServer, arrPrinter, errReturn
Dim strComment, strComputer, strDefault, strDeviceID, strDriver, strIP
Dim strLocation, strName, strPath, strPort, strPrinter, strResult, strServer
' Main Section
'=============================================== BEGIN "GET DEFAULT PRINTER" ======================================================================
' Get Default Printer
strDefault = Get_Default_Printer
WScript.Echo "Default: " & strDefault
'=============================================== END "GET DEFAULT PRINTER" ======================================================================
'=============================================== BEGIN "PUT ALL PRINTERS IN FILE" ======================================================================
' Get Local Printers
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.CreateTextFile("PRINTERS.CSV", True)
strComputer ="."
Set objWMIService = GetObject ("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItems1 = objWMIService.ExecQuery ("SELECT * FROM Win32_Printer")
'=============================================== END "PUT ALL PRINTERS IN FILE" ======================================================================
'=============================================== BEGIN STOP/START SPOOLER SERVICE ======================================================================
' Set colServiceList = objWMIService.ExecQuery _
' ("Select * from Win32_Service where Name='Spooler'")
' For Each objService In colServiceList
' errReturn = objService.StopService()
' WScript.Sleep 5000
' Next
'Start Spooler Service
' For Each objService In colServiceList
' errReturn = objService.StartService()
' WScript.Sleep 5000
' Next
'=============================================== END STOP/START SPOOLER SERVICE ========================================================================
' =============================================== BEGIN PRINTER COLLECTION ==============================================================================
For Each objPrinter In colItems1
strPrinter = objPrinter.DeviceID
blnDefault = False
If Left(strPrinter,2) = "\\" Then
arrServer = Split(strPrinter,"\")
strServer = (arrServer(2))
'objFile.WriteLine "IP Nummer" & ";" & "Drivername" & ";" & "Device ID"
objFile.WriteLine objPrinter.PortName & ";" & objPrinter.DriverName & ";" & objPrinter.DeviceID
strName = Get_Name(strPrinter)
If strPrinter = strDefault Then
blnDefault = True
End If
If Not IsNull(objPrinter.Location) then
strLocation = objPrinter.Location
End If
strPort = objPrinter.PortName
strIP = Get_IP(strPort)
strPort = "IP_" & strIP
strDriver = objPrinter.DriverName
strDeviceID = objPrinter.DeviceID
'strResult = Get_Host_Address(strServer, strPort)
strComment = objPrinter.Comment
'WScript.Echo strComment
'Create new TCP/IP printer
If Not strIP = "" Then
strResult = Create_Printer(strName, strLocation, strPort, strDeviceID, strIP, strDriver, strDefault, strComment, blnDefault)
'Delete the old Printer connection
If Err.Number = 0 Then
strResult = Delete_Printer(strServer, strPrinter)
objPrinter.Delete_
End If
End If
Err.Clear
End If
Next
WScript.Echo "All printers are replaced by IP printers"
Wscript.Quit
Function Get_Default_Printer
Dim strDefault
' Get default printer of WINXP workstations
strDefault = ""
Set objShell = CreateObject("WScript.Shell")
strPath = "HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows\Device"
arrPrinter = Split(objShell.RegRead(strPath), ",")
If IsArray(arrPrinter) Then
strDefault = arrPrinter(0)
End If
Get_Default_Printer = strDefault
Err.Clear
End Function
' =============================================== BEGIN QUERY ON PRINTSERVER ==============================================================================
Function Get_Host_Address(strServer, strPort)
' Get ip adress or hostname of printer port from print server
' Rights to query the server are necessary to perform this step
strComputer = strServer
strIP = ""
'Set objWMIService = GetObject ("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItems2 = objWMIService.ExecQuery ("SELECT * FROM Win32_TCPIPPrinterPort")
For Each objPort in colItems2
If Ucase(objPort.Name) = Ucase(strPort) Then
strIP = objPort.HostAddress
End If
Next
Err.Clear
End Function
'=============================================== END QUERY ON PRINTSERVER ==============================================================================
'=============================================== BEGIN FUNCTION "CREATE_PRINTER" =======================================================================
Function Create_Printer(strName, strLocation, strPort, strDeviceID, strIP, strDriver, strDefault, strComment, blnDefault)
Dim colInstalledPrinters, colServiceList, DrvPath, errReturn, InfPath, intResult
Dim objDriver, objNewPort, objPrinter, objService, objWMIService
Dim PrnComment, strComputer
Set objWMIService = GetObject("Winmgmts:")
objWMIService.Security_.Privileges.AddAsString "SeLoadDriverPrivilege", True
DrvPath = "D:\Printer creation\drivers\Inkjet 2800\hpbi2800\Drivers\PCL6\Win2k_XP\English"
InfPath = DrvPath & "\hpw2800c.inf"
' =============================================== BEGIN IP-PORT INSTALLATION ==============================================================================
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set objNewPort = objWMIService.Get _
("Win32_TCPIPPrinterPort").SpawnInstance_
objNewPort.Name = strPort
objNewPort.Protocol = 1
objNewPort.HostAddress = strIP
objNewPort.PortNumber = "9100"
objNewPort.SNMPEnabled = False
objNewPort.Put_
If Err = 0 Then
wsh.echo "IP Port created"
Else
wsh.echo "Error !!!"
End If
Err.Clear
'=============================================== END IP-PORT INSTALLATION ==============================================================================
'=============================================== BEGIN STOP/START SPOOLER SERVICE ======================================================================
Set colServiceList = objWMIService.ExecQuery _
("Select * from Win32_Service where Name='Spooler'")
For Each objService In colServiceList
errReturn = objService.StopService()
WScript.Sleep 5000
Next
'Start Spooler Service
For Each objService In colServiceList
errReturn = objService.StartService()
WScript.Sleep 5000
Next
'=============================================== END STOP/START SPOOLER SERVICE ==================================================================
'=============================================== BEGIN DRIVER INSTALLATION ============================================================================
'
' If the driver is not signed, one cannot use WMI scripting to install the driver.
' Make sure the cat file for the package is copied to the same location as the driver
objWMIService.Security_.Privileges.AddAsString "SeLoadDriverPrivilege", True
Set objDriver = objWMIService.Get("Win32_PrinterDriver")
objDriver.Name = strDriver
objDriver.SupportedPlatform = "Windows NT x86"
objDriver.Version = "3"
intResult = objDriver.AddPrinterDriver(objDriver)
If Err = 0 Then
wsh.echo "Printerdriver installed"
Else
wsh.echo "Error !!!"
End If
Err.Clear
'=============================================== END DRIVER INSTALLATION ==============================================================================
'=============================================== BEGIN ADDING LOCAL IP PRINTER ========================================================================
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set objPrinter = objWMIService.Get("Win32_Printer").SpawnInstance_
objPrinter.DriverName = StrDriver
objPrinter.PortName = strPort
objPrinter.DeviceID = strName
objPrinter.Network = True
objPrinter.Shared = False
objPrinter.ShareName = ""
objPrinter.Published = False
If IsNull(strLocation) Then
objPrinter.Location = " "
Else
objPrinter.Location = strLocation
End If
If strLocation = "" Then
objPrinter.Location = " "
Else
objPrinter.Location = strLocation
End If
objPrinter.Comment = strComment
objPrinter.Put_
If Err = 0 Then
wsh.echo "Local IP Printer created and added"
Else
wsh.echo "Error !!!"
End If
Err.Clear
'=============================================== END ADDING LOCAL IP PRINTER ========================================================================
'=============================================== BEGIN SETTING PRINTER AS DEFAULT ===================================================================
'SETS PRINTER AS DEFAULT.
'wsh.echo "Name: " & strName
If blnDefault = True Then
Set colInstalledPrinters = objWMIService.ExecQuery _
("Select * from Win32_Printer Where Name = '" & strName & "'")
For Each objPrinter in colInstalledPrinters
objPrinter.SetDefaultPrinter()
next
If Err = 0 Then
wsh.echo "Default printer set"
else
wsh.echo "Error while setting default printer!!!"
End If
Err.Clear
End If
'=============================================== END SETTING PRINTER AS DEFAULT ===================================================================
End Function
' =============================================== END FUNCTION "CREATE_PRINTER" ===================================================================
' =============================================== BEGIN FUNCTION "DELETE_PRINTER" =======================================================================
Function Delete_Printer(strServer, strPrinter)
' Delete the old Printer connection
' This part is not completed yet but also should not be done before creation is succesfull
' First test the creation of the new printer before coding the removal
'WScript.Echo "strServer: " & strServer & " " & vbCrLf & _
' "strPrinter: " & strPrinter & vbCrLf & _
' ""
'Err.Clear
End Function
' =============================================== END FUNCTION "DELETE_PRINTER" =======================================================================
' =============================================== BEGIN FUNCTION "GET IP ADDRESS FROM PRINTER" ====================================================
Function Get_IP(strPort)
' Get the IP address of the printer connection
Dim intColon, intIP, intUnderscore
Dim strIP
'strPort = "IP_161.90.92.51"
'strPort = "161.90.92.510:RAW1"
'strPort = "IP_161.90.92.51:RAW1"
'strPort = "161.90.92.510_RAW1"
'strPort = "IP_161.90.92.51_RAW1"
intIP = InStr(1, strPort, "IP_", 1)
If intIP > 0 Then
strIP = Mid(strPort, intIP + 3)
intColon = InStr(1, strIP, ":", 1)
If intColon > 0 Then
strIP = Left(strIP, intColon - 1)
End If
intUnderscore = InStr(1, strIP, "_", 1)
If intUnderscore > 0 Then
strIP = Left(strIP, intUnderscore - 1)
End If
Else
intColon = InStr(1, strPort, ":", 1)
If intColon > 0 Then
strIP = Left(strPort, intColon - 1)
Else
strIP = strPort
End If
intUnderscore = InStr(1, strPort, "_", 1)
If intUnderscore > 0 Then
strIP = Left(strPort, intUnderscore - 1)
End If
End If
Get_IP = strIP
End Function
' =============================================== END FUNCTION "GET_IP" ===============================================================================
' =============================================== BEGIN FUNCTION "GET_NAME" ===========================================================================
Function Get_Name(strPrinter)
Dim intSlash1
Dim intSlash2
Dim intSlash3
Dim strName
intSlash1 = InStr(1, strPrinter, "\", 1)
strName = Mid(strPrinter, intSlash1 + 1)
intSlash2 = InStr(1, strName, "\", 1)
strName = Mid(strName, intSlash2 + 1)
intSlash3 = InStr(1, strName, "\", 1)
strName = Mid(strName, intSlash3 + 1)
Get_Name = strName
End Function
' =============================================== END FUNCTION "GET_NAME" =============================================================================