Avatar of rowfei
rowfei

asked on 

Install MFD printer VBscript

I am using the following vbs codes to install our MFD printer. But now the codes won't works and I get a error message "Line: 56; Chart: 2; Error: The system cannot find the file specified. Code: 80070002." I have make sure the driver name & location are correct.

Please help.


PathToDLL = "\\whateverserver\whateverpath\PRNADMIN.DLL"
portloc = "1.1.1.1"
DriverName = "HP LaserJet IIISi"
PrintQueueName = "Printer Number 1"
 
 
 
 
set wshshell = wscript.createobject("wscript.shell")
set fso = createobject("scripting.filesystemobject")
 
fso.copyfile PathToDLL, "c:\Program Files\PRNADMIN.DLL", True
wshshell.run "regsvr32 /s ""c:\Program Files\PRNADMIN.DLL""", , True
wscript.sleep 1000
 
      dim oPort
      dim oMaster
      set oPort = CreateObject("Port.Port.1")
      set oMaster = CreateObject("PrintMaster.PrintMaster.1")
 
 
         portinput = "IP_" & portloc
      oPort.ServerName = ""
 
        sPortExist = False
      for each oPort in oMaster.Ports("")
        if oPort.PortName = portinput then
            sPortExist = True
          End If
      next
 
  If sPortExist = False then
        
      set oPort = CreateObject("Port.Port.1")
      oPort.PortName   = portinput
      oPort.PortType = 1
      oPort.HostAddress = portloc
      oPort.PortNumber = 9100
      oPort.SNMP = false
      oMaster.PortAdd oPort
      if Err <> 0 then
        msgbox "an error occurred"
      end if
 
  End If
 
 
      dim oPrinter
      set oPrinter = CreateObject("Printer.Printer.1")
      oPrinter.ServerName  = ""
        oPrinter.DriverPath  = "C:\Printer\Driver\Ricoh MP7000"
      oPrinter.InfFile     = "C:\Printer\Driver\Ricoh MP7000\RC67E12K.inf" 
      oPrinter.PrinterName = PrintQueueName 
      oPrinter.DriverName  = DriverName
      oPrinter.PortName    = portinput
      oMaster.PrinterAdd oPrinter
      if Err <> 0 then
         msgbox "an error occurred"
 
 
    set oport = nothing
    set oPrinter = nothing
    set oMaster = nothing
    set wshshell = nothing
    set fso = nothing

Open in new window

System UtilitiesPrinters and ScannersVB Script

Avatar of undefined
Last Comment
purplepomegranite
Avatar of purplepomegranite
purplepomegranite
Flag of United Kingdom of Great Britain and Northern Ireland image

While I am not sure what may be causing the error above for you (unless it is a permissions error or similar - does the account in which the script runs have privileges to the drivers locations?), I have a script that will install printers using WMI, and doesn't need prnadmin.dll.

I have adapted it with your details from the script above.

Install "Printer Number 1", "HP LaserJet IIISi", "C:\Printer\Driver\Ricoh MP7000", "C:\Printer\Driver\Ricoh MP7000\RC67E12K.inf", "1.1.1.1"
 
 
sub Install(strPrinter, strDriverName, strDriverSource, strDriverInf, strIP)
	' Install the specified printer, including driver and port
	InstallPrinterDriver strDriverName, str DriverSource, strDriverInf
	InstallPrinterPort strIP
	InstallPrinter strPrinter, strDriverName, "IP_" & strIP
end sub
 
sub InstallPrinter(strName, strDriverName, strPortName)
	' Install printer as detailed
	dim objNewPrinter
	
	Set objNewPrinter = objWMIService.Get("Win32_Printer").SpawnInstance_
 
	objPrinter.DriverName = strDriverName
	objPrinter.PortName   = strPortName 
	objPrinter.DeviceID   = strName
	objPrinter.Location = ""
	objPrinter.Network = True
	objPrinter.Shared = false
	objPrinter.Put_
end sub
 
sub InstallPrinterDriver(strDriverName, strDriverSource, strDriverInf)
	' Installs the printer driver
	
	' First check whether the driver is installed already
	Set colInstalledDrivers =  objWMIService.ExecQuery _
		("Select * from Win32_PrinterDriver where name='" & strDriverName & "'")
	for each objDriver in colInstalledDrivers
		exit sub ' We have a result, so no need to install driver
	next
	
	' Driver not present, so install it
	Set objDriver = objWMIService.Get("Win32_PrinterDriver")
 
	objDriver.Name = strDriverName
	objDriver.SupportedPlatform = "Windows NT x86"
	objDriver.Version = "3"
	objDriver.DriverPath = strDriverSource
	objDriver.Infname = strDriverInf 
	intResult = objDriver.AddPrinterDriver(objDriver)
end sub
 
sub InstallPrinterPort(strIP)
	' First check whether the port exists already
	Set colInstalledPorts =  objWMIService.ExecQuery _
		("Select * from Win32_TCPIPPrinterPort where name='IP_" & strIP & "'")
	for each objPort in colInstalledPorts
		exit sub ' We have a result, so no need to add port
	next
 
	' Add new printer port
	Set objNewPort = objWMIService.Get _
		("Win32_TCPIPPrinterPort").SpawnInstance_
 
	objNewPort.Name = "IP_" & strIP
	objNewPort.Protocol = 1
	objNewPort.HostAddress = strIP
	objNewPort.PortNumber = "9100"
	objNewPort.SNMPEnabled = False
	objNewPort.Put_
end sub

Open in new window

Avatar of rowfei
rowfei

ASKER

I get "Expected end of statement" on line 6.
Sorry, a space seems to have appeared where it shouldn't have.  Below is the correct line 6.
	InstallPrinterDriver strDriverName, strDriverSource, strDriverInf

Open in new window

Avatar of rowfei
rowfei

ASKER

Thanks. But now I get another error message "Object required: 'objWMIService'" on line 30.
Ok... let me run some tests and I'll post back in a bit.
Avatar of rowfei
rowfei

ASKER

Thanks
My apologies, there were actually a few errors in the script.  I have amended and updated as below.
dim objWMIService
 
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\.\root\cimv2")
objWMIService.Security_.Privileges.AddAsString "SeLoadDriverPrivilege", True
 
 
Install "Printer Number 1", "HP LaserJet IIISi", "C:\Printer\Driver\Ricoh MP7000", "C:\Printer\Driver\Ricoh MP7000\RC67E12K.inf", "1.1.1.1"
 
 
sub Install(strPrinter, strDriverName, strDriverSource, strDriverInf, strIP)
	' Install the specified printer, including driver and port
	InstallPrinterDriver strDriverName, str DriverSource, strDriverInf
	InstallPrinterPort strIP
	InstallPrinter strPrinter, strDriverName, "IP_" & strIP
end sub
 
sub InstallPrinter(strName, strDriverName, strPortName)
	' Install printer as detailed
	dim objNewPrinter
	
	Set objNewPrinter = objWMIService.Get("Win32_Printer").SpawnInstance_
 
	objPrinter.DriverName = strDriverName
	objPrinter.PortName   = strPortName '"IP_169.254.110.160"
	objPrinter.DeviceID   = strName
	objPrinter.Location = ""
	objPrinter.Network = True
	objPrinter.Shared = false
	objPrinter.Put_
end sub
 
sub InstallPrinterDriver(strDriverName, strDriverSource, strDriverInf)
	' Installs the printer driver
	dim strInstalledDriverName
	
	' First check whether the driver is installed already
	Set colInstalledDrivers =  objWMIService.ExecQuery _
		("Select Name from Win32_PrinterDriver)
	for each objDriver in colInstalledDrivers
		strInstalledDriverName=Left(objDriver.Name, Instr(1,objDriver.Name,",")-1)
		if strInstalledDriverName=strDriverName then exit sub ' We have a match, so no need to install driver
	next
	
	' Driver not present, so install it
	Set objDriver = objWMIService.Get("Win32_PrinterDriver")
	objDriver.Name = strDriverName '"NewPrinter Model 2900"
	objDriver.SupportedPlatform = "Windows NT x86"
	objDriver.Version = "3"
	objDriver.DriverPath = strDriverSource '"C:\Scripts\NewPrinter.dll"
	objDriver.Infname = strDriverInf '"C:\Scripts\NewPrinter.inf"
	intResult = objDriver.AddPrinterDriver(objDriver)
end sub
 
sub InstallPrinterPort(strIP)
	' First check whether the port exists already
	Set colInstalledPorts =  objWMIService.ExecQuery _
		("Select Name from Win32_TCPIPPrinterPort")
	for each objPort in colInstalledPorts
		if objPort.Name="IP_" & strIP then exit sub ' We have a result, so no need to add port
	next
 
	' Add new printer port
	Set objNewPort = objWMIService.Get _
		("Win32_TCPIPPrinterPort").SpawnInstance_
	objNewPort.Name = "IP_" & strIP
	objNewPort.Protocol = 1
	objNewPort.HostAddress = strIP
	objNewPort.PortNumber = "9100"
	objNewPort.SNMPEnabled = False
	objNewPort.Put_
end sub

Open in new window

Avatar of rowfei
rowfei

ASKER

Thanks, but get error message" Expected end of statment" on line:13.
That's very odd... copy and paste error I reckon, as that is the same bug from earlier due to an extra space...  Removed again below.

dim objWMIService
 
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\.\root\cimv2")
objWMIService.Security_.Privileges.AddAsString "SeLoadDriverPrivilege", True
 
 
Install "Printer Number 1", "HP LaserJet IIISi", "C:\Printer\Driver\Ricoh MP7000", "C:\Printer\Driver\Ricoh MP7000\RC67E12K.inf", "1.1.1.1"
 
 
sub Install(strPrinter, strDriverName, strDriverSource, strDriverInf, strIP)
	' Install the specified printer, including driver and port
	InstallPrinterDriver strDriverName, strDriverSource, strDriverInf
	InstallPrinterPort strIP
	InstallPrinter strPrinter, strDriverName, "IP_" & strIP
end sub
 
sub InstallPrinter(strName, strDriverName, strPortName)
	' Install printer as detailed
	dim objNewPrinter
	
	Set objNewPrinter = objWMIService.Get("Win32_Printer").SpawnInstance_
 
	objPrinter.DriverName = strDriverName
	objPrinter.PortName   = strPortName 
	objPrinter.DeviceID   = strName
	objPrinter.Location = ""
	objPrinter.Network = True
	objPrinter.Shared = false
	objPrinter.Put_
end sub
 
sub InstallPrinterDriver(strDriverName, strDriverSource, strDriverInf)
	' Installs the printer driver
	dim strInstalledDriverName
	
	' First check whether the driver is installed already
	Set colInstalledDrivers =  objWMIService.ExecQuery _
		("Select Name from Win32_PrinterDriver)
	for each objDriver in colInstalledDrivers
		strInstalledDriverName=Left(objDriver.Name, Instr(1,objDriver.Name,",")-1)
		if strInstalledDriverName=strDriverName then exit sub ' We have a match, so no need to install driver
	next
	
	' Driver not present, so install it
	Set objDriver = objWMIService.Get("Win32_PrinterDriver")
	objDriver.Name = strDriverName 
	objDriver.SupportedPlatform = "Windows NT x86"
	objDriver.Version = "3"
	objDriver.DriverPath = strDriverSource 
	objDriver.Infname = strDriverInf 
	intResult = objDriver.AddPrinterDriver(objDriver)
end sub
 
sub InstallPrinterPort(strIP)
	' First check whether the port exists already
	Set colInstalledPorts =  objWMIService.ExecQuery _
		("Select Name from Win32_TCPIPPrinterPort")
	for each objPort in colInstalledPorts
		if objPort.Name="IP_" & strIP then exit sub ' We have a result, so no need to add port
	next
 
	' Add new printer port
	Set objNewPort = objWMIService.Get _
		("Win32_TCPIPPrinterPort").SpawnInstance_
	objNewPort.Name = "IP_" & strIP
	objNewPort.Protocol = 1
	objNewPort.HostAddress = strIP
	objNewPort.PortNumber = "9100"
	objNewPort.SNMPEnabled = False
	objNewPort.Put_
end sub

Open in new window

Avatar of rowfei
rowfei

ASKER

Thanks, but another error message "Unterminated string constant" on line 39.
I'm doing well on this one aren't I?  Hard to believe this code comes from a working script...
Corrected below... missing speech marks this time...

dim objWMIService
 
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\.\root\cimv2")
objWMIService.Security_.Privileges.AddAsString "SeLoadDriverPrivilege", True
 
 
Install "Printer Number 1", "HP LaserJet IIISi", "C:\Printer\Driver\Ricoh MP7000", "C:\Printer\Driver\Ricoh MP7000\RC67E12K.inf", "1.1.1.1"
 
 
sub Install(strPrinter, strDriverName, strDriverSource, strDriverInf, strIP)
	' Install the specified printer, including driver and port
	InstallPrinterDriver strDriverName, strDriverSource, strDriverInf
	InstallPrinterPort strIP
	InstallPrinter strPrinter, strDriverName, "IP_" & strIP
end sub
 
sub InstallPrinter(strName, strDriverName, strPortName)
	' Install printer as detailed
	dim objNewPrinter
	
	Set objNewPrinter = objWMIService.Get("Win32_Printer").SpawnInstance_
 
	objPrinter.DriverName = strDriverName
	objPrinter.PortName   = strPortName 
	objPrinter.DeviceID   = strName
	objPrinter.Location = ""
	objPrinter.Network = True
	objPrinter.Shared = false
	objPrinter.Put_
end sub
 
sub InstallPrinterDriver(strDriverName, strDriverSource, strDriverInf)
	' Installs the printer driver
	dim strInstalledDriverName
	
	' First check whether the driver is installed already
	Set colInstalledDrivers =  objWMIService.ExecQuery _
		("Select Name from Win32_PrinterDriver")
	for each objDriver in colInstalledDrivers
		strInstalledDriverName=Left(objDriver.Name, Instr(1,objDriver.Name,",")-1)
		if strInstalledDriverName=strDriverName then exit sub ' We have a match, so no need to install driver
	next
	
	' Driver not present, so install it
	Set objDriver = objWMIService.Get("Win32_PrinterDriver")
	objDriver.Name = strDriverName 
	objDriver.SupportedPlatform = "Windows NT x86"
	objDriver.Version = "3"
	objDriver.DriverPath = strDriverSource 
	objDriver.Infname = strDriverInf 
	intResult = objDriver.AddPrinterDriver(objDriver)
end sub
 
sub InstallPrinterPort(strIP)
	' First check whether the port exists already
	Set colInstalledPorts =  objWMIService.ExecQuery _
		("Select Name from Win32_TCPIPPrinterPort")
	for each objPort in colInstalledPorts
		if objPort.Name="IP_" & strIP then exit sub ' We have a result, so no need to add port
	next
 
	' Add new printer port
	Set objNewPort = objWMIService.Get _
		("Win32_TCPIPPrinterPort").SpawnInstance_
	objNewPort.Name = "IP_" & strIP
	objNewPort.Protocol = 1
	objNewPort.HostAddress = strIP
	objNewPort.PortNumber = "9100"
	objNewPort.SNMPEnabled = False
	objNewPort.Put_
end sub

Open in new window

Avatar of rowfei
rowfei

ASKER

thanks, but get a error message " Object required:"objPrinter'" on line 24.

dim objWMIService
 
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\.\root\cimv2")
objWMIService.Security_.Privileges.AddAsString "SeLoadDriverPrivilege", True
 
 
Install "Printer Number 1", "HP LaserJet IIISi", "C:\Printer\Driver\Ricoh MP7000", "C:\Printer\Driver\Ricoh MP7000\RC67E12K.inf", "1.1.1.1"
 
 
sub Install(strPrinter, strDriverName, strDriverSource, strDriverInf, strIP)
	' Install the specified printer, including driver and port
	InstallPrinterDriver strDriverName, strDriverSource, strDriverInf
	InstallPrinterPort strIP
	InstallPrinter strPrinter, strDriverName, "IP_" & strIP
end sub
 
sub InstallPrinter(strName, strDriverName, strPortName)
	' Install printer as detailed
	dim objNewPrinter
	
	Set objPrinter = objWMIService.Get("Win32_Printer").SpawnInstance_
 
	objPrinter.DriverName = strDriverName
	objPrinter.PortName   = strPortName 
	objPrinter.DeviceID   = strName
	objPrinter.Location = ""
	objPrinter.Network = True
	objPrinter.Shared = false
	objPrinter.Put_
end sub
 
sub InstallPrinterDriver(strDriverName, strDriverSource, strDriverInf)
	' Installs the printer driver
	dim strInstalledDriverName
	
	' First check whether the driver is installed already
	Set colInstalledDrivers =  objWMIService.ExecQuery _
		("Select Name from Win32_PrinterDriver")
	for each objDriver in colInstalledDrivers
		strInstalledDriverName=Left(objDriver.Name, Instr(1,objDriver.Name,",")-1)
		if strInstalledDriverName=strDriverName then exit sub ' We have a match, so no need to install driver
	next
	
	' Driver not present, so install it
	Set objDriver = objWMIService.Get("Win32_PrinterDriver")
	objDriver.Name = strDriverName 
	objDriver.SupportedPlatform = "Windows NT x86"
	objDriver.Version = "3"
	objDriver.DriverPath = strDriverSource 
	objDriver.Infname = strDriverInf 
	intResult = objDriver.AddPrinterDriver(objDriver)
end sub
 
sub InstallPrinterPort(strIP)
	' First check whether the port exists already
	Set colInstalledPorts =  objWMIService.ExecQuery _
		("Select Name from Win32_TCPIPPrinterPort")
	for each objPort in colInstalledPorts
		if objPort.Name="IP_" & strIP then exit sub ' We have a result, so no need to add port
	next
 
	' Add new printer port
	Set objNewPort = objWMIService.Get _
		("Win32_TCPIPPrinterPort").SpawnInstance_
	objNewPort.Name = "IP_" & strIP
	objNewPort.Protocol = 1
	objNewPort.HostAddress = strIP
	objNewPort.PortNumber = "9100"
	objNewPort.SNMPEnabled = False
	objNewPort.Put_
end sub

Open in new window

Avatar of rowfei
rowfei

ASKER

Thanks, now it works. What codes should I motify to have confirmation message pops up if the installation is completed?
My God...we got there!!  Sorry about the problems, I'm clearly having an off evening...
I have modified below so that if no error occurs a successful messagebox appears.  Let's hope I haven't broken the code again...

dim objWMIService
 
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\.\root\cimv2")
objWMIService.Security_.Privileges.AddAsString "SeLoadDriverPrivilege", True
 
 
if Install("Printer Number 1", "HP LaserJet IIISi", "C:\Printer\Driver\Ricoh MP7000", "C:\Printer\Driver\Ricoh MP7000\RC67E12K.inf", "1.1.1.1") then
	MsgBox "Printer installed successfully."
end if
 
 
function Install(strPrinter, strDriverName, strDriverSource, strDriverInf, strIP)
	' Install the specified printer, including driver and port
	InstallPrinterDriver strDriverName, strDriverSource, strDriverInf
	InstallPrinterPort strIP
	Install=InstallPrinter(strPrinter, strDriverName, "IP_" & strIP)
end function
 
function InstallPrinter(strName, strDriverName, strPortName)
	' Install printer as detailed
	on error resume next
	InstallPrinter=true
	dim objPrinter : Set objPrinter = objWMIService.Get("Win32_Printer").SpawnInstance_
	
	objPrinter.DriverName = strDriverName
	objPrinter.PortName   = strPortName 
	objPrinter.DeviceID   = strName
	objPrinter.Location = ""
	objPrinter.Network = True
	objPrinter.Shared = false
	objPrinter.Put_
	if Err.Number<>0 then InstallPrinter=false
end function
 
sub InstallPrinterDriver(strDriverName, strDriverSource, strDriverInf)
	' Installs the printer driver
	dim strInstalledDriverName
	
	' First check whether the driver is installed already
	Set colInstalledDrivers =  objWMIService.ExecQuery _
		("Select Name from Win32_PrinterDriver")
	for each objDriver in colInstalledDrivers
		strInstalledDriverName=Left(objDriver.Name, Instr(1,objDriver.Name,",")-1)
		if strInstalledDriverName=strDriverName then exit sub ' We have a match, so no need to install driver
	next
	
	' Driver not present, so install it
	Set objDriver = objWMIService.Get("Win32_PrinterDriver")
	objDriver.Name = strDriverName 
	objDriver.SupportedPlatform = "Windows NT x86"
	objDriver.Version = "3"
	objDriver.DriverPath = strDriverSource 
	objDriver.Infname = strDriverInf 
	intResult = objDriver.AddPrinterDriver(objDriver)
end sub
 
sub InstallPrinterPort(strIP)
	' First check whether the port exists already
	Set colInstalledPorts =  objWMIService.ExecQuery _
		("Select Name from Win32_TCPIPPrinterPort")
	for each objPort in colInstalledPorts
		if objPort.Name="IP_" & strIP then exit sub ' We have a result, so no need to add port
	next
 
	' Add new printer port
	Set objNewPort = objWMIService.Get _
		("Win32_TCPIPPrinterPort").SpawnInstance_
	objNewPort.Name = "IP_" & strIP
	objNewPort.Protocol = 1
	objNewPort.HostAddress = strIP
	objNewPort.PortNumber = "9100"
	objNewPort.SNMPEnabled = False
	objNewPort.Put_
end sub

Open in new window

Avatar of rowfei
rowfei

ASKER

I have to take it back. I just try it on another computer which never be installed this printer. I get this error message: "Generic failure" on line 30. Code: 80041001. Source: SWbemObjectEX.

Thanks
Damn... thought we were getting somewhere.
The generic failure must be either that the driver or the port didn't install.  I am thinking the driver, as the installation code is slightly different to the other two methods - so I have changed it to match.

dim objWMIService
 
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\.\root\cimv2")
objWMIService.Security_.Privileges.AddAsString "SeLoadDriverPrivilege", True
 
 
if Install("Printer Number 1", "HP LaserJet IIISi", "C:\Printer\Driver\Ricoh MP7000", "C:\Printer\Driver\Ricoh MP7000\RC67E12K.inf", "1.1.1.1") then
	MsgBox "Printer installed successfully."
end if
 
 
function Install(strPrinter, strDriverName, strDriverSource, strDriverInf, strIP)
	' Install the specified printer, including driver and port
	InstallPrinterDriver strDriverName, strDriverSource, strDriverInf
	InstallPrinterPort strIP
	Install=InstallPrinter(strPrinter, strDriverName, "IP_" & strIP)
end function
 
function InstallPrinter(strName, strDriverName, strPortName)
	' Install printer as detailed
	on error resume next
	InstallPrinter=true
	dim objPrinter : Set objPrinter = objWMIService.Get("Win32_Printer").SpawnInstance_
	
	objPrinter.DriverName = strDriverName
	objPrinter.PortName   = strPortName 
	objPrinter.DeviceID   = strName
	objPrinter.Location = ""
	objPrinter.Network = True
	objPrinter.Shared = false
	objPrinter.Put_
	if Err.Number<>0 then InstallPrinter=false
end function
 
sub InstallPrinterDriver(strDriverName, strDriverSource, strDriverInf)
	' Installs the printer driver
	dim strInstalledDriverName
	
	' First check whether the driver is installed already
	Set colInstalledDrivers =  objWMIService.ExecQuery _
		("Select Name from Win32_PrinterDriver")
	for each objDriver in colInstalledDrivers
		strInstalledDriverName=Left(objDriver.Name, Instr(1,objDriver.Name,",")-1)
		if strInstalledDriverName=strDriverName then exit sub ' We have a match, so no need to install driver
	next
	
	' Driver not present, so install it
	Set objDriver = objWMIService.Get("Win32_PrinterDriver").SpawnInstance_
	objDriver.Name = strDriverName 
	objDriver.SupportedPlatform = "Windows NT x86"
	objDriver.Version = "3"
	objDriver.DriverPath = strDriverSource 
	objDriver.Infname = strDriverInf 
	objDriver.Put_
end sub
 
sub InstallPrinterPort(strIP)
	' First check whether the port exists already
	Set colInstalledPorts =  objWMIService.ExecQuery _
		("Select Name from Win32_TCPIPPrinterPort")
	for each objPort in colInstalledPorts
		if objPort.Name="IP_" & strIP then exit sub ' We have a result, so no need to add port
	next
 
	' Add new printer port
	Set objNewPort = objWMIService.Get _
		("Win32_TCPIPPrinterPort").SpawnInstance_
	objNewPort.Name = "IP_" & strIP
	objNewPort.Protocol = 1
	objNewPort.HostAddress = strIP
	objNewPort.PortNumber = "9100"
	objNewPort.SNMPEnabled = False
	objNewPort.Put_
end sub

Open in new window

The script below is as taken from the network for which I wrote it.  It seems that I had a different version on my machine.  I have double-checked it still works on machines without drivers/ports, etc. installed.
dim objWMIService
 
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\.\root\cimv2")
objWMIService.Security_.Privileges.AddAsString "SeLoadDriverPrivilege", True
 
 
Install "Printer Number 1", "HP LaserJet IIISi", "C:\Printer\Driver\Ricoh MP7000", "C:\Printer\Driver\Ricoh MP7000\RC67E12K.inf", "1.1.1.1"
 
 
sub Install(strPrinter, strDriverName, strDriverSource, strDriverInf, strIP)
	' Install the specified printer, including driver and port
	InstallPrinterDriver strDriverName, strDriverSource, strDriverInf
	InstallPrinterPort strIP
	InstallPrinter strPrinter, strDriverName, "IP_" & strIP
end sub
 
sub InstallPrinter(strName, strDriverName, strPortName)
	' Install printer as detailed
	dim objPrinter : Set objPrinter = objWMIService.Get("Win32_Printer").SpawnInstance_
 
	objPrinter.DriverName = strDriverName
	objPrinter.PortName   = strPortName '"IP_169.254.110.160"
	objPrinter.DeviceID   = strName
	objPrinter.Location = ""
	objPrinter.Network = True
	objPrinter.Shared = false
	objPrinter.Put_
end sub
 
sub InstallPrinterDriver(strDriverName, strDriverSource, strDriverInf)
	' Installs the printer driver
	dim colInstalledDrivers, objDriver, strInstalledDriverName
	
	' First check whether the driver is installed already
	Set colInstalledDrivers =  objWMIService.ExecQuery("Select Name from Win32_PrinterDriver")
	for each objDriver in colInstalledDrivers
		strInstalledDriverName=Left(objDriver.Name, Instr(1,objDriver.Name,",")-1)
		if strInstalledDriverName=strDriverName then exit sub ' We have a match, so no need to install driver
	next
	
	' Driver not present, so install it
	Set objDriver = objWMIService.Get("Win32_PrinterDriver")
	objDriver.Name = strDriverName
	objDriver.SupportedPlatform = "Windows NT x86"
	objDriver.Version = "3"
	objDriver.DriverPath = strDriverSource
	objDriver.Infname = strDriverInf
	objDriver.AddPrinterDriver(objDriver)
end sub
 
sub InstallPrinterPort(strIP)
	' First check whether the port exists already
	Set colInstalledPorts =  objWMIService.ExecQuery _
		("Select Name from Win32_TCPIPPrinterPort")
	for each objPort in colInstalledPorts
		if objPort.Name="IP_" & strIP then exit sub ' We have a result, so no need to add port
	next
 
	' Add new printer port
	Set objNewPort = objWMIService.Get _
		("Win32_TCPIPPrinterPort").SpawnInstance_
	objNewPort.Name = "IP_" & strIP
	objNewPort.Protocol = 1
	objNewPort.HostAddress = strIP
	objNewPort.PortNumber = "9100"
	objNewPort.SNMPEnabled = False
	objNewPort.Put_
end sub

Open in new window

I use it as a startup script on the network.  It runs quite quickly if all the printers are installed, as it only installs them if necessary.
Avatar of rowfei
rowfei

ASKER

Thanks. After I tried both codes and I got different error message.

For codes on 7/22, I got "Provider is not capable of the attempted operaton" on line 55. Code# 80041024

For codes on today, I got "Generic failure" on line 29. Code# 80041001

Thank you for your help.
Avatar of rowfei
rowfei

ASKER

Those errors only applied to the computers that never have the printer be installed.

Thanks  
One thing I've just noticed for your printer...
You declare the driver name as HP LaserJet IIISi, yet the inf file references Ricoh MP7000\RC67E12K.inf.  Is it a Ricoh printer?
The driver name must match that given in the inf file - if you open the inf file in Notepad or similar, you should be able to see the driver name.  If it doesn't match the name in the inf file, the installation will fail.  I presume the Ricoh inf would not have HP LaserJet IIISi as the driver name?
The "Provider is not capable..." error was due to my code - that version of the code was written incorrectly with regards to the driver installation.
The latest code above was taken from a fully working script, and I double-checked before posting it (I happened to be on the site I use it - and discovered the copy I had was an earlier and bugged version).  So the code above will work so long as the other elements (driver name, location, inf file) are correct.
Avatar of rowfei
rowfei

ASKER

Thanks for you info. I did review my codes again to make sure the driver name, location & ini file are correct.

I tried your codes again on a new computer, I still got the error message "Generic failure" on line 29. Code# 80041001. I am able to see the port created for that IP address.

And I tried again on my computer which has this printer installed before. I deleted the printer and the port, then click the script. No error message pops up and I am able see the printer.

Anything else we can do to make it work?

Thanks again.
Can you tell me which drivers you are using for the Ricoh?  I just want to double-check whether I can install the driver myself using the script.
I have found drivers online at http://www.ricoh-support.com/enduser/downloads/downloads.asp?fileid=18123&ricohmodelid=6450&url=http%3A%2F%2Fsupport%2Ericoh%2Ecom%2Fbb%2Fhtml%2Fdr%5Fut%5Fe%2Fre%2Fmodel%2Fmp60%2Fmp60en%2Ehtm - are any of these the one you are using?
Avatar of rowfei
rowfei

ASKER

Thanks. The one I am really working on now is Panasonic UF9000. Below is what I put in the install line:

Install "Panasonic UF9000 Printer", "Panasonic UF-9000", "\\network drive\Printer\Driver\Panasonic-UF-9000", "\\network drive\Printer\Driver\Panasonic-UF-9000\UF_9000_.INF", "1.1.1.1"

I have attached the printer driver.

Thanks
Avatar of rowfei
rowfei

ASKER

ASKER CERTIFIED SOLUTION
Avatar of purplepomegranite
purplepomegranite
Flag of United Kingdom of Great Britain and Northern Ireland image

Blurred text
THIS SOLUTION IS ONLY AVAILABLE TO MEMBERS.
View this solution by signing up for a free trial.
Members can start a 7-Day free trial and enjoy unlimited access to the platform.
See Pricing Options
Start Free Trial
VB Script
VB Script

VBScript (Visual Basic Scripting Edition) is an interpreted scripting language developed by Microsoft that is modeled on Visual Basic, but with some important differences. VBScript is commonly used for automating administrative and other tasks in Windows operating systems (by means of the Windows Script Host) and for server-side scripting in ASP web applications. It is also used for client-side scripting in Internet Explorer, specifically in intranet web applications.

39K
Questions
--
Followers
--
Top Experts
Get a personalized solution from industry experts
Ask the experts
Read over 600 more reviews

TRUSTED BY

IBM logoIntel logoMicrosoft logoUbisoft logoSAP logo
Qualcomm logoCitrix Systems logoWorkday logoErnst & Young logo
High performer badgeUsers love us badge
LinkedIn logoFacebook logoX logoInstagram logoTikTok logoYouTube logo