'---------------------------------------------------------------------- ' ' Copyright (c) Microsoft Corporation 1999 ' All Rights Reserved ' ' Abstract: ' ' clone.vbs - printer server cloning script for Windows 2000 ' ' Usage: ' ' clone [-dopfa?] [-c server-name] ' ' Examples: ' clone -d ' clone -o -c \\server ' clone -p -c \\server ' clone -f ' clone -a ' '---------------------------------------------------------------------- option explicit ' ' Messages to be displayed if the scripting host is not cscript ' const kMessage1 = "Please run this script using CScript." const kMessage2 = "This can be achieved by" const kMessage3 = "1. Using ""CScript script.vbs arguments"" or" const kMessage4 = "2. Changing the default Windows Scripting Host to CScript" const kMessage5 = " using ""CScript //H:CScript //S"" and running the script " const kMessage6 = " ""script.vbs arguments""." ' ' Default script names ' const kDriverScript = "drv_clone.vbs" const kPortScript = "port_clone.vbs" const kPrinterScript = "prn_clone.vbs" const kFormScript = "form_clone.vbs" ' ' The shell script for installing all components ' const kInstallScript = "install.bat" ' ' Strings identifying environments ' const kEnvironmentIntel = "Windows NT x86" const kEnvironmentMIPS = "Windows NT R4000" const kEnvironmentAlpha = "Windows NT Alpha_AXP" const kEnvironmentPowerPC = "Windows NT PowerPC" const kEnvironmentWindows = "Windows 4.0" const kEnvironmentUnknown = "unknown" ' ' Strings identifying architectures ' const kArchIntel = "Intel" const kArchMIPS = "MIPS" const kArchAlpha = "Alpha" const kArchPowerPC = "PowerPC" const kArchUnknown = "Unknown" ' ' Strings identifying driver versions ' Change these strings on localized builds ' const kVersionWindows95 = "Windows 95 or 98" const kVersion_NT31 = "Windows NT 3.1" const kVersion35x = "Windows NT 3.5 or 3.51" const kVersion351 = "Windows NT 3.51" const kVersion40 = "Windows NT 4.0" const kVersion4050 = "Windows NT 4.0 or 2000" const kVersion50 = "Windows 2000" ' ' Action codes ' const kActionUnknown = 0 const kActionDrivers = 1 const kActionPorts = 2 const kActionPrinters = 3 const kActionForms = 4 const kActionAll = 5 ' ' Port types ' const kTcpRaw = 1 const kTcpLpr = 2 const kLocal = 3 const kLprMon = 5 const kHPdlc = 7 const kUnknown = 8 const kStdTCPIP = "Standard TCP/IP Port" ' ' Printer attribute masks ' const kPrinterNetwork = 16 const kPrinterLocal = 64 ' ' Search patterns used in the regular expressions ' to skip COMx: and LPTx: ports ' const kComPortPattern = "^COM\d+:$" const kLptPortPattern = "^LPT\d+:$" ' ' Persist constant ' const kAllSettings = 127 ' ' Other string constants ' const kTrueStr = "true" const kFalseStr = "false" const kLongLineStr = _ "'--------------------------------------------------------------------------" ' ' Source server that will be cloned ' dim strServerName dim strPrefixServerName ' ' For writing the script file ' dim oFileSystem dim oScript ' ' Script name string ' dim strScriptName dim iAction main ' ' Main execution starts here ' sub main ' ' Abort if the host is not cscript ' if not IsHostCscript() then call wscript.echo(kMessage1 & vbCRLF & kMessage2 & vbCRLF & _ kMessage3 & vbCRLF & kMessage4 & vbCRLF & _ kMessage5 & vbCRLF & kMessage6 & vbCRLF) wscript.quit end if ParseCommandLine ' ' Check if a machine name was passed ' if (strServerName <> "") then strPrefixServerName = strServerName else strPrefixServerName = strGetLocalMachineName() end if ' ' Remove the "\\" in front of the machine name ' strPrefixServerName = strGetNameStringOnly(strPrefixServerName) & "_" set oFileSystem = CreateObject ("Scripting.FileSystemObject") ' ' According to the different action codes, create the corresponding script ' if iAction = kActionDrivers or iAction = kActionAll then strScriptName = strPrefixServerName & kDriverScript DriverCloneScript strScriptName, strServerName end if if iAction = kActionPorts or iAction = kActionAll then strScriptName = strPrefixServerName & kPortScript PortCloneScript strScriptName, strServerName end if if iAction = kActionPrinters or iAction = kActionAll then strScriptName = strPrefixServerName & kPrinterScript PrinterCloneScript strScriptName, strServerName end if if iAction = kActionForms or iAction = kActionAll then strScriptName = strPrefixServerName & kFormScript FormCloneScript strScriptName, strServerName end if ' ' Generate the script for launching all the cloning scripts ' strScriptName = strPrefixServerName & kInstallScript InstallScript strScriptName, strPrefixServerName end sub ' '------------------------------------------------------------------------ ' Driver cloning script '------------------------------------------------------------------------ ' sub DriverCloneScript(ByVal strScriptName, ByVal strServerName) on error resume next wscript.echo wscript.echo "Creating the driver cloning script..." ' ' Open the script file ' set oScript = oFileSystem.CreateTextFile(strScriptName,TRUE) ' ' Write the header of the driver cloning script ' DriverStartUp ws(" EchoLine kNormal, """" ") ws(" EchoLine kNormal, ""------------------------------"" ") ws(" EchoLine kNormal, ""Start installing drivers..."" ") ' ' Enumerate all the drivers in server "strServerName", for each driver ' found, add a line in the script to call the AddDriver subroutine ' dim oMaster dim oDriver dim iDriverCount iDriverCount = 0 set oMaster = CreateObject("PrintMaster.PrintMaster.1") for each oDriver in oMaster.Drivers(strServerName) if Err = 0 then ' ' Add a call to "AddDriver" function in the script ' iDriverCount = iDriverCount + 1 ws(" AddDriver strDestServer, _") ws(" """ & oDriver.ModelName & """, _") ws(" """ & GetVersion(oDriver.Version, oDriver.Environment) & """, _") ' ' Change Path to be default, i.e. "" ' ws(" """", _") ws(" """ & GetArchitecture(oDriver.Environment) & """, _") ' ' Change InfFile to be default, i.e. "" ' ws(" """" ") else ' ' Clean up ' oScript.Close oFileSystem.DeleteFile strScriptName wscript.echo "Error: Listing ports, error: 0x" & Hex(Err.Number) if Err.Description <> "" then wscript.echo "Error description: " & Err.Description end if exit sub end if next wscript.echo "Success: Listing drivers on server " & strServerName ' ' Write the summary script ' wscript.echo "A total of " & CStr(iDriverCount) & " drivers are listed." ws(" EchoLine kNormal, ""Attempted to install a total of "" & CStr(iDriverCount) & "" driver(s)."" ") ws(" EchoLine kNormal, CStr(iSuccessCount) & "" driver(s) were successfully installed."" ") ' ' Append other functions to the driver cloning script ' DriverCleanUp ' ' Close the script file ' oScript.Close wscript.echo "The script file for cloning drivers is """ & strScriptName & """." end sub ' ' Writing the script for "AddDriver" function ' sub ScriptAddDriver ' ' Insert the comment line before the function header ' blank ws("'") ws("' Add a driver") ws("'") ' ' The function header ' ws("sub AddDriver(ByVal strServerName, _") ws(" ByVal strModelName, _") ws(" ByVal strDriverVersion, _") ws(" ByVal strPath, _") ws(" ByVal strDriverArchitecture, _") ws(" ByVal strInfFile _") ws(")") blank ' ' The function body ' ws(" on error resume next") blank ' ' Print out the information about the driver that is about to be installed ' ws(" iDriverCount = iDriverCount + 1") ws(" EchoLine kVerbose, ""Driver:"" & CSTR(iDriverCount) ") ws(" EchoLine kVerbose, "" ServerName : "" & strServerName ") ws(" EchoLine kVerbose, "" ModelName : "" & strModelName ") ws(" EchoLine kVerbose, "" DriverVersion : "" & strDriverVersion ") ws(" EchoLine kVerbose, "" DriverArchitecture : "" & strDriverArchitecture ") blank ' ' The code that installs the driver ' ws(" dim oMaster") ws(" dim oDriver") blank ws(" set oMaster = CreateObject(""PrintMaster.PrintMaster.1"")") ws(" set oDriver = CreateObject(""Driver.Driver.1"")") blank ws(" oDriver.ServerName = strServerName") ws(" oDriver.ModelName = strModelName") ws(" oDriver.DriverVersion = strDriverVersion") ws(" oDriver.Path = strPath") ws(" oDriver.DriverArchitecture = strDriverArchitecture") ws(" oDriver.InfFile = strInfFile") blank ws(" oMaster.DriverAdd oDriver") blank ws(" if Err = 0 then") blank ws(" EchoLine kVerbose, ""Success: Driver "" & strModelName & "" added to server "" & strServerName ") ws(" iSuccessCount = iSuccessCount + 1") blank ws(" else") blank ws(" EchoLine kNormal, ""Error adding driver "" & strModelName & "", error: 0x"" & Hex(Err.Number)") ws(" if Err.Description <> """" then ") ws(" EchoLine kNormal, "" Error description: "" & Err.Description ") ws(" end if") ws(" Err.Clear") blank ws(" end if") blank ws(" EchoLine kVerbose, """"") blank ws("end sub") blank end sub ' ' StartUp script for cloning drivers ' sub DriverStartUp ' ' Start creating the driver cloning script ' CopyrightScript DriverAbstractScript ' ' The script program starts ' blank ws("option explicit") blank ws("'") ws("' Verbose Level") ws("'") ws("const kNormal = 0") ws("const kVerbose = 1") blank ws("'") ws("' Flag, set if the user doesn't want to replace the old forms") ws("'") ws("dim bKeepOriginalOnes") blank ws("dim strDestServer") blank ws("' The number of drivers to be installed") blank ws("dim iDriverCount") blank ws("' The number of drivers successfully installed") blank ws("dim iSuccessCount") blank ws("dim bVerbose") blank ws("main") blank ws("'") ws("' Main execution starts here") ws("'") ws("sub main") blank ws(" bVerbose = false") ws(" bKeepOriginalOnes = false") ws(" iDriverCount = 0") ws(" iSuccessCount = 0") ws(" strDestServer = """"") ws(" ParseCommandLine") blank end sub ' ' CleanUp script for cloning drivers ' sub DriverCleanUp ws("end sub") ' ' Append the subroutine "AddDriver" ' ScriptAddDriver ' ' Append the command line parsing script ' ParseCommandLineScript ' ' Append the Usage script ' DriverUsageScript ' ' Append the output macro ' EchoLineScript end sub ' ' Abstract for the driver cloning script ' sub DriverAbstractScript ws("' Abstract:") ws("'") ws("' " & strScriptName & " - driver cloning script for Windows 2000") ws("'") oScript.WriteLine(kLongLineStr) end sub ' ' The Usage script used in the driver cloning script ' sub DriverUsageScript blank ws("'") ws("' Display command usage.") ws("'") ws("sub Usage(ByVal bExit)") blank ws(" EchoLine kNormal, ""Usage: " & strScriptName & " [-c Destination_Server] [-v]"" ") ws(" EchoLine kNormal, ""Arguments:"" ") ws(" EchoLine kNormal, "" -c - destination server name"" ") ws(" EchoLine kNormal, "" -v - verbose mode"" ") ws(" EchoLine kNormal, "" -? - display command usage"" ") ws(" EchoLine kNormal, """" ") ws(" EchoLine kNormal, ""Examples:"" ") ws(" EchoLine kNormal, "" " & strScriptName & """ ") blank ws(" if bExit then") ws(" wscript.quit(1)") ws(" end if") blank ws("end sub") blank end sub ' '------------------------------------------------------------------------ ' Port cloning script '------------------------------------------------------------------------ ' sub PortCloneScript(ByVal strScriptName, ByVal strServerName) on error resume next wscript.echo wscript.echo "Creating the port cloning script..." ' ' Open the script file ' set oScript = oFileSystem.CreateTextFile(strScriptName,TRUE) PortStartUp ws(" EchoLine kNormal, """" ") ws(" EchoLine kNormal, ""------------------------------"" ") ws(" EchoLine kNormal, ""Start installing ports..."" ") ' ' Enumerate all the ports in server "strServerName", for each port found, ' add a line in the script to call the AddLocalPort subroutine ' dim oMaster dim oPort dim iPortCount iPortCount = 0 set oMaster = CreateObject("PrintMaster.PrintMaster.1") for each oPort in oMaster.Ports(strServerName) if Err = 0 then if oPort.PortType = kLprMon or oPort.PortType = kHPdlc then ' ' Skip these ports because PrnAdmin cannot add them ' wscript.echo "Skipping port " & oPort.PortName & " (" & Description(oPort.PortType) & ")" else ' ' Duplicate only local ports different from LPTx:, COMx: ' if oPort.PortType = kLocal and _ bFindPortPattern(kComPortPattern, oPort.PortName) = false and _ bFindPortPattern(kLptPortPattern, oPort.PortName) = false then ' ' First try deleting the existing port ' ws(" DeletePort strDestServer, _") ws(" """ & StuffQuote(oPort.PortName) & """") ' ' Add the local port ' iPortCount = iPortCount + 1 ws(" AddLocalPort strDestServer, _") ws(" """ & StuffQuote(oPort.PortName) & """") blank else ' ' Otherwise, clone Standard TCP/IP ports ' if oPort.PortType = kTcpRaw or _ oPort.PortType = kTcpLpr or _ oPort.Description = kStdTCPIP then ' ' Get the configuration of this TCP port ' dim strPortNameBackup strPortNameBackup = oPort.PortName oMaster.PortGet strServerName, strPortNameBackup , oPort if Err = 0 then ' ' First try deleting the existing port ' ws(" DeletePort strDestServer, _") ws(" """ & StuffQuote(oPort.PortName) & """") ' ' Add this standard TCP/IP port ' iPortCount = iPortCount + 1 if oPort.PortType = kTcpRaw then ' ' Add a call to "AddTCPRawPort" ' ws(" AddTCPRawPort strDestServer, _") ws(" """ & StuffQuote(oPort.PortName) & """, _") ws(" """ & oPort.HostAddress & """, _") ws(" " & CStr(oPort.PortNumber) & ", _") ws(" " & BoolStr(oPort.SNMP) & ", _") ws(" " & CStr(oPort.SNMPDeviceIndex) & ", _") ws(" """ & oPort.CommunityName & """") blank else ' ' Add a call to "AddTCPLprPort" ' ws(" AddTCPLprPort strDestServer, _") ws(" """ & StuffQuote(oPort.PortName) & """, _") ws(" """ & oPort.HostAddress & """, _") ws(" " & CStr(oPort.PortNumber) & ", _") ws(" """ & oPort.QueueName & """, _") ws(" " & BoolStr(oPort.SNMP) & ", _") ws(" " & CStr(oPort.SNMPDeviceIndex) & ", _") ws(" """ & oPort.CommunityName & """, _") ws(" " & BoolStr(oPort.DoubleSpool) & "") blank end if else wscript.echo "Error getting configuration for port " & oPort.PortName & " (Standard TCP Port)" Err.Clear end if else wscript.echo "Skipping port " & oPort.PortName & " (" & Description(oPort.PortType) & ")" end if end if end if else ' ' Clean up ' oScript.Close oFileSystem.DeleteFile strScriptName wscript.echo "Error: Listing ports, error: 0x" & Hex(Err.Number) if Err.Description <> "" then wscript.echo "Error description: " & Err.Description end if exit sub end if next if Err = 0 then wscript.echo "Success: Listing ports on Server " & strServerName else wscript.echo "Error: Listing ports, error: 0x" & Hex(Err.Number) if Err.Description <> "" then wscript.echo "Error description: " & Err.Description end if Err.Clear end if ' ' Write the summary script ' wscript.echo "A total of " & CStr(iPortCount) & " port(s) are listed." ws(" EchoLine kNormal, ""Attempted to install a total of "" & CStr(iPortCount) & "" port(s)."" ") ws(" EchoLine kNormal, CStr(iSuccessCount) & "" port(s) successfully installed,"" ") ws(" EchoLine kNormal, CStr(iExistCount) & "" port(s) already exist."" ") ' ' Append other functions of port cloning script ' PortCleanUp ' ' Close the script file ' oScript.Close wscript.echo "The script file for cloning ports is """ & strScriptName & """." end sub ' ' Subroutine of "AddLocalPort" ' sub ScriptAddLocalPort ' ' Insert the comment line before the function header ' blank ws("'") ws("' Add a local port") ws("'") ' ' The function header ' ws("sub AddLocalPort(ByVal strServerName, _") ws(" ByVal strPortName _") ws(")") blank ' ' The function body ' ws(" on error resume next") blank ' ' Print out the information about the port that is about to be installed ' ws(" iPortCount = iPortCount + 1") ws(" EchoLine kVerbose, ""Port:"" & CStr(iPortCount) ") ws(" EchoLine kVerbose, "" ServerName : "" & strServerName ") ws(" EchoLine kVerbose, "" PortName : "" & strPortName ") ws(" EchoLine kVerbose, "" PortType : " & Description(kLocal) & """") blank ws(" dim oMaster") ws(" dim oPort") blank ws(" set oMaster = CreateObject(""PrintMaster.PrintMaster.1"")") ws(" set oPort = CreateObject(""Port.Port.1"")") blank ws(" oPort.ServerName = strServerName") ws(" oPort.PortName = strPortName") ws(" oPort.PortType = kLocal" ) blank ws(" oMaster.PortAdd oPort") blank ws(" if Err = 0 or Err.Number = &H800700B7 then") blank ws(" if Err = 0 then") ws(" EchoLine kVerbose, ""Success: Port "" & strPortName & "" (" & Description(kTcpRaw) & ") added to server "" & strServerName ") ws(" iSuccessCount = iSuccessCount + 1") ws(" else") ws(" EchoLine kVerbose, ""Port "" & strPortName & "" (" & Description(kTcpRaw) & ") already exists on server "" & strServerName ") ws(" iExistCount = iExistCount + 1") ws(" end if") blank ws(" else") blank ws(" EchoLine kNormal, ""Error: adding port "" & strPortName & "" (" & Description(kLocal) & "), error: 0x"" & Hex(Err.Number) ") ws(" if Err.Description <> """" then ") ws(" EchoLine kNormal, "" Error description: "" & Err.Description ") ws(" end if") ws(" Err.Clear") blank ws(" end if") blank ws(" EchoLine kVerbose, """"") blank ws("end sub") blank end sub ' ' Subroutine of "AddTCPRawPort" ' sub ScriptAddTCPRawPort ' ' Insert the comment line before the function header ' blank ws("'") ws("' Add a Tcp raw port") ws("'") ' ' The function header ' ws("sub AddTCPRawPort(ByVal strServerName, _") ws(" ByVal strPortName, _") ws(" ByVal strHostAddress, _") ws(" ByVal PortNumber, _") ws(" ByVal SNMP, _") ws(" ByVal SNMPDeviceIndex, _") ws(" ByVal CommunityName _") ws(")") blank ' ' The function body ' ws(" on error resume next") blank ' ' Print out the information about the port that is about to be installed ' ws(" iPortCount = iPortCount + 1") ws(" EchoLine kVerbose, ""Port:"" & CStr(iPortCount) ") ws(" EchoLine kVerbose, "" ServerName : "" & strServerName ") ws(" EchoLine kVerbose, "" PortName : "" & strPortName ") ws(" EchoLine kVerbose, "" PortType : " & Description(kTcpRaw) & """") ws(" EchoLine kVerbose, "" HostAddress : "" & strHostAddress ") ws(" EchoLine kVerbose, "" PortNumber : "" & CStr(PortNumber) ") ws(" EchoLine kVerbose, "" SNMP : "" & BoolStr(SNMP) ") ws(" EchoLine kVerbose, "" SNMPDeviceIndex : "" & CStr(SNMPDeviceIndex) ") ws(" EchoLine kVerbose, "" CommunityName : "" & CommunityName ") blank ' ' The code that installs the port ' ws(" dim oMaster") ws(" dim oPort") blank ws(" set oMaster = CreateObject(""PrintMaster.PrintMaster.1"")") ws(" set oPort = CreateObject(""Port.Port.1"")") blank ws(" oPort.ServerName = strServerName") ws(" oPort.PortName = strPortName") ws(" oPort.PortType = kTcpRaw" ) ws(" oPort.HostAddress = strHostAddress") ws(" oPort.PortNumber = PortNumber") ws(" oPort.SNMP = SNMP") ws(" oPort.SNMPDeviceIndex = SNMPDeviceIndex") ws(" oPort.CommunityName = CommunityName") blank ws(" oMaster.PortAdd oPort") blank ws(" if Err = 0 or Err.Number = &H80070034 then") blank ws(" if Err = 0 then") ws(" EchoLine kVerbose, ""Success: Port "" & strPortName & "" (" & Description(kTcpRaw) & ") added to server "" & strServerName ") ws(" iSuccessCount = iSuccessCount + 1") ws(" else") ws(" EchoLine kVerbose, ""Port "" & strPortName & "" (" & Description(kTcpRaw) & ") already exists on server "" & strServerName ") ws(" iExistCount = iExistCount + 1") ws(" end if") blank ws(" else") blank ws(" EchoLine kNormal, ""Error: adding port "" & strPortName & "" (" & Description(kTcpRaw) & "), error: 0x"" & hex(Err.Number) ") ws(" if Err.Description <> """" then ") ws(" EchoLine kNormal, "" Error description: "" & Err.Description ") ws(" end if") ws(" Err.Clear") blank ws(" end if") blank ws(" EchoLine kVerbose, """"") blank ws("end sub") blank end sub ' ' Subroutine of "AddTCPLprPort" ' sub ScriptAddTCPLprPort ' ' Insert the comment line before the function header ' blank ws("'") ws("' Add a Tcp lpr port") ws("'") ' ' The function header ' ws("sub AddTCPLprPort(ByVal strServerName, _") ws(" ByVal strPortName, _") ws(" ByVal strHostAddress, _") ws(" ByVal PortNumber, _") ws(" ByVal QueueName, _") ws(" ByVal SNMP, _") ws(" ByVal SNMPDeviceIndex, _") ws(" ByVal CommunityName, _") ws(" ByVal DoubleSpool _") ws(")") blank ' ' The function body ' ws(" on error resume next") blank ' ' Print out the information about the port that is about to be installed ' ws(" iPortCount = iPortCount + 1") ws(" EchoLine kVerbose, ""Port:"" & CStr(iPortCount) ") ws(" EchoLine kVerbose, "" ServerName : "" & strServerName ") ws(" EchoLine kVerbose, "" PortName : "" & strPortName ") ws(" EchoLine kVerbose, "" PortType : " & Description(kTcpLpr) & """") ws(" EchoLine kVerbose, "" HostAddress : "" & strHostAddress ") ws(" EchoLine kVerbose, "" PortNumber : "" & CStr(PortNumber) ") ws(" EchoLine kVerbose, "" QueueName : "" & QueueName ") ws(" EchoLine kVerbose, "" SNMP : "" & BoolStr(SNMP) ") ws(" EchoLine kVerbose, "" SNMPDeviceIndex : "" & CStr(SNMPDeviceIndex) ") ws(" EchoLine kVerbose, "" CommunityName : "" & CommunityName ") ws(" EchoLine kVerbose, "" DoubleSpool : "" & BoolStr(DoubleSpool) ") blank ' ' The code that installs the port ' ws(" dim oMaster") ws(" dim oPort") blank ws(" set oMaster = CreateObject(""PrintMaster.PrintMaster.1"")") ws(" set oPort = CreateObject(""Port.Port.1"")") blank ws(" oPort.ServerName = strServerName") ws(" oPort.PortName = strPortName") ws(" oPort.PortType = kTcpLpr" ) ws(" oPort.HostAddress = strHostAddress") ws(" oPort.PortNumber = PortNumber") ws(" oPort.QueueName = QueueName") ws(" oPort.SNMP = SNMP") ws(" oPort.SNMPDeviceIndex = SNMPDeviceIndex") ws(" oPort.CommunityName = CommunityName") ws(" oPort.DoubleSpool = DoubleSpool") blank ws(" oMaster.PortAdd oPort") blank ws(" if Err = 0 or Err.Number = &H80070034 then") blank ws(" if Err = 0 then") ws(" EchoLine kVerbose, ""Success: Port "" & strPortName & "" (" & Description(kTcpRaw) & ") added to server "" & strServerName ") ws(" iSuccessCount = iSuccessCount + 1") ws(" else") ws(" EchoLine kVerbose, ""Port "" & strPortName & "" (" & Description(kTcpRaw) & ") already exists on server "" & strServerName ") ws(" iExistCount = iExistCount + 1") ws(" end if") blank ws(" else") blank ws(" EchoLine kNormal, ""Error: adding port "" & strPortName & "" (" & Description(kTcpLpr) & "), error: 0x"" & Hex(Err.Number) ") ws(" if Err.Description <> """" then ") ws(" EchoLine kVerbose, "" Error description: "" & Err.Description ") ws(" end if") ws(" Err.Clear") blank ws(" end if") blank ws(" EchoLine kVerbose, """"") blank ws("end sub") blank end sub ' ' Subroutine of "DeletePort" ' sub ScriptDeletePort ' ' Insert the comment line before the function header ' blank ws("'") ws("' Delete an existing port") ws("'") ' ' The function header ' ws("sub DeletePort(ByVal strServerName, _") ws(" ByVal strPortName _") ws(")") blank ' ' The function body ' ws(" on error resume next") blank ' ' If the user asks for keeping the original port, then don't delete it ' ws(" if bKeepOriginalOnes = true then") blank ws(" exit sub") blank ws(" end if") blank ' ' Print out the information about the port that is about to be deleted ' ws(" EchoLine kVerbose, "" Deleting Port: """) ws(" EchoLine kVerbose, "" ServerName : "" & strServerName ") ws(" EchoLine kVerbose, "" PortName : "" & strPortName ") blank ' ' The code that deletes the port ' ws(" dim oMaster") ws(" dim oPort") blank ws(" set oMaster = CreateObject(""PrintMaster.PrintMaster.1"")") ws(" set oPort = CreateObject(""Port.Port.1"")") blank ws(" oPort.ServerName = strServerName") ws(" oPort.PortName = strPortName") blank ws(" oMaster.PortDel oPort") blank ws(" if Err = 0 then") blank ws(" EchoLine kVerbose, "" Success: Delete Port"" ") blank ws(" else") blank ws(" EchoLine kVerbose, "" Error deleting port. Error: 0x"" & hex(Err.Number)") ws(" if Err.Description <> """" then ") ws(" EchoLine kVerbose, "" Error description: "" & Err.Description ") ws(" end if") ws(" Err.Clear") blank ws(" end if") blank ws(" EchoLine kVerbose, """"") blank ws("end sub") blank end sub ' ' StartUp script for cloning ports ' sub PortStartUp ' ' Start creating the port cloning script ' CopyrightScript PortAbstractScript ' ' The script program starts ' blank ws("option explicit") blank ws("'") ws("' Verbose Level") ws("'") ws("const kNormal = 0") ws("const kVerbose = 1") blank ws("'") ws("' Port Types") ws("'") ws("const kTcpRaw = 1") ws("const kTcpLpr = 2") ws("const kLocal = 3") ws("const kLprMon = 5") ws("const kHPdlc = 7") ws("const kUnknown = 8") blank ws("'") ws("' Flag, set if users don't want to replace the old ports") ws("'") ws("dim bKeepOriginalOnes") blank ws("dim strDestServer") blank ws("' The number of ports to be installed") blank ws("dim iPortCount") blank ws("' The number of ports sucessfully installed or that already exist") blank ws("dim iSuccessCount") ws("dim iExistCount") blank ws("dim bVerbose") blank ws("main") blank ws("'") ws("' Main execution starts here") ws("'") ws("sub main") blank ws(" bVerbose = false") ws(" bKeepOriginalOnes=false") ws(" iPortCount = 0") ws(" iSuccessCount = 0") ws(" iExistCount = 0") ws(" strDestServer = """"") ws(" ParseCommandLine") blank end sub ' ' CleanUp script for cloning ports ' sub PortCleanUp ws("end sub") ' ' Append the subroutine "AddLocalPort" ' ScriptAddLocalPort ' ' Append the subroutine "AddTCPRawPort" ' ScriptAddTCPRawPort ' ' Append the subroutine "AddTCPLprPort" ' ScriptAddTCPLprPort ' ' Append the subroutine "DeletePort" ' ScriptDeletePort ' ' Append the function "BoolStr" ' BoolStrScript ' ' Append the command line parsing script ' ParseCommandLineScript ' ' Append the Usage script ' PortUsageScript ' ' Append the output macro ' EchoLineScript end sub ' ' Abstract for the port cloning script ' sub PortAbstractScript ws("' Abstract:") ws("'") ws("' " & strScriptName & " - port cloning script for Windows 2000") ws("'") oScript.WriteLine(kLongLineStr) end sub ' ' The Usage script used in the port cloning script ' sub PortUsageScript blank ws("'") ws("' Display command usage.") ws("'") ws("sub Usage(ByVal bExit)") blank ws(" EchoLine kNormal, ""Usage: " & strScriptName & " [-c Destination_Server] [-kv]"" ") ws(" EchoLine kNormal, ""Arguments:"" ") ws(" EchoLine kNormal, "" -c - destination server name"" ") ws(" EchoLine kNormal, "" -k - keep the existing port with the same name"" ") ws(" EchoLine kNormal, "" (WARNING: If this flag is set, the cloned server may not be identical to the original one."" ") ws(" EchoLine kNormal, "" -v - verbose mode"" ") ws(" EchoLine kNormal, "" -? - display command usage"" ") ws(" EchoLine kNormal, """" ") ws(" EchoLine kNormal, ""Examples:"" ") ws(" EchoLine kNormal, "" " & strScriptName & """ ") blank ws(" if bExit then") ws(" wscript.quit(1)") ws(" end if") blank ws("end sub") blank end sub ' ' Gets a string description for a port type ' function Description(ByVal value) select case value case kTcpRaw Description = "TCP RAW Port" case kTcpLpr Description = "TCP LPR Port" case kLocal Description = "Standard Local Port" case kLprMon Description = "LPR Mon Port" case kHPdlc Description = "HP DLC Port" case kUnknown Description = "Unknown Port" case Else Description = "Invalid PortType" end select end function ' '------------------------------------------------------------------------ ' Printer cloning script '------------------------------------------------------------------------ ' sub PrinterCloneScript(ByVal strScriptName, ByVal strServerName) on error resume next wscript.echo wscript.echo "Creating the printer cloning script..." dim strPersistFilename ' ' Open the script file ' set oScript = oFileSystem.CreateTextFile(strScriptName,TRUE) PrinterStartUp ws(" EchoLine kNormal, """" ") ws(" EchoLine kNormal, ""------------------------------"" ") ws(" EchoLine kNormal, ""Start installing printers..."" ") ' ' Enumerate all the printers in server "strServerName", ' for each printer found, add a line in the script to ' call the AddPrinter subroutine ' dim oMaster dim oPrinter dim iPrinterCount dim strPrinterName iPrinterCount = 0 set oMaster = CreateObject("PrintMaster.PrintMaster.1") for each oPrinter in oMaster.Printers(strServerName) if Err = 0 then ' ' Check to see if we need to clone this printer ' We only clone local printers ' if bIsLocal(strServerName, oPrinter.PrinterName) then ' ' Remove the ServerName part of the PrinterName ' strPrinterName = Strip(oPrinter.PrinterName) ' ' Try deleting the existing printer ' ws(" DeletePrinter strDestServer, _") ws(" """ & StuffQuote(strPrinterName) & """") ' ' Add a call to "AddPrinter" ' iPrinterCount = iPrinterCount + 1 ws(" AddPrinter strDestServer, _") ws(" """ & StuffQuote(strPrinterName) & """, _") ws(" """ & oPrinter.DriverName & """, _") ws(" """ & StuffQuote(oPrinter.PortName) & """, _") ws(" """", _") ' Use default DriverPath ws(" """" ") ' Use default InfFile ' ' Persist save the printer ' strPersistFilename = strPrefixServerName & "per" & CStr(iPrinterCount) & "_clone.vbs" if SavePrinter( oPrinter.PrinterName, strPersistFilename ) = false then wscript.echo "Error: skipping printer """ & oPrinter.PrinterName & """ persist save due to the error when getting the persist information" else ' ' Add script for calling persist restore ' ws(" RestorePrinter strDestServer, """ & strPrinterName & """, """ & strPersistFilename & """" ) wscript.echo "Printer Name: """ & strPrinterName & """ <==> Persist filename: " & strPersistFilename end if blank else ' ' It is not a local printer. Don't clone it. ' wscript.echo "Skipping non-local printer: """ & oPrinter.PrinterName & """." end if else ' ' Clean up ' oScript.Close oFileSystem.DeleteFile strScriptName wscript.echo "Error: Listing printers, error: 0x" & Hex(Err.Number) if Err.Description <> "" then wscript.echo "Error description: " & Err.Description end if exit sub end if next if Err = 0 then wscript.echo "Success: Listing printers on Server " & strServerName else wscript.echo "Error: Listing printers, error: 0x" & Hex(Err.Number) if Err.Description <> "" then wscript.echo "Error description: " & Err.Description end if Err.Clear end if ' ' Write the summary ' wscript.echo "A total of " & CSTR(iPrinterCount) & " printers are listed." ws(" EchoLine kNormal, ""Attempted to install a total of "" & CStr(iPrinterCount) & "" printer(s)."" ") ws(" EchoLine kNormal, CStr(iSuccessCount) & "" printer(s) were successfully installed."" ") if strServerName = "" then ' ' If the source server is local, get and set the default printer ' dim strDefaultPrinterName set oMaster = CreateObject("PrintMaster.PrintMaster.1") strDefaultPrinterName = StuffQuote(oMaster.DefaultPrinter) if Err <> 0 then wscript.echo "Error: Getting default printer """ & oMaster.DefaultPrinter & """, error: 0x" & Hex(Err.Number) if Err.Description <> "" then wscript.echo "Error description: " & Err.Description end if Err.Clear else ' ' Setting the default printer ' blank ws("'") ws("' Set the default printer") ws("' (do this only if the installation is on the local machine)") ws("'") ws(" if strDestServer = """" then ") blank ws(" dim oMaster") ws(" set oMaster = CreateObject(""PrintMaster.PrintMaster.1"") ") ws(" oMaster.DefaultPrinter = """ & strDefaultPrinterName & """" ) blank ws(" if Err = 0 then") ws(" EchoLine kNormal, ""Success: Setting the default printer to """"" & strDefaultPrinterName & """"" "" " ) ws(" else") ws(" EchoLine kNormal, ""Error: Setting default printer "" & strDefaultPrinterName ") ws(" end if") blank ws(" end if") blank end if end if PrinterCleanUp ' ' Close the script file ' oScript.Close wscript.echo "The script file for cloning printers is """ & strScriptName & """." end sub ' ' Subroutine of "AddPrinter" ' sub ScriptAddPrinter ' ' Insert the comment line before the function header ' blank ws("'") ws("' Add a printer") ws("'") ' ' The function header ' ws("sub AddPrinter(ByVal strServerName, _") ws(" ByVal strPrinterName, _") ws(" ByVal strDriverName, _") ws(" ByVal strPortName, _") ws(" ByVal strDriverPath, _") ws(" ByVal strInfFile _") ws(")") blank ' ' The function body ' ws(" on error resume next") blank ' ' Print out the information about the printer that is about to be installed ' ws(" iPrinterCount = iPrinterCount + 1") ws(" EchoLine kVerbose, ""Printer:"" & CSTR(iPrinterCount) ") ws(" EchoLine kVerbose, "" ServerName : "" & strServerName ") ws(" EchoLine kVerbose, "" PrinterName : "" & strPrinterName ") ws(" EchoLine kVerbose, "" DriverName : "" & strDriverName ") ws(" EchoLine kVerbose, "" PortName : "" & strPortName ") blank ' ' The codes that installs the printer ' ws(" dim oMaster") ws(" dim oPrinter") blank ws(" set oMaster = CreateObject(""PrintMaster.PrintMaster.1"")") ws(" set oPrinter = CreateObject(""Printer.Printer.1"")") blank ws(" oPrinter.ServerName = strServerName ") ws(" oPrinter.PrinterName = strPrinterName ") ws(" oPrinter.DriverName = strDriverName ") ws(" oPrinter.PortName = strPortName ") ws(" oPrinter.DriverPath = strDriverPath ") ws(" oPrinter.InfFile = strInfFile ") blank ws(" oMaster.PrinterAdd oPrinter") blank ws(" if Err = 0 then") blank ws(" EchoLine kVerbose, ""Success: Printer "" & strPrinterName & "" added to server "" & strServerName ") ws(" iSuccessCount = iSuccessCount + 1") blank ws(" else") blank ws(" EchoLine kNormal, ""Error adding printer "" & strPrinterName & "", error: 0x"" & Hex(Err.Number) ") ws(" if Err.Description <> """" then ") ws(" EchoLine kVerbose, "" Error description: "" & Err.Description ") ws(" end if") ws(" Err.Clear") blank ws(" end if") blank ws(" EchoLine kVerbose, """"") blank ws("end sub") blank end sub ' ' Save printer configuration ' function SavePrinter(ByVal strPrinterName, ByVal strFileName) on error resume next dim oMaster set oMaster = CreateObject("PrintMaster.PrintMaster.1") oMaster.PrinterPersistSave strPrinterName, strFileName, kAllSettings if Err <> 0 then wscript.echo "Error saving the configuration of the printer """ & strPrinterName & """, error: 0x" & Hex(Err.Number) SavePrinter = false else SavePrinter = true end if end function ' ' Script for printer persist restore ' sub RestorePrinterScript() ws("'") ws("' Restore printer configuration") ws("'") blank ws("sub RestorePrinter(ByVal strServerName, ByVal strPrinterName, ByVal strFileName)") blank ws(" on error resume next") blank ws(" dim oMaster") ws(" set oMaster = CreateObject(""PrintMaster.PrintMaster.1"") ") blank ws(" oMaster.PrinterPersistRestore strFullName(strServerName, strPrinterName), strFileName, _") ws(" kAllSettings + kResolveName + kReslovePort + kResolveShare") blank ws(" if Err = 0 then") ws(" EchoLine kVerbose, ""Success restoring the configuration of the printer"" & strPrinterName ") ws(" EchoLine kVerbose, """" ") ws(" else") ws(" if Err.Number = kErrorNoDs then") ws(" Err.Clear") ws(" '") ws(" ' Try resoring without Printer Info 7") ws(" '") ws(" oMaster.PrinterPersistRestore strFullName(strServerName, strPrinterName), strFileName, _") ws(" kPersistNoDs + kResolveName + kReslovePort + kResolveShare") ws(" end if") ws("") ws(" if Err = 0 then") ws(" EchoLine kVerbose, ""Success restoring the configuration of the printer"" & strPrinterName ") ws(" EchoLine kVerbose, """" ") ws(" else") ws(" EchoLine kNormal, ""Error restoring the configuration of the printer "" & strPrinterName & "", error: 0x"" & Hex(Err.Number)") ws(" EchoLine kNormal, """" ") ws(" Err.Clear") ws(" end if") ws(" end if") blank ws("end sub") blank end sub ' ' Subroutine of "DeletePrinter" ' sub ScriptDeletePrinter ' ' Insert the comment line before the function header ' blank ws("'") ws("' Delete an existing printer") ws("'") ' ' The function header ' ws("sub DeletePrinter(ByVal strServerName, _") ws(" ByVal strPrinterName _") ws(")") blank ' ' The function body ' ws(" on error resume next") blank ' ' If the user asks for keeping the original printer, then don't delete it ' ws(" if bKeepOriginalOnes = true then") blank ws(" exit sub") blank ws(" end if") blank ' ' Print out the information about the printer that is about to be deleted ' ws(" EchoLine kVerbose, "" Deleting Printer: """) ws(" EchoLine kVerbose, "" ServerName : "" & strServerName ") ws(" EchoLine kVerbose, "" PrinterName : "" & strPrinterName ") blank ' ' The code that deletes the printer ' ws(" dim oMaster") ws(" dim oPrinter") blank ws(" set oMaster = CreateObject(""PrintMaster.PrintMaster.1"")") ws(" set oPrinter = CreateObject(""Printer.Printer.1"")") blank ws(" oPrinter.ServerName = strServerName ") ws(" oPrinter.PrinterName = strPrinterName ") blank ws(" oMaster.PrinterDel oPrinter") blank ws(" if Err = 0 then") blank ws(" EchoLine kVerbose, "" Success: Delete Printer"" ") blank ws(" else") blank ws(" EchoLine kVerbose, "" Error deleting printer "" & strPrinterName & "". Error: 0x"" & Hex(Err.Number)") ws(" if Err.Description <> """" then ") ws(" EchoLine kVerbose, "" Error description: "" & Err.Description ") ws(" end if") ws(" Err.Clear") blank ws(" end if") blank ws(" EchoLine kVerbose, """"") blank ws("end sub") blank end sub ' ' StartUp script for cloning printers ' sub PrinterStartUp ' ' Start to create the printer cloning script ' CopyrightScript PrinterAbstractScript ' ' The script program starts ' blank ws("option explicit") blank ws("'") ws("' Verbose Level") ws("'") ws("const kNormal = 0") ws("const kVerbose = 1") blank ' ' Add the printer persist constants ' ws("'") ws("' Constants for printer persist") ws("'") ws("const kAllSettings = 127") ws("const kPrinterInfo7 = 4") ws("const kResolveName = 256") ws("const kReslovePort = 512") ws("const kResolveShare = 1024") ws("'") ws("'") ws("' If the DS is not present, restore printer without Printer Info 7") ws("'") ws("const kPersistNoDs = 123") ws("const kErrorNoDs = &H8004000C") blank ws("'") ws("' Flag, set if users don't want to replace the old forms") ws("'") ws("dim bKeepOriginalOnes") blank ws("dim strDestServer") blank ws("' The number of printers to be installed") blank ws("dim iPrinterCount") blank ws("' The number of printers sucessfully installed") blank ws("dim iSuccessCount") blank ws("dim bVerbose") blank ws("main") blank ws("'") ws("' Main execution starts here") ws("'") ws("sub main") blank ws(" bVerbose = false") ws(" bKeepOriginalOnes=false") ws(" iPrinterCount = 0") ws(" iSuccessCount = 0") ws(" strDestServer = """"") ws(" ParseCommandLine") blank end sub ' ' CleanUp script for cloning printers ' sub PrinterCleanUp ws("end sub") ' Append the subroutine "AddPrinter" ScriptAddPrinter ' ' Append the subroutine "RestorePrinter" ' RestorePrinterScript ' ' Append the subroutine "DeletePrinter" ' ScriptDeletePrinter ' ' Append the script for creating the full name for the printer ' strFullNameScript ' ' Append the command line parsing script ' ParseCommandLineScript ' ' Append the Usage script ' PrinterUsageScript ' ' Append the output macro ' EchoLineScript end sub ' ' Script for creating the full printer name (containing ServerName and PrinterName) ' which is used in RestorePrinter ' function strFullNameScript() ws("'") ws("' Function for creating the full printer name") ws("'") ws("function strFullName(ByVal strServerName, ByVal strPrinterName)") blank ws(" if strServerName = """" then") blank ws(" strFullName = strPrinterName") blank ws(" else") blank ws(" strFullName = strServerName & ""\"" & strPrinterName") blank ws(" end if") blank ws("end function") blank end function ' ' Abstract for the printer cloning script ' sub PrinterAbstractScript ws("' Abstract:") ws("'") ws("' " & strScriptName & " - printer cloning script for Windows 2000") ws("'") oScript.WriteLine(kLongLineStr) end sub ' ' The Usage script used in the printer cloning script ' sub PrinterUsageScript blank ws("'") ws("' Display command usage.") ws("'") ws("sub Usage(ByVal bExit)") blank ws(" EchoLine kNormal, ""Usage: " & strScriptName & " [-c Destination_Server] [-kv]"" ") ws(" EchoLine kNormal, ""Arguments:"" ") ws(" EchoLine kNormal, "" -c - destination server name"" ") ws(" EchoLine kNormal, "" -k - keep the existing printer with the same name"" ") ws(" EchoLine kNormal, "" (WARNING: If this flag is set, the cloned server may not be identical to the original one."" ") ws(" EchoLine kNormal, "" -v - verbose mode"" ") ws(" EchoLine kNormal, "" -? - display command usage"" ") ws(" EchoLine kNormal, """" ") ws(" EchoLine kNormal, ""Examples:"" ") ws(" EchoLine kNormal, "" " & strScriptName & """ ") blank ws(" if bExit then") ws(" wscript.quit(1)") ws(" end if") blank ws("end sub") blank end sub ' '------------------------------------------------------------------------ ' Form cloning script '------------------------------------------------------------------------ ' sub FormCloneScript(ByVal strScriptName, ByVal strServerName) on error resume next wscript.echo wscript.echo "Creating the form cloning script..." dim iHeight dim iWidth dim iTop dim iLeft dim iBottom dim iRight ' ' Open the script file ' set oScript = oFileSystem.CreateTextFile(strScriptName,TRUE) FormStartUp ws(" EchoLine kNormal, """" ") ws(" EchoLine kNormal, ""------------------------------"" ") ws(" EchoLine kNormal, ""Start installing forms..."" ") ' ' Enumerate all the forms in server "strServerName", ' for each form found, add a line in the script to ' call the AddForm subroutine ' dim oMaster dim oForm dim iFormCount iFormCount = 0 set oMaster = CreateObject("PrintMaster.PrintMaster.1") for each oForm in oMaster.Forms(strServerName) if Err = 0 then ' ' Try deleting the existing form ' ws(" DeleteForm strDestServer, _") ws(" """ & StuffQuote(oForm.Name) & """") oForm.GetSize iHeight, iWidth oForm.GetImageableArea iTop, iLeft, iBottom, iRight iFormCount = iFormCount + 1 ws(" AddForm strDestServer, _") ws(" """ & StuffQuote(oForm.Name) & """, _") ws(" " & CStr(oForm.Flags) & ", _") ws(" " & CStr(iHeight) & ", _") ws(" " & CStr(iWidth) & ", _") ws(" " & CStr(iTop) & ", _") ws(" " & CStr(iLeft) & ", _") ws(" " & CStr(iBottom) & ", _") ws(" " & CStr(iRight) ) blank else ' ' Clean up ' oScript.Close oFileSystem.DeleteFile strScriptName wscript.echo "Error: Listing forms, error: 0x" & Hex(Err.Number) if Err.Description <> "" then wscript.echo "Error description: " & Err.Description end if exit sub end if next if Err = 0 then wscript.echo "Success: Listing forms on Server " & strServerName else wscript.echo "Error: Listing forms, error: 0x" & Hex(Err.Number) if Err.Description <> "" then wscript.echo "Error description: " & Err.Description end if Err.Clear end if wscript.echo "A total of " & CSTR(iFormCount) & " forms are listed." ws(" EchoLine kNormal, ""Attempted to install a total of "" & CStr(iFormCount) & "" forms."" ") ws(" EchoLine kNormal, CStr(iSuccessCount) & "" forms successfully installed."" ") FormCleanUp ' ' Close the script file ' oScript.Close wscript.echo "The script file for cloning forms is """ & strScriptName & """." end sub ' ' Subroutine of "AddForm" ' sub ScriptAddForm ' ' Insert the comment line before the function header ' blank ws("'") ws("' Add a Form") ws("'") ' ' The function header ' ws("sub AddForm(ByVal strServerName, _") ws(" ByVal strName, _") ws(" ByVal iFlags, _") ws(" ByVal iHeight, _") ws(" ByVal iWidth, _") ws(" ByVal iTop, _") ws(" ByVal iLeft, _") ws(" ByVal iBottom, _") ws(" ByVal iRight _") ws(")") blank ' ' The function body ' ws(" on error resume next") blank ' ' Print out the information about the form that is about to be installed ' ws(" iFormCount = iFormCount + 1") ws(" EchoLine kVerbose, ""Form:"" & CSTR(iFormCount) ") ws(" EchoLine kVerbose, "" ServerName : "" & strServerName ") ws(" EchoLine kVerbose, "" Name : "" & strName ") ws(" EchoLine kVerbose, "" Type : "" & CStr(iFlags) ") ws(" EchoLine kVerbose, "" Height : "" & CStr(iHeight) ") ws(" EchoLine kVerbose, "" Width : "" & CStr(iWidth) ") ws(" EchoLine kVerbose, "" Top : "" & CStr(iTop) ") ws(" EchoLine kVerbose, "" Left : "" & CStr(iLeft) ") ws(" EchoLine kVerbose, "" Bottom : "" & CStr(iBottom) ") ws(" EchoLine kVerbose, "" Right : "" & CStr(iRight) ") blank ' ' The code that installs the form ' ws(" dim oMaster") ws(" dim oForm") blank ws(" set oMaster = CreateObject(""PrintMaster.PrintMaster.1"")") ws(" set oForm = CreateObject(""Form.Form.1"")") blank ws(" oForm.ServerName = strServerName") ws(" oForm.Name = strName") ws(" oForm.Flags = iFlags") ws(" oForm.SetSize iHeight, iWidth") ws(" oForm.SetImageableArea iTop, iLeft, iBottom, iRight") blank ws(" oMaster.FormAdd oForm") blank ws("' If no error or error code is for ""existing form"" then succeed") ws(" if Err = 0 or Err.number = &H80070050 then") blank ws(" EchoLine kVerbose, ""Success: Form "" & strName & "" added to server "" & strServerName ") ws(" iSuccessCount = iSuccessCount + 1") blank ws(" else") blank ws(" EchoLine kNormal, ""Error: adding Form "" & strName & "", error: 0x"" & hex(Err.Number) ") ws(" if Err.Description <> """" then ") ws(" EchoLine kVerbose, "" Error description: "" & Err.Description ") ws(" end if") ws(" Err.Clear") blank ws(" end if") blank ws(" EchoLine kVerbose, """"") blank ws("end sub") blank end sub ' ' Subroutine of "DeleteForm" ' sub ScriptDeleteForm ' ' Insert the comment line before the function header ' blank ws("'") ws("' Delete an existing form") ws("'") ' ' The function header ' ws("sub DeleteForm(ByVal strServerName, _") ws(" ByVal strFormName _") ws(")") blank ' ' The function body ' ws(" on error resume next") blank ' ' If the user asks for keeping the original form, then don't delete it ' ws(" if bKeepOriginalOnes = true then") blank ws(" exit sub") blank ws(" end if") blank ' ' Print out the information about the form that is about to be deleted ' ws(" EchoLine kVerbose, "" Deleting Form: """) ws(" EchoLine kVerbose, "" ServerName : "" & strServerName ") ws(" EchoLine kVerbose, "" FormName : "" & strFormName ") blank ' ' The code that deletes the form ' ws(" dim oMaster") ws(" dim oForm") blank ws(" set oMaster = CreateObject(""PrintMaster.PrintMaster.1"")") ws(" set oForm = CreateObject(""Form.Form.1"")") blank ws(" oForm.Name = strFormName") ws(" oForm.ServerName = strServerName") ws(" oMaster.FormDel oForm") blank ws(" if Err = 0 then") blank ws(" EchoLine kVerbose, "" Success: Delete Form"" & strFormName ") blank ws(" else") blank ws(" EchoLine kVerbose, "" Error deleting form "" & strFormName & "". Error: 0x"" & hex(Err.Number)") ws(" if Err.Description <> """" then ") ws(" EchoLine kVerbose, "" Error description: "" & Err.Description ") ws(" end if") ws(" Err.Clear") blank ws(" end if") blank ws(" EchoLine kVerbose, """"") blank ws("end sub") blank end sub ' ' StartUp script for cloning forms ' sub FormStartUp ' ' Start creating the form cloning script ' CopyrightScript FormAbstractScript ' ' The script program starts ' blank ws("option explicit") blank ws("'") ws("' Verbose Level") ws("'") ws("const kNormal = 0") ws("const kVerbose = 1") blank ws("'") ws("' Flag, set if users don't want to replace the old forms") ws("'") ws("dim bKeepOriginalOnes") blank ws("dim strDestServer") blank ws("' The number of forms to be installed") blank ws("dim iFormCount") blank ws("' The number of forms sucessfully installed") blank ws("dim iSuccessCount") blank ws("dim bVerbose") blank ws("main") blank ws("'") ws("' Main execution starts here") ws("'") ws("sub main") blank ws(" bVerbose = false") ws(" bKeepOriginalOnes = false") ws(" iFormCount = 0") ws(" iSuccessCount = 0") ws(" strDestServer = """"") ws(" ParseCommandLine") blank end sub ' ' CleanUp script for cloning forms ' sub FormCleanUp ws("end sub") ' ' Append the subroutine "AddForm" ' ScriptAddForm ' ' Append the subroutine "DeleteForm" ' ScriptDeleteForm ' ' Append the commandline parsing script ' ParseCommandLineScript ' ' Append the Usage script ' FormUsageScript ' ' Append the output macro ' EchoLineScript end sub ' ' Abstract for the form cloning script ' sub FormAbstractScript ws("' Abstract:") ws("'") ws("' " & strScriptName & " - Form cloning script for Windows 2000") ws("'") oScript.WriteLine(kLongLineStr) end sub ' ' The Usage script used in the form cloning script ' sub FormUsageScript blank ws("'") ws("' Display command usage.") ws("'") ws("sub Usage(ByVal bExit)") blank ws(" EchoLine kNormal, ""Usage: " & strScriptName & " [-c Destination_Server] [-kv]"" ") ws(" EchoLine kNormal, ""Arguments:"" ") ws(" EchoLine kNormal, "" -c - destination server name"" ") ws(" EchoLine kNormal, "" -k - keep the existing form that has the same name"" ") ws(" EchoLine kNormal, "" (WARNING: If this flag is set, the cloned server may not be identical to the original one."" ") ws(" EchoLine kNormal, "" -v - verbose mode"" ") ws(" EchoLine kNormal, "" -? - display command usage"" ") ws(" EchoLine kNormal, """" ") ws(" EchoLine kNormal, ""Examples:"" ") ws(" EchoLine kNormal, "" " & strScriptName & """ ") blank ws(" if bExit then") ws(" wscript.quit(1)") ws(" end if") blank ws("end sub") blank end sub '------------------------------------------------------------------------ ' Common scripts for the new generated cloning script '------------------------------------------------------------------------ ' ' Copyright header in the script ' sub CopyrightScript() oScript.WriteLine(kLongLineStr) ws("'") ws("' Copyright (c) Microsoft Corporation 1999") ws("' All Rights Reserved") ws("'") end sub ' ' The command line parsing script used in the generated cloning script ' sub ParseCommandLineScript() blank ws("'") ws("' Command line parsing") ws("'") blank ws("sub ParseCommandLine()") blank ws(" dim oArgs") ws(" dim i") blank ws(" set oArgs = wscript.Arguments") blank ws(" while i < oArgs.Count") blank ws(" select case oArgs(i)") blank ws(" case ""-c"" ") ws(" i = i + 1") ws(" strDestServer = oArgs(i)") blank ws(" case ""-k"" ") ws(" bKeepOriginalOnes = true") blank ws(" case ""-v"" ") ws(" bVerbose = true") blank ws(" case ""-?"" ") ws(" Usage(true)") ws(" exit sub") blank ws(" case else") ws(" Usage(true)") ws(" exit sub") blank ws(" end select") blank ws(" i = i + 1") blank ws(" wend") blank ws("end sub") blank end sub ' ' Script for converting a bool to a string ' sub BoolStrScript ws("'") ws("' Transform a bool value to a string") ws("'") ws("function BoolStr(ByVal bValue)") blank ws(" if bValue then") blank ws(" BoolStr = " & kTrueStr) blank ws(" else") blank ws(" BoolStr = " & kFalseStr) blank ws(" end if ") blank ws("end function") blank end sub ' ' Writing the script for debug output function ' sub EchoLineScript ws("'") ws("' Print debug message according to the verbose level") ws("'") ws("sub EchoLine(ByVal Level, ByVal strALine)") blank ws(" if Level <> kVerbose or bVerbose = true then") blank ws(" wscript.echo strALine") blank ws(" end if ") blank ws("end sub") blank end sub ' ' The function returns the name of the local machine ' function strGetLocalMachineName() dim WSHShell dim WSHSysEnv set WSHShell = WScript.CreateObject("Wscript.Shell") set WSHSysEnv = WSHShell.Environment("Process") strGetLocalMachineName = WSHSysEnv("COMPUTERNAME") end function ' ' Function to determine is a printer is local ' function bIsLocal(ByVal strServerName, ByVal strPrinterName) on error resume next dim bRet dim oPrinter dim oMaster if strServerName <> "" then bIsLocal = true exit function end if set oMaster = CreateObject("PrintMaster.PrintMaster.1") set oPrinter = CreateObject("Printer.Printer.1") oMaster.PrinterGet strServerName, strPrinterName, oPrinter if Err = 0 then if ( oPrinter.Attributes and kPrinterLocal) = kPrinterLocal and _ ( oPrinter.Attributes and kPrinterNetwork) = 0 then ' ' It is a local printer ' bRet = true else ' ' It is not local ' bRet = false end if else ' ' Error getting printer configuration, then assume it is local and try installing it ' wscript.echo "Error: Get printer configuration for printer """ & strPrinterName & """" _ & " on server """ & strServerName & """" wscript.echo "Error: 0x" & Hex(Err.Number) if Err.Description <> "" then wscript.echo "Error description: " & Err.Description end if Err.Clear bRet = true end if bIsLocal = bRet end function ' ' Function to remove the ServerName prefix in the printer name ' function Strip(ByVal strOriginalPrinterName) dim strReturnPrinterName strReturnPrinterName=strOriginalPrinterName dim regEx set regEx = New RegExp regEx.Pattern = "^\\\\[^\\]*\\" regEx.IgnoreCase = true ' ' Remove the ServerName prefix by replacing "\\*\" with "" ' strReturnPrinterName=regEx.Replace(strReturnPrinterName, "") Strip=strReturnPrinterName end function ' ' Function to remove the "\\" in front of the ServerName ' function strGetNameStringOnly(ByVal strPrefixServerName) dim strReturn strReturn=strPrefixServerName dim regEx set regEx = New RegExp regEx.Pattern = "^\\\\" regEx.IgnoreCase = true ' ' Remove of "\\" ' strReturn=regEx.Replace(strReturn, "") strGetNameStringOnly=strReturn end function ' ' Function to change single " in the string to be double "s ' function StuffQuote(ByVal strInput) Dim iIndex Dim strOutput strOutput = "" for iIndex = 1 to len(strInput) if mid(strInput, iIndex, 1) <> """" then ' This char is not a " strOutput = strOutput & mid(strInput, iIndex, 1) else ' It is a ", change it to be two "s strOutput = strOutput & """""" end if next StuffQuote = strOutput end function '------------------------------------------------------------------------ ' Helper functions for this program itself '------------------------------------------------------------------------ ' ' Transform a bool value to a string ' function BoolStr(ByVal bValue) if bValue then BoolStr = kTrueStr else BoolStr = kFalseStr end if end function ' ' Parse the command line into it's components ' sub ParseCommandLine() dim oArgs dim i iAction = kActionUnknown set oArgs = wscript.Arguments if oArgs.Count = 0 then Usage(true) exit sub end if while i < oArgs.Count select case oArgs(i) case "-d" iAction = kActionDrivers case "-o" iAction = kActionPorts case "-p" iAction = kActionPrinters case "-f" iAction = kActionForms case "-a" iAction = kActionAll case "-c" i = i + 1 strServerName = oArgs(i) case "-?" Usage(true) exit sub case else Usage(true) exit sub end select i = i + 1 wend end sub ' ' Display command usage. ' sub Usage(ByVal bExit) wscript.echo "Usage: clone [-dopfa?] [-c server-name]" wscript.echo "Arguments:" wscript.echo "-d - generate script for cloning the drivers" wscript.echo "-o - generate script for cloning the ports" wscript.echo "-p - generate script for cloning the printers" wscript.echo "-f - generate script for cloning the forms" wscript.echo "-a - generate script for cloning the drivers, ports, printers and forms" wscript.echo "-c - source server name, default for local machine" wscript.echo "-? - display command usage" wscript.echo "" wscript.echo "Examples:" wscript.echo "clone -d" wscript.echo "clone -o -c \\server" wscript.echo "clone -p -c \\server" wscript.echo "clone -f" wscript.echo "clone -a" if bExit then wscript.quit(1) end if end sub ' ' Function determining if the port name matches the pattern ' function bFindPortPattern(strPattern, strString) dim RegEx set RegEx = New RegExp RegEx.Pattern = strPattern RegEx.IgnoreCase = true bFindPortPattern = RegEx.Test(strString) end function ' ' Macro for writing a line in the script ' sub ws(ByVal strALine) oScript.WriteLine(strALine) end sub sub blank() ws("") end sub '------- End of Cloning scripts ' '------------------------------------------------------------------------ ' Shell Installing script (use for launching the cloning scripts) '------------------------------------------------------------------------ ' sub InstallScript(ByVal strScriptName, ByVal strPrefixServerName) wscript.echo wscript.echo "Creating the installing script..." ' ' Open the script file ' set oScript = oFileSystem.CreateTextFile(strScriptName,TRUE) ' ' Start creating the shell script ' ws("@rem Abstract:") ws("@rem") ws("@rem " & strScriptName & " - shell script for installing all the server components") ws("@rem") blank ws("@echo off") blank ws("if ""%1"" == ""-?"" goto Usage") ws("if ""%1"" == ""/?"" goto Usage") blank dim strParameters strParameters = " %1 %2 %3 %4 " ws("cscript " & strPrefixServerName & kDriverScript & strParameters) ws("cscript " & strPrefixServerName & kPortScript & strParameters) ws("cscript " & strPrefixServerName & kPrinterScript & strParameters) ws("cscript " & strPrefixServerName & kFormScript & strParameters) blank ws("goto End") blank ws(":Usage") blank InstallUsageScript ws(":End") ' ' Close the script file ' oScript.Close wscript.echo "The script file for installing all server components is """ & strScriptName & """." end sub ' ' The Usage script used in the install script ' sub InstallUsageScript ws(" echo Usage: " & strScriptName & " [-kv?] [-c server-name]") ws(" echo Arguments: ") ws(" echo -k - keep the existing component with the same name") ws(" echo -v - verbose mode") ws(" echo -c - destination server name") ws(" echo -? - display command usage") ws(" echo.") ws(" echo Examples: ") ws(" echo " & strScriptName ) ws(" echo " & strScriptName & " -v ") ws(" echo " & strScriptName & " -c \\server ") ws(" echo " & strScriptName & " -v -c \\server ") ws(" echo " & strScriptName & " -k -v -c \\server ") ws(" echo " & strScriptName & " -? ") blank end sub ' ' Determines which program is used to run this script. ' Returns true if the script host is cscript.exe ' function IsHostCscript() on error resume next dim strFullName dim strCommand dim i, j dim bReturn bReturn = false strFullName = WScript.FullName i = InStr(1, strFullName, ".exe", 1) if i <> 0 then j = InStrRev(strFullName, "\", i, 1) if j <> 0 then strCommand = Mid(strFullName, j+1, i-j-1) if LCase(strCommand) = "cscript" then bReturn = true end if end if end if if Err <> 0 then call wscript.echo("Error 0x" & hex(Err.Number) & " occurred. " & Err.Description _ & ". " & vbCRLF & "The scripting host could not be determined.") end if IsHostCscript = bReturn end function ' ' Converts a driver environment string to a string ' representing the architecture of the driver. ' function GetArchitecture(strEnvironment) dim strArchitecture if strEnvironment = kEnvironmentIntel then strArchitecture = kArchIntel elseif strEnvironment = kEnvironmentMIPS then strArchitecture = kArchMIPS elseif strEnvironment = kEnvironmentAlpha then strArchitecture = kArchAlpha elseif strEnvironment = kEnvironmentPowerPC then strArchitecture = kArchPowerPC elseif strEnvironment = kEnvironmentWindows then strArchitecture = kArchIntel else strArchitecture = kArchUnknown end if GetArchitecture = strArchitecture end function ' ' Converts a driver environment string and a number to ' a string representing the driver version ' function GetVersion(uVersion, strEnvironment) dim strVersion select case uVersion case 0: if strEnvironment = kEnvironmentWindows then strVersion = kVersionWindows95 else strVersion = kVersionNT31 end if case 1: if strEnvironment = kEnvironmentPowerPC then strVersion = kVersion351 else strVersion = kVersion35x end if case 2: if strEnvironment = kEnvironmentPowerPC or _ strEnvironment = kEnvironmentMIPS or _ strEnvironment = kEnvironmentAlpha then strVersion = kVersion40 else strVersion = kVersion4050 end if case 3: strVersion = kVersion50 case else: strVersion = kArchUnknown end select GetVersion = strVersion end function