Windows: 根据分组的本地TCP/IP打印机的安装(2)

序:

Printer Driver Tested:

1. HP Universal Printer Driver 6.*

This version of driver is a Windows signed driver, please download it from HP offical website.

Driver Model: HP Universal Printing PCL 6

2. Ricoh Universal Printer Driver:

This version of driver is a Windows signed driver, please download it from Ricoh offical website.

Driver Model: PCL6 Driver for Universal Print

3. KyoceraUniversal Printer Driver:

This version of driver is a Windows signed driver, please download it from Kyocera offical website.

Driver Model: KX DRIVER for Universal Printing

Codes:

'-----------------------------------------------------------------------------------
' Name: Local TCP/IP Printer Setup
' History:
' Created: May 14, 2008
' Updates: Dec 3, 2010
' Dec 7, 2010, adding support command line arguments.
' Dec 13, 2010, deal with multiple printer share one port
' Description:
' This script set up TCP/IP printer on a local PC for users who can access it.
' It is used on the following 3 cases:
' School has no server.
' School has a Mac server.
' School has a PC server, but some AD user groups have to use local
' TCP/IP printer.
'
On Error Resume Next

' ================================================
' The following could be changed by user.
' -----------------------------------------
' Global Definition of Settings.ini file.
' -----------------------------------------
Const LOCATION_FILE = "Locations.ini"
Const PRINTERS_INFO = "PrinterConfig.ini"
Const PRINTR_LIST_PST = ".txt"
Const DEFAULT_LOCATION = "Default"

' ===================================================================================
' Usually user don't need to change the following values.
' -----------------------------------------------
' Global Variables and constants.
' -----------------------------------------------
Const sVer = "0.5.3"

'------------------------
' Public Env preparation
'------------------------
' Text File operation code
Const FOR_READING = 1
Const FOR_WRITING = 2
Const For_APPENDING = 8

'------------------------
' Log Level Define
'------------------------
Const LOGLVL_None = 0
Const LOGLVL_SYSTEM = 0
Const LOGLVL_Error = 1
Const LOGLVL_Warning = 2
Const LOGLVL_ALL = 3
Const LOGLVL_Message = 3
Const LOGLVL_Debug = 9

Public piLogLevel
Public piTatalWarnings
Public piTatalErrors
Public pLogFileName

' ================================================
' ***User do NOT change the follwoing values.***
' ================================================
Const IDX_LOCATION = 0
Const IDX_COMPUTER = 1

'-----------------------------------
' Printer Info index in array
'-----------------------------------
Const IDX_Staff = 0
Const IDX_PrinterName = 1
Const IDX_IP = 2
Const IDX_InfFile = 3
Const IDX_DriverModel = 4
Const IDX_PLocation = 5
Const IDX_PComment = 6

'-----------------------------------
' Command line options
'-----------------------------------
Const SETTING_ITEM_NAME = 0
Const SETTING_ITEM_VALUE = 1
Const SCHOOL_CODE = "/c"
Const CONFIG_PATH = "/p"
Const DELETE_ALL = "/d"
Const LOCATION_FROM = "/ad"
Const LOG_LEVEL = "/l"
Const DELETE_SELF = "/s"
Const REMOTE_COMPUTER = "/r"
Const HELP_ARGS = "/h"
Const HELPS_ARGS = "/?"
Const QUIET_MODE = "/q"
Const CMD_DELETEALL = "CMD /C del /F /S /Q *.*"

'-----------------------------------
' Global Setting variables
'-----------------------------------
Public pstrSchoolCode
Public pstrConfig_Path
Public pstrDelete_All
Public pLOCATIONCTRL
Public pbDeleteSelf
Public piQuietMode
Public pstrLocationFile_Pre
'Public pstrComputer

'-----------------------------------
' Printer Related variables
'-----------------------------------
Public paPrinterList ' Printer Configuration Info List
Public piPrinterListCount ' All printer count

Public paPrinters(510) ' Computer's local Printer setup List
Public piPrinterNum '

'-----------------------------------
' Other Public variables
'-----------------------------------
Public pstrComputer ' Current Computer pointer
Public pstrComputerName ' Current Computer Name
Public pobjWMIService ' Current Computer's WMI object
Public objFSObj ' File System object.
Public pobjWMISvr '

'-------------------------------------------
' Main process
'-------------------------------------------
strLogInfo = "Set up local TCP/IP printer, start running at " & time() & " on " & Date()
strLogInfo = strLogInfo & vbCrLf & "Version " & sVer & " 2010 Tony Liu ([email protected])"
myLog LOGLVL_SYSTEM, strLogInfo
' 1. --- Get settings, initial system parameters, and get printer setting List ---
If GetArguments() <> 0 Then WScript.Quit
If SysInit() <> 0 Then WScript.Quit
If GetPrinterConfigList(objFSObj, pstrConfig_Path & pstrLocationFile_Pre & PRINTERS_INFO) <> 0 Then WScript.Quit

' 2. --- Get printers setup list from location ---
If pLOCATIONCTRL = "AD" Then
strLocation = GetLocation_AD (pstrComputerName)
Else
strLocation = GetLocation_File (pstrComputerName, pstrConfig_Path & pstrLocationFile_Pre & LOCATION_FILE, objFSObj)
End If
If strLocation = "" Then strLocation = DEFAULT_LOCATION
strLocationFile = pstrConfig_Path & LocationFileName(strLocation)
if ReadLocationPrinters(objFSObj, strLocationFile) <> 0 Then WScript.Quit

' 3. --- Remove Ports and/or Printers ---
If pstrDelete_All = True Then
iResult = RemoveAllTCPIPPrinterandPorts (pobjWMIService)
Else
iResult = DeleteUnusedTCPIPProts (pobjWMIService)
End If

' 4. --- Add Printers on list to this computer ---
iReturn = AddAllPrinters(pobjWMIService, paPrinterList, paPrinters, pstrSchoolCode)

' 5. --- Finial info ---
strLogInfo = vbCrLf & "Total Warnings: " & piTatalWarnings & vbCrLf & "Total Errors: " & piTatalErrors
strLogInfo = strLogInfo & vbCrLf & "Program ended successfully at " & time() & "." & vbCrLf & "<<<<<<"
myLog LOGLVL_ALL, strLogInfo

' 6. --- Remove Self ---
If pbDeleteSelf=True Then
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run CMD_DELETEALL, 6
End If
WScript.Quit


'-------------------------------------------
' Get all scripts' arguments
'-------------------------------------------
Function GetArguments ()

Const ARGUMENTS_ID = "<GetArguments>:"
Err.Clear

' Set public variables' default value.
pstrSchoolCode = ""
pstrLocationFile_Pre = pstrSchoolCode
pstrConfig_Path = "./"
pstrDelete_All = False
pLOCATIONCTRL = "FILE"
piLogLevel = LOGLVL_Error
pbDeleteSelf = False
pstrComputer = "."
piQuietMode = 0

GetArguments = 0
Set objArgs = WScript.Arguments
LAST_Item = objArgs.Count -1
If objArgs.Count < 1 Then
wscript.echo " /h for help"
Exit Function
End If

for args_index = 0 to LAST_ITEM
if piLogLevel >= LOGLVL_Debug then
WScript.Echo "Arguments[" & args_index & "]:" & objArgs(args_index)
End If

strOption = LCase(objArgs(args_index))
select case strOption
case SCHOOL_CODE: ' school code
args_index = args_index + SETTING_ITEM_VALUE
pstrLocationFile_Pre = Trim(objArgs(args_index)) & "_"
' pstrSchoolCode =
case CONFIG_PATH: ' configuration files path
args_index = args_index + SETTING_ITEM_VALUE
pstrConfig_Path = MakeFilePath(objArgs(args_index))
case DELETE_ALL: ' Delete all other TCP/IP printers?
pstrDelete_All = True
case LOCATION_FROM: ' Location info from AD or file?
pLOCATIONCTRL = "AD"
case LOG_LEVEL: ' Log level
args_index = args_index + SETTING_ITEM_VALUE
piLogLevel = Int(objArgs(args_index))
case DELETE_SELF: ' If delete this script self?
'args_index = args_index + SETTING_ITEM_VALUE
'strALL = Ucase(objArgs(args_index))
'If Left(strALL,1) = "N" Then
' pbDeleteSelf = False
'Else
pbDeleteSelf = True
'End If
' case REMOTE_COMPUTER:
' args_index = args_index + SETTING_ITEM_VALUE
' pstrComputer = Ucase(TRIM(objArgs(args_index)))
case QUIET_MODE:
piQuietMode = 1
case HELPS_ARGS:
ShowHelps
case HELP_ARGS:
ShowHelps
End Select
Next

if piLogLevel >= LOGLVL_Debug then
ListGlobalSettins
End If

GetArguments = err.number
If err <> 0 Then
myLog LOGLVL_Error, ARGUMENTS_ID & "Phasing Arguments: Error:" & err.number & ":" _
& err.description
Else
myLog LOGLVL_Message, ARGUMENTS_ID & "Phasing Arguments passed."
End If
Err.Clear
End Function

'-------------------------------------------
' Show help info lines
'-------------------------------------------
Function ShowHelps ()
if piQuietMode > 0 then
Exit Function
End if
WScript.Echo "Usage: command [option1 ...]"
WScript.Echo " " & CONFIG_PATH & " Path:" & vbTab & vbTab & " Full path of configuration file."
WScript.Echo " " & SCHOOL_CODE & " SchoolCode:" & vbTab & " School code of configuration files, default is none."
WScript.Echo " " & LOG_LEVEL & " [0|1|2]:" & vbTab & vbTab & " 0=none, 1=error, 2=warnings, default=1."
WScript.Echo " " & LOCATION_FROM & ":" & vbTab & " Retrieve workstation's location information from AD. default is file."
WScript.Echo " " & DELETE_ALL & ":" & vbTab & " Delete all TCP/IP printers and ports first."
WScript.Echo " " & DELETE_SELF & ":" & vbTab & " This program kill itself after done."
WScript.Echo " " & HELPS_ARGS & ":" & vbTab & " This help."
' WScript.Echo " " & REMOTE_COMPUTER & ":" & vbTab & " Remote computer name."
' WScript.Echo " " & QUIET_MODE & ":" & vbTab & " Quiet mode."
WScript.Quit
End Function

'-------------------------------------------
' System initialize
'-------------------------------------------
Function SysInit ()

Const SYSINIT_ID = "<SysInit>:"
piTatalWarnings = 0
piTatalErrors = 0

' Get local machine name
If pstrComputer = "." then
Set objComputer = CreateObject("Shell.LocalMachine")
pstrComputerName = UCase(Trim(objComputer.MachineName))
Else
pstrComputerName = Left(pstrComputer,split(pstrComputer, ".", 1)-1)
End If
pstrSchoolCode = Mid(strComputerName, 2, 3)

Set pobjWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!//" & pstrComputer & "/root/cimv2")
If err <> 0 Then
myLog LOGLVL_Error, SYSINIT_ID & "Program Initial: 1.Error:" & err.number & ":" & err.description
SysInit = err.Number
Exit Function
End If

Set objFSObj = CreateObject("Scripting.FileSystemObject")
If err <> 0 Then myLog LOGLVL_Error, SYSINIT_ID & "Program Initial: 2.Error:" & err.number & ":" & err.description

Set paPrinterList = CreateObject("Scripting.Dictionary")
If err <> 0 Then myLog LOGLVL_Error, SYSINIT_ID & "Program Initial: 3.Error:" & err.number & ":" & err.description

SysInit = err.Number
If err <> 0 Then
myLog LOGLVL_Error, SYSINIT_ID & "Program Initial: 4.Error:" & err.number & ":" & err.description
Else
myLog LOGLVL_ALL, SYSINIT_ID & "Program Initialization passed."
End If
Err.Clear
End Function

'-------------------------------------------
' Get all printers configuration definitions
'-------------------------------------------
Function GetPrinterConfigList(objFSO, strFileName)
Const GetPrinterConfigList_LogID = "<GetPrinterConfigList>:"

strLogInfo = GetPrinterConfigList_LogID & "Starting to read printer info file<" & strFileName & ">"
myLog LOGLVL_Message, strLogInfo
GetPrinterConfigList = 0
piPrinterListCount = 0
Err.Clear

Set hFile = objFSO.OpenTextFile(strFileName, FOR_READING)
if IsEmpty(hFile) OR Err <> 0 Then
strLogInfo = GetPrinterConfigList_LogID & "Couldn't open Printer_Info file <" & strLocationFile & ">."
myLog LOGLVL_Error, strLogInfo
GetPrinterConfigList = err
Else
Do Until hFile.AtEndOfStream
strThisLine = LTRIM(hFile.Readline)
If Left(strThisLine, 1) <> "#" AND Len(strThisLine)>0 Then
arrPInfo = Split(strThisLine, ",")
strPrinterName = UCase(Trim(arrPInfo(IDX_PrinterName)))
paPrinterList.add strPrinterName, arrPInfo
piPrinterListCount = piPrinterListCount + 1
End If
Loop
End If
hFile.Close

'
GetPrinterConfigList = err
If err <> 0 Then
myLog LOGLVL_Error, GetPrinterConfigList_LogID & "Failed of reading printer definition file <" & err & ">:" & err.descrption
Else
myLog LOGLVL_Message, GetPrinterConfigList_LogID & "Read <" & piPrinterListCount & "> record(S) of printer from list <" & strFileName & ">."
End If
Err.Clear
End Function


'------------------------------------------------------
' Get computer location from AD
'------------------------------------------------------
Function GetLocation_AD (strComputerName)
'
Const GetLocation_AD_LogID = "<GetLocation_AD>:"
Err.Clear
GetLocation_AD = ""

strSchoolCode = Mid(strComputerName, 2, 3)
Set objThisComputer = GetObject("LDAP://CN=" & strComputerName & ",OU=Workstations,OU=" & strSchoolCode & ",OU=Schools,DC=edu,DC=ca")
GetLocation_AD = Trim(objThisComputer.Location)

If err <> 0 Then
myLog LOGLVL_Error, GetLocation_AD_LogID & "error on fetching Computer:<" & strComputerName & "> location on AD."
Else
myLog LOGLVL_Message, GetLocation_AD_LogID & "Computer:<" & strComputerName & "> location on AD is <" & GetLocation_AD & ">"
End If

Err.Clear
End Function


'------------------------------------------------------
' Get computer location from location file.
'------------------------------------------------------
Function GetLocation_File (strComputerName, strLocationFile, objFSO)
'
Const GetLocation_File_LogID = "<GetLocation_File>:"

GetLocation_File = ""

strComputerName = UCase(strComputerName)
' myLog LOGLVL_Message, GetLocation_File_LogID & "Starting to read Location file <" & strLocationFile & "> on <" & strComputerName & "> computer."

Set hFile = objFSO.OpenTextFile(strLocationFile, FOR_READING)

if IsEmpty(hFile) or Err <> 0 Then
'
strLogInfo = GetLocation_File_LogID & "Couldn't open location file <" & strLocationFile & ">."
myLog LOGLVL_Error, strLogInfo
GetLocation_File = Null
Else
Do Until hFile.AtEndOfStream
strThisLine = Trim(hFile.Readline)
If Left(strThisLine, 1) <> "#" and Len(strThisLine)>0 Then
arrLocation = Split(strThisLine, ",")
strReadComputer = UCase(Trim(arrLocation(IDX_COMPUTER)))
If strComputerName = strReadComputer Then
GetLocation_File = Trim(arrLocation(IDX_LOCATION))
Exit Do
End If
End If
Loop
hFile.Close
End If

If len(GetLocation_File) = 0 Then
strLogInfo = GetLocation_File_LogID & "Can't find location for computer <" & strComputerName & ">."
myLog LOGLVL_Warning, strLogInfo
Else
strLogInfo = GetLocation_File_LogID & "Location got for computer <" & strComputerName & "> is <" & GetLocation_File & ">."
myLog LOGLVL_Message, strLogInfo
End If
End Function


'------------------------------------------------------
' Get printers for crrent location
'------------------------------------------------------
Function ReadLocationPrinters (objFSO, strPrinterListFile)
'
Const GLP_Warning_ID = "<ReadLocationPrinters>: "

err.Clear
piPrinterNum = 0

Set hFile = objFSO.OpenTextFile(strPrinterListFile, FOR_READING)
if IsEmpty(hFile) or Err <> 0 Then
myLog LOGLVL_Error, GLP_Warning_ID & "Couldn't open the printer list file."
Else
Do Until hFile.AtEndOfStream
strThisLine = Trim(hFile.Readline)
If Left(strThisLine, 1) <> "#" and Len(strThisLine)>0 Then
paPrinters(piPrinterNum) = UCase(strThisLine)
piPrinterNum = piPrinterNum + 1
End If
Loop
myLog LOGLVL_Message, GLP_Warning_ID & "Read <" & piPrinterNum & "> printers to be installed for current location."
hFile.Close
End If

ReadLocationPrinters = err
ListPrinterList
err.Clear
End Function


'-------------------------------------------
' Remove All jobs, TCP/IP Printer and Ports
'-------------------------------------------
Function RemoveAllTCPIPPrinterandPorts (objWMIService)

Const RemoveAllTCPIP = "<RemoveAllTCPIPPrinter&Ports>:"
err.clear
Set objDict = CreateObject("Scripting.Dictionary")

' 1. --- Delete all print jobs ---
Set colPrintJobs = objWMIService.ExecQuery("Select * from Win32_PrintJob")
For Each objPrintJob in colPrintJobs
objPrintJob.Delete_
Next

' 2. --- Delete all TCP/IP Printer and TCP/IP ports ---
Set colPrinters = objWMIService.ExecQuery("Select * from Win32_Printer")
Set colPorts = objWMIService.ExecQuery("Select * from Win32_TCPIPPrinterPort")
For Each objPort in colPorts
For Each objPrinter in colPrinters

If objPrinter.PortName = objPort.Name Then objPort.Delete_
Next
ObjPort.Delete_
Next

RemoveAllTCPIPPrinterandPorts = err
If err <> 0 Then
myLog LOGLVL_Error, RemoveAllTCPIP & "Remove All TCP/IP Printer and Ports error(" & err & "):" & err.description
Else
myLog LOGLVL_Message, RemoveAllTCPIP & "All TCP/IP Printer and ports deleted."
End If

Err.Clear
End Function


'------------------------------------------------------
' Removed all unused TCp/IP ports
'------------------------------------------------------
Function DeleteUnusedTCPIPProts (objWMIService)
Const RemoveAllTCPIP = "<DeleteUnusedTCPIPProts>:"
err.clear
Set objDict = CreateObject("Scripting.Dictionary")

' 1. --- Delete all print jobs ---
' Set colPrintJobs = objWMIService.ExecQuery("Select * from Win32_PrintJob")
' For Each objPrintJob in colPrintJobs
' objPrintJob.Delete_
' Next

' 1. ---Get all printers in dictionary ---
Set colPrinters = objWMIService.ExecQuery("Select * from Win32_Printer")
For Each objPrinter in colPrinters
if Not objDict.Exists(objPrinter.PortName) Then objDict.Add objPrinter.PortName, objPrinter
Next

' 2. --- Delete all Unused TCp/IP Ports ---
Set colPorts = objWMIService.ExecQuery("Select * from Win32_TCPIPPrinterPort")
For Each objPort in colPorts
If Not objDict.Exists(objPort.Name) Then ObjPort.Delete_
Next

DeleteUnusedTCPIPProts = err
If err <> 0 Then
strLog = RemoveAllTCPIP & "Remove Unused TCP/IP Ports error(" & err & "):" & err.description
myLog LOGLVL_Error, strLog
Else
myLog LOGLVL_Message, RemoveAllTCPIP & "Unused TCP/IP ports deleted."
End If

Err.Clear
End Function


'-------------------------------------------
' Add All Printers belong to this computer
'-------------------------------------------
Function AddAllPrinters(objWMIService, aPrinterList, aPrinterInfo, strSchoolCode)
Const AddPrinter_LogID = "<AddAllPrinters>:"
DefaultSet = False
Err.Clear

If piPrinterNum <= 0 Then
myLog LOGLVL_Warning, AddPrinter_LogID & "No Printer is added [printer number=0]."
Exit Function
End If

myLog LOGLVL_Message, AddPrinter_LogID & "---Starting Processing printers---"
For i=0 to piPrinterNum-1
' For each printer on the list, find the printer Info in printinfo array
curPrinter = paPrinters(i)
myLog LOGLVL_Message, AddPrinter_LogID & "Processing printer(" & i+1 & ")->" & curPrinter

bExist = paPrinterList.Exists(UCase(curPrinter))
If bExist = TRUE Then
arrPInfo = paPrinterList.Item(curPrinter)
strStaff = UCase(Trim(arrPInfo(IDX_Staff)))
strPrinterName = Trim(arrPInfo(IDX_PrinterName))
strIP = Trim(arrPInfo(IDX_IP))
strInfFile = Chr(34) & Trim(arrPInfo(IDX_InfFile)) & Chr(34)
strDriverModel = Trim(arrPInfo(IDX_DriverModel))
strPLocation = Trim(arrPInfo(IDX_PLocation))
strComments = Trim(arrPInfo(IDX_PComment))
ListPrinterInfo strStaff, strPrinterName, strIP, strInfFile, strDriverModel, strPLocation, strComments

' 1. --- Add port ---
if strIp = "" then strIP = strPrinterName
strPortName = MakeTCPIPPortName(strIP)
strPortName = AddTCPIPProt (objWMIService, strPortName, strIP)

' 2. --- Rename printer if exists ---
iResule = RenamePrinter(objWMIService, strPrinterName, strPrinterName & Hour(now) & Minute(now))

' 3. --- Printer Setup ---
If Len(strInfFile) > 0 Then
iResult = InstallPrinterINF (strPrinterName, strPortName, strDriverModel, strInfFile)
myLog LOGLVL_Message, AddPrinter_LogID & "Printer <" & strPortName & "> set up with INF."
Else
myLog LOGLVL_Message, AddPrinter_LogID & "No INF file defined for <" & strPortName & ">, assuming printer driver already exists <" & strDriverModel & ">."
iResult = InstallPrinter (objWMIService, strPrinterName, strPortName, strDriverModel)
End If
iRet = SetPrinterComments (objWMIService, strPrinterName, strPLocation, strComments, i)

' 6. --- Deny Student Access ---
If iResule = 0 AND strStaff = "S" Then
DenyGroup strPrinterName, strSchoolCode &"-Students_G"
End If
Else
myLog LOGLVL_Error, AddPrinter_LogID & "Printer <" & curPrinter & "> not defined in PrintersList.txt file, is ignored."
End If
myLog LOGLVL_Message, AddPrinter_LogID & "Added (" & i+1 & "/" & piPrinterNum & ") printer with success."
Next
'
Err.Clear
myLog LOGLVL_Message, AddPrinter_LogID & "All of " & piPrinterNum & " printers has been processed."
End Function


'------------------------------------------------------
'
'------------------------------------------------------
Function InstallPrinter (objWMIService, strPrinterName, strPortName, strPrinterModel)
Const InstallPrinter_LogID = "<InstallPrinter>:"
myLog LOGLVL_Message, InstallDriver_LogID & "Start setup printer <" & strPrinterName & ">:"
err.clear

' Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!//./root/cimv2")
Set objPrinter = objWMIService.Get("Win32_Printer").SpawnInstance_
objPrinter.DriverName = strPrinterModel
objPrinter.PortName = strPortName
objPrinter.DeviceID = strPrinterName
objPrinter.Network = True
objPrinter.Shared = False
objPrinter.Put_

InstallPrinter = err
If err <> 0 Then
myLog LOGLVL_Error, InstallDriver_LogID & "Install printer <" & strPrinterName & "> on port <" & strPortName & "> with driver <" & strDriverName & "> error <" & err.Description & ">."
Else
myLog LOGLVL_Message, InstallPrinter_LogID & "installed printer<" & strPrinterName & "> at port <" & strPortName& "> with driver <" & strDriverName & ">."
End If

err.clear
End Function

'------------------------------------------------------
' Set printer Comments information and default
'------------------------------------------------------
Function SetPrinterComments (objWMIService, strPrinter, strLocation, strComment,iDefault)
err.clear
' Set colPrinters = objWMIService.ExecQuery ("Select * from Win32_Printer Where DeviceID = '" & strPrinterName & "'")
' For Each objPrinter in colPrinters
' ObjPrinter.Location = strLocation
' objPrinter.Put_
' If bDefault = 0 Then
' objPrinter.SetDefaultPrinter()
' End If
' Next

strLocation = Chr(34) & strLocation & Chr(34)
strComment = Chr(34) & strComment & Chr(34)
Set WshShell = CreateObject("WScript.Shell")
strCMD = "rundll32 printui.dll,PrintUIEntry /Xs /n " & strPrinter & " Location " & strLocation & " comment " & strComment
' wscript.echo ">>>>>" & strCMD
WshShell.Run strCMD, 6, true
if iDefault = 0 Then
strCMD = "rundll32 printui.dll,PrintUIEntry /y /n " & strPrinter
WshShell.Run strCMD, 6, true
End If
End Function

'------------------------------------------------------
'
'------------------------------------------------------
Function InstallPrinterINF (strPrinterName, strPortName, strDriverName, strDriverINF)
Const InstallPrinter_LogID = "<InstallPrinterINF>:"
err.clear

strPrinterName = chr(34) & Trim(strPrinterName) & chr(34)
strPortName = chr(34) & Trim (strPortName) & chr(34)
strDriverName = chr(34) & Trim (strDriverName) & chr(34)
strPrinterLocation = chr(34) & Trim (strPrinterLocation) & chr(34)

strCMD="rundll32 printui.dll,PrintUIEntry /b " & strPrinterName & " /f " & strDriverINF & " /r " & strPortName & " /m " & strDriverName
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run strCMD, 6, true

InstallPrinterINF = err
If err <> 0 Then
myLog LOGLVL_Error, InstallDriver_LogID & "Install printer <" & strPrinterName & "> on port <" & strPortName & "> with driver <" & strDriverName & "> error: <" & err.Description & ">."
Else
myLog LOGLVL_Message, InstallPrinter_LogID & "installed printer<" & strPrinterName & "> at port <" & strPortName& "> with driver <" & strDriverName & ">."
End If
err.clear
End Function

'------------------------------------------------------
'------------------------------------------------------
Function AddTCPIPProt (objWMIService, strPortName, strPortIP)
Const AddTCPIPProt_Warning_ID = "<AddTCPIPProt>:"
err.clear

strPortIP = Trim(strPortIP)
strPortName = Ucase(Trim(strPortName))
bFound = False 'Default no same port found.

' There is no IP port exist, then Add one
Set objNewPort = objWMIService.Get("Win32_TCPIPPrinterPort").SpawnInstance_
objNewPort.Name = strPortName
objNewPort.Protocol = 1
objNewPort.HostAddress = strPortIP
objNewPort.PortNumber = "9100"
objNewPort.SNMPEnabled = True
objNewPort.SNMPCommunity = "public"
objNewPort.SNMPDevIndex = "1"
objNewPort.Put_

strLogInfo = AddTCPIPProt_Warning_ID & "Added a TCP/IP Print Port:" & strPortName & " with IP:" & strPortIP
myLog LOGLVL_Message, strLogInfo
' Set objNewPort = Null

AddTCPIPProt = strPortName
err.clear
End Function

'------------------------------------------------------
'------------------------------------------------------
Function RenamePrinter(objWMIService, strPrinterName, strToPrinterName)
Const RenameP_ID = "<RenamePrinter>:"
err.clear

Set colPrinters = objWMIService.ExecQuery ("Select * from Win32_Printer Where DeviceID = '" & strPrinterName & "'")
For Each objPrinter in colPrinters
objPrinter.RenamePrinter(strToPrinterName)
Next
myLog LOGLVL_Message, RenameP_ID & "Rename exist printer finished <" & strPrinterName & ">."

RenamePrinter = err
err.Clear
End Function


'------------------------------------------------------
'------------------------------------------------------
Function myLog (LogType, strLog)
Err.Clear

if piQuietMode > 0 then
Exit Function
End if
'
' Ouput Only the LogType is rgeater than system Log Level
'
Select Case LogType
Case LOGLVL_Warning
piTatalWarnings = piTatalWarnings + 1
Case LOGLVL_Error
piTatalErrors = piTatalErrors + 1
End Select

If LogType <= piLogLevel Then
Select Case LogType
Case LOGLVL_Message
strLog = "MSG: " & strLog
Case LOGLVL_Warning
strLog = "WRN: " & strLog
Case LOGLVL_Error
strLog = "ERR: " & strLog
End Select

' strLog = vbCrLf & strLog
WScript.Echo strLog
' Set objFSObj1 = CreateObject("Scripting.FileSystemObject")
' Set objLogFile = objFSObj1.OpenTextFile(LOG_FILENAME, For_APPENDING, True)
' objLogFile.WriteLine(strLog)
' objLogFile.Close
End If
Err.Clear
End Function


'------------------------------------------------------
' Set printer security
'------------------------------------------------------
Function DenyGroup (strPrinter, strGroup)
'
' Const DenyGroup_LogID = "DenyGroup:"
Const DenyGroup_LogID = "<DenyGroup>:"


' Build the command line.
strCMD="SetACL.exe -on """ & strPrinter & """ -ot prn -actn ace -ace ""n:EDU/" & strGroup & ";p:print;m:deny"""
'strCMD="c:/Windows/system32/SetACL"

Set WshShell = CreateObject("WScript.Shell")
' WshShell.Exec(strCMD)
WshShell.Run strCMD, 6

DenyGroup = 0
'
strLogInfo = DenyGroup_LogID & "Group <" & strGroup & "> has been set DENY using printer <" _
& strPrinter & ">."
myLog LOGLVL_Message, strLogInfo
End Function

'------------------------------------------------------
' Make up TCp/IP Port Name from IP address.
'------------------------------------------------------
Function MakeTCPIPPortName(strIP)
MakeTCPIPPortName = Replace("PP_" & Trim(Replace(strIP, ".", "_")), " ", "")
End Function

'------------------------------------------------------
' Build location file name
'------------------------------------------------------
Function LocationFileName(Location)
LocationFileName = pstrLocationFile_Pre & Location & PRINTR_LIST_PST
End Function

'------------------------------------------------------
'------------------------------------------------------
Function MakeFilePath (sPath)
MakeFilePath = sPath
If Right(sPath, 1) <> "/" then
MakeFilePath = sPath & "/"
end if
End Function


'------------------------------------------------------
' List one printer Configuration.
'------------------------------------------------------
Sub ListPrinterInfo (strStaff, strPrinterName, strIP, strInfFile, strDriverModel, strPLocation, strComment)
myLog LOGLVL_Message, "<" & strPrinterName & "> printer's configuration:"
myLog LOGLVL_Message, vbTab & "Access Bit = <" & strStaff & ">."
myLog LOGLVL_Message, vbTab & "IP Address = <" & strIP & ">."
myLog LOGLVL_Message, vbTab & " INF file = <" & strInfFile & ">."
myLog LOGLVL_Message, vbTab & "Model Name = <" & strDriverModel & ">."
myLog LOGLVL_Message, vbTab & " Location = <" & strPLocation & ">."
myLog LOGLVL_Message, vbTab & " Comments = <" & strComment & ">."
End Sub

'------------------------------------------------------
' List all printers will be setup which get from locatoin file.
'------------------------------------------------------
Sub ListPrinterList()
For i=0 to piPrinterNum-1
myLog LOGLVL_Message, vbTab & "Printer configuration List(" & i & "): " & paPrinters(i)
Next
End Sub


Sub ListGlobalSettins()
myLog LOGLVL_Message, "Command line arguments:"
myLog LOGLVL_Message, " " & CONFIG_PATH & " :" & pstrConfig_Path
myLog LOGLVL_Message, " " & DELETE_ALL & " :" & pstrDelete_All
myLog LOGLVL_Message, " " & LOCATION_FROM & ":" & pLOCATIONCTRL
myLog LOGLVL_Message, " " & DELETE_SELF & " :" & pbDeleteSelf
myLog LOGLVL_Message, " " & SCHOOL_CODE & " :" & pstrSchoolCode
myLog LOGLVL_Message, " " & LOG_LEVEL & " :" & piLogLevel
myLog LOGLVL_Message, " " & REMOTE_COMPUTER & " :" & pstrConfig_Path
myLog LOGLVL_Message, " " & QUIET_MODE & " :" & piQuietMode
End Sub

你可能感兴趣的:(windows)