Windows Vista Forums
Vista Forums Home Join Vista Forums Windows 7 Forum Vista Tutorials Tags
Welcome to Windows Vista Forums. Our forum is dedicated to helping you find solutions with any problems, errors or issues you are experiencing with Windows Vista. The Vista forum also covers news and updates and has an extensive Windows Vista tutorial section that covers a wide range of tips and tricks.

Go Back   Vista Forums > Misc Newsgroups > VB Script

Vista - WMI Win32_TCPIPPrinterPort InstallDate

Reply
 
Old 05-22-2009   #1 (permalink)
Al Haraka


 
 

WMI Win32_TCPIPPrinterPort InstallDate

I am trying to use WMI in VBScript to install remote printers. Now
that it is correctly installing a port, driver, and printer, I want to
add some more details to certain fields so the data is more useful
later on. The trouble I am having here is setting the InstallDate
correctly. A quick inspection using PowerShell reveals the following
for the printer port in question:

PS C:\Windows\System32> gwmi -namespace "root\cimv2" -class
"win32_tcpipprinterport"


__GENUS : 2
__CLASS : Win32_TCPIPPrinterPort
__SUPERCLASS : CIM_ServiceAccessPoint
__DYNASTY : CIM_ManagedSystemElement
__RELPATH : Win32_TCPIPPrinterPort.Name="TEST Port"
__PROPERTY_COUNT : 17
__DERIVATION : {CIM_ServiceAccessPoint, CIM_LogicalElement,
CIM_ManagedSystemElement}
__SERVER : HOSTNAME
__NAMESPACE : root\cimv2
__PATH : \\HOSTNAME\root
\cimv2:Win32_TCPIPPrinterPort.Name="TEST Port"
ByteCount : True
Caption :
CreationClassName : Win32_TCPIPPrinterPort
Description :
HostAddress : lprserver.company.com
InstallDate :
Name : TEST Port
PortNumber : 515
Protocol : 2
Queue : TEST_Q
SNMPCommunity :
SNMPDevIndex :
SNMPEnabled : False
Status :
SystemCreationClassName : Win32_ComputerSystem
SystemName :
Type :

Now, I originally tried setting the printer port's install date using
Now(), the Date() in the script. This lead to a type mismatch. Once
I read more here, my impression was I needed to create a proper
SWbemDateTime object to pass the installation date in VT_DATE format
(so it is in UTC). I tried what I think is correct. I tried
debugging it with output, and it appears the function returns the
object. Nonetheless, I get the same result in PowerShell after
deleting the port, restarting the spooler service, and running the
script twice. Below is the code. Can anyone give me a clue here? I
am lost as hell. I am testing it in the sub InstallPrinterPort(),
passing along a SWbemDateTime object from GetInstallDate(). If anyone
could guide me along, I would really appreciate it.

Option Explicit
'On Error Resume Next

Dim objWMIService

'Check registry For key to see if we need to run
If RegistryKeyExists("SOFTWARE\Our Company", "200905HP5415") = False
Then

Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\.\root\cimv2")
objWMIService.Security_.Privileges.AddAsString
"SeLoadDriverPrivilege", True

' Delete the old printer, if necessary
Delete "TEST Printer", _
"HP LaserJet P4010_P4510 Series PCL 6", _
"lprserver.company.com", _
"TEST_Q", _
"TEST Port"

' Install new printer
Install "TEST Printer", _
"HP LaserJet P4010_P4510 Series PCL 6", _
"\\server\share\drivers\hpc4010c\vista\pcl6", _
"\\server\share\drivers\hpc4010c\vista\pcl6\hpc4015c.inf", _
"lprserver.company.com" , _
"TEST_Q" , _
"TEST Port"

' Add new registry key
Dim objShell : Set objShell = WScript.CreateObject("WScript.Shell")
'SetRegistryKey "SOFTWARE\Our Company", "200905HP5415", "Yes"

End If

' End of modifiable portion of script, begin Subs

Sub Install(strPrinterName, strDriverName, strDriverSource,
strDriverInf, strHostAddress, strQueue, strPortName)
' Install the specified printer, including driver and port
' strHostname can be a hostname OR IP address, see MSDN documentation
for more info:
' http://msdn.microsoft.com/en-us/libr...92(VS.85).aspx
InstallPrinterPort strHostAddress, strQueue, strPortName
'InstallPrinterDriver strDriverName, strDriverSource, strDriverInf
'InstallPrinter strPrinterName, strDriverName, strPortName
End Sub

Sub Delete(strPrinterName, strDriverName, strHostAddress, strQueue,
strPortName)
DeletePrinter(strPrinterName) ' Delete Old Printer
DeletePrinterDriver(strDriverName) ' Delete Old Printer Driver
DeletePrinterPort strHostAddress, strQueue, strPortName
End Sub

Sub InstallPrinter(strPrinterName, strDriverName, strPortName)
' Install printer as detailed
Dim objPrinter : Set objPrinter = objWMIService.Get
("Win32_Printer").SpawnInstance_

objPrinter.DriverName = strDriverName
objPrinter.PortName = strPortName
objPrinter.DeviceID = strPrinterName
objPrinter.Location = ""
objPrinter.Network = True
objPrinter.Shared = False
'objPrinter.InstallDate = Date
objPrinter.Put_

End Sub

Sub InstallPrinterDriver(strDriverName, strDriverSource, strDriverInf)
' Installs the printer driver
Dim objDriver, strInstalledDriverName
Dim strWMIQuery : strWMIQuery = "SELECT Name FROM
Win32_PrinterDriver"
' First check whether the driver is installed already
Dim colInstalledDrivers : Set colInstalledDrivers =
objWMIService.ExecQuery(strWMIQuery)
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)
'objDriver.InstallDate = GetInstallDate(Date)

End Sub

Sub InstallPrinterPort(strHostAddress, strQueue, strPortName)
' First check whether the port exists already
Dim objPort, strWMIQuery : strWMIQuery = "SELECT * FROM
Win32_TCPIPPrinterPort"
Dim colInstalledPorts : Set colInstalledPorts = _
objWMIService.ExecQuery(strWMIQuery)

For Each objPort in colInstalledPorts
If objPort.HostAddress = strHostAddress And _
objPort.Queue = strQueue Then Exit Sub ' We have a result, so no
need to add port
Next

' Add new printer port
Set objPort = objWMIService.Get _
("Win32_TCPIPPrinterPort").SpawnInstance_
objPort.Name = strPortName
' With Pharos, you must enable LPR byte counting,
' or the jobs will not be correctly queued.
objPort.ByteCount = TRUE
objPort.Protocol = 2
objPort.HostAddress = strHostAddress
objPort.Queue = strQueue
objPort.SNMPEnabled = False
objPort.InstallDate = GetInstallDate(Now())
WScript.Echo GetInstallDate(Now())
objPort.Put_

End Sub


Sub SetRegistryKey(strKeyPath, strValueName, strValue)

Const HKEY_LOCAL_MACHINE = &H80000002
Dim strComputer : strComputer = "."

Dim objReg : Set objReg = GetObject("winmgmts:
{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\default:StdRegProv")
objReg.CreateKey HKEY_LOCAL_MACHINE,strKeyPath

' Add string value now
Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\"
& _
strComputer & "\root\default:StdRegProv")
objReg.SetStringValue
HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue

End Sub


Function RegistryKeyExists(strKeyPath, strValueName)
' Read String and DWORD Registry Values

Dim strValue
Const HKEY_LOCAL_MACHINE = &H80000002

Dim strComputer : strComputer = "."

Dim objReg : Set objReg = GetObject("winmgmts:
{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\default:StdRegProv")

objReg.GetStringValue HKEY_LOCAL_MACHINE, _
strKeyPath, _
strValueName, _
strValue

If LCase(strValue) = "yes" Then
RegistryKeyExists = True
Exit Function
End If

RegistryKeyExists = False
Exit Function

End Function

Sub DeletePrinter(strPrinterName)

Dim objPrinter, _
colInstalledPrinters
Dim strComputer : strComputer = "."
Dim strWMIQuery : strWMIQuery = "Select * from Win32_Printer WHERE
DeviceID = '" & strPrinterName & "'"

'Dim objWMIService

Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root
\cimv2")
Set colInstalledPrinters = objWMIService.ExecQuery (strWMIQuery)
For Each objPrinter in colInstalledPrinters
objPrinter.Delete_
Next

End Sub

Sub DeletePrinterDriver(strDriverName)

'Dim objWMIService
Dim objDriver, strComputer : strComputer = "."

Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root
\cimv2")
objWMIService.Security_.Privileges.AddAsString
"SeLoadDriverPrivilege", True

Dim colInstalledDrivers : Set colInstalledDrivers = _
objWMIService.ExecQuery("SELECT Name FROM Win32_PrinterDriver")
For Each objDriver in colInstalledDrivers
'WScript.Echo objDriver.Name
If objDriver.Name=strDriverName Then objDriver.Delete_
Next

End Sub

Sub DeletePrinterPort(strHostAddress, strQueue, strPortName)

'Dim objWMIService
Dim objPort, strComputer : strComputer = "."

Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root
\cimv2")
objWMIService.Security_.Privileges.AddAsString
"SeLoadDriverPrivilege", True

Dim colInstalledPorts : Set colInstalledPorts = _
objWMIService.ExecQuery("SELECT * FROM Win32_TCPIPPrinterPort")
For Each objPort in colInstalledPorts
'WScript.Echo objPort.Queue
WScript.Echo objPort.InstallDate
If objPort.Name = strPortName And _
objPort.Queue = strQueue And _
objPort.HostAddress = strHostAddress Then
' Sometimes deleting a port errors out. Restarting the spooler
' and deleting the port through the GUI works, so I thought this
' might help if you are in a rut.
' Start print spooler, wait 10000 ms, the start it again
' RestartService "Spooler", 10000
objPort.Delete_
End If
Next

End Sub

Sub RestartService(strServiceName, intSleep)

'Dim objWMIService
Dim objService, strComputer : strComputer = "."
Dim strWMIQuery : strWMIQuery = "SELECT * from Win32_Printer WHERE
DeviceID = '" & strServiceName & "'"

Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root
\cimv2")

Dim colServices : Set colServices = objWMIService.ExecQuery
(strWMIQuery)

For Each objService in colServices
objService.StopService()
WScript.Sleep intSleep 'intSleep is a measurement in milliseconds
objService.StartService()
Next

End Sub

Function GetInstallDate(dtDateTimeStamp)
' This is not a usual DateTime datatype in VBScript, this it a
SWbemDateTime
' object, only to use for the InstallDate value of certain WMI class
members.
If IsDate(dtDateTimeStamp) Then
Dim objWMIDateTime : Set objWMIDateTime = CreateObject
("WbemScripting.SWbemDateTime")
objWMIDateTime.SetVarDate(CDate(dtDateTimeStamp))
GetInstallDate = objWMIDateTime
Else
Exit Function
End If
End Function

My System SpecsSystem Spec
Reply

Thread Tools


Similar Threads
Thread Forum
Win32_Product InstallDate PowerShell


Vista Forums is an independent web site and has not been authorized,
sponsored, or otherwise approved by Microsoft Corporation.
"Windows Vista", the Start Orb, and related materials are trademarks of Microsoft Corp.
© Designer Media Ltd

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46