home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 May / W2KPRK.iso / netmgmt.cab / clone.vbs < prev    next >
Text File  |  1999-11-04  |  82KB  |  3,095 lines

  1. '----------------------------------------------------------------------
  2. '
  3. ' Copyright (c) Microsoft Corporation 1999
  4. ' All Rights Reserved
  5. '
  6. ' Abstract:
  7. '
  8. '    clone.vbs - printer server cloning script for Windows 2000
  9. '
  10. ' Usage:
  11. '    clone [-dopfa?] [-c server-name]
  12. '
  13. ' Examples:
  14. '    clone -d
  15. '    clone -o -c \\server
  16. '    clone -p -c \\server
  17. '    clone -f
  18. '    clone -a
  19. '
  20. '----------------------------------------------------------------------
  21.  
  22. option explicit
  23.  
  24. '
  25. ' Messages to be displayed if the scripting host is not cscript
  26. '                            
  27. const kMessage1 = "Please run this script using CScript."  
  28. const kMessage2 = "This can be achieved by"
  29. const kMessage3 = "1. Using ""CScript script.vbs arguments"" or" 
  30. const kMessage4 = "2. Changing the default Windows Scripting Host to CScript"
  31. const kMessage5 = "   using ""CScript //H:CScript //S"" and running the script "
  32. const kMessage6 = "   ""script.vbs arguments""."
  33.  
  34. ' Default script names 
  35. '
  36. const kDriverScript   =   "drv_clone.vbs"
  37. const kPortScript     =   "port_clone.vbs"
  38. const kPrinterScript  =   "prn_clone.vbs"
  39. const kFormScript     =   "form_clone.vbs"
  40.  
  41. '
  42. ' The shell script for installing all components
  43. '
  44. const kInstallScript  =   "install.bat"  
  45.  
  46. '
  47. ' Strings identifying environments
  48. '
  49. const kEnvironmentIntel   = "Windows NT x86"
  50. const kEnvironmentMIPS    = "Windows NT R4000"
  51. const kEnvironmentAlpha   = "Windows NT Alpha_AXP"
  52. const kEnvironmentPowerPC = "Windows NT PowerPC"
  53. const kEnvironmentWindows = "Windows 4.0"
  54. const kEnvironmentUnknown = "unknown"
  55.  
  56. '
  57. ' Strings identifying architectures
  58. '
  59. const kArchIntel          = "Intel"
  60. const kArchMIPS           = "MIPS"
  61. const kArchAlpha          = "Alpha"
  62. const kArchPowerPC        = "PowerPC"
  63. const kArchUnknown        = "Unknown"
  64.  
  65. '
  66. ' Strings identifying driver versions
  67. ' Change these strings on localized builds
  68. '
  69. const kVersionWindows95   = "Windows 95 or 98"
  70. const kVersion_NT31       = "Windows NT 3.1"
  71. const kVersion35x         = "Windows NT 3.5 or 3.51"
  72. const kVersion351         = "Windows NT 3.51"
  73. const kVersion40          = "Windows NT 4.0"
  74. const kVersion4050        = "Windows NT 4.0 or 2000"
  75. const kVersion50          = "Windows 2000"
  76.       
  77. '
  78. ' Action codes
  79. '
  80. const kActionUnknown  = 0
  81. const kActionDrivers  = 1
  82. const kActionPorts    = 2
  83. const kActionPrinters = 3
  84. const kActionForms    = 4
  85. const kActionAll      = 5
  86.  
  87. '
  88. ' Port types
  89. '
  90. const kTcpRaw   = 1
  91. const kTcpLpr   = 2
  92. const kLocal    = 3
  93. const kLprMon   = 5
  94. const kHPdlc    = 7
  95. const kUnknown  = 8
  96.  
  97. const kStdTCPIP = "Standard TCP/IP Port"
  98.  
  99. '
  100. ' Printer attribute masks
  101. '
  102. const kPrinterNetwork = 16
  103. const kPrinterLocal   = 64
  104.  
  105. '
  106. '  Search patterns used in the regular expressions
  107. '  to skip COMx: and LPTx: ports
  108. '
  109. const kComPortPattern = "^COM\d+:$" 
  110. const kLptPortPattern = "^LPT\d+:$" 
  111.  
  112. '
  113. ' Persist constant
  114. '
  115. const kAllSettings    = 127 
  116.  
  117. '
  118. ' Other string constants
  119. '
  120. const kTrueStr   =  "true"
  121. const kFalseStr  =  "false"
  122. const kLongLineStr  =    _
  123.   "'--------------------------------------------------------------------------"
  124.  
  125. '
  126. ' Source server that will be cloned
  127. '
  128. dim strServerName
  129. dim strPrefixServerName
  130.  
  131. '
  132. ' For writing the script file
  133. '
  134. dim oFileSystem
  135. dim oScript
  136.  
  137. '
  138. ' Script name string
  139. '
  140. dim strScriptName
  141. dim iAction
  142.  
  143. main 
  144.  
  145. '
  146. ' Main execution starts here
  147. '
  148. sub main
  149.  
  150.    '
  151.    ' Abort if the host is not cscript
  152.    '
  153.    if not IsHostCscript() then
  154.    
  155.        call wscript.echo(kMessage1 & vbCRLF & kMessage2 & vbCRLF & _
  156.                          kMessage3 & vbCRLF & kMessage4 & vbCRLF & _
  157.                          kMessage5 & vbCRLF & kMessage6 & vbCRLF)
  158.         
  159.        wscript.quit
  160.    
  161.    end if
  162.  
  163.    ParseCommandLine
  164.  
  165.    '
  166.    ' Check if a machine name was passed
  167.    '
  168.    if (strServerName <> "") then
  169.        
  170.        strPrefixServerName = strServerName 
  171.  
  172.    else
  173.       
  174.        strPrefixServerName =  strGetLocalMachineName() 
  175.  
  176.    end if
  177.  
  178.    '
  179.    ' Remove the "\\" in front of the machine name 
  180.    '
  181.    strPrefixServerName = strGetNameStringOnly(strPrefixServerName) & "_"
  182.  
  183.    set oFileSystem = CreateObject ("Scripting.FileSystemObject")
  184.  
  185.    '
  186.    ' According to the different action codes, create the corresponding script
  187.    '
  188.    if iAction = kActionDrivers or iAction = kActionAll then
  189.  
  190.        strScriptName  = strPrefixServerName & kDriverScript
  191.        DriverCloneScript strScriptName, strServerName
  192.   
  193.    end if
  194.  
  195.    if iAction = kActionPorts or iAction = kActionAll then
  196.  
  197.        strScriptName  = strPrefixServerName & kPortScript
  198.        PortCloneScript strScriptName, strServerName
  199.   
  200.    end if
  201.  
  202.    if iAction = kActionPrinters or iAction = kActionAll then
  203.  
  204.        strScriptName  = strPrefixServerName & kPrinterScript
  205.        PrinterCloneScript strScriptName, strServerName
  206.   
  207.    end if
  208.  
  209.    if iAction = kActionForms or iAction = kActionAll then
  210.  
  211.        strScriptName  = strPrefixServerName & kFormScript
  212.        FormCloneScript strScriptName, strServerName
  213.   
  214.    end if
  215.  
  216.    '
  217.    '  Generate the script for launching all the cloning scripts
  218.    ' 
  219.    strScriptName = strPrefixServerName & kInstallScript 
  220.    InstallScript strScriptName, strPrefixServerName
  221.  
  222. end sub
  223.  
  224. '
  225. '------------------------------------------------------------------------
  226. '      Driver cloning script
  227. '------------------------------------------------------------------------
  228. '
  229. sub DriverCloneScript(ByVal strScriptName, ByVal strServerName)
  230.  
  231.     on error resume next
  232.  
  233.     wscript.echo
  234.     wscript.echo "Creating the driver cloning script..."
  235.  
  236.     '
  237.     ' Open the script file
  238.     '
  239.     set oScript = oFileSystem.CreateTextFile(strScriptName,TRUE)
  240.  
  241.     '
  242.     ' Write the header of the driver cloning script
  243.     '
  244.     DriverStartUp
  245.  
  246.     ws("    EchoLine kNormal, """" ")
  247.     ws("    EchoLine kNormal, ""------------------------------"" ")
  248.     ws("    EchoLine kNormal, ""Start installing drivers..."" ")
  249.  
  250.     '
  251.     ' Enumerate all the drivers in server "strServerName", for each driver 
  252.     ' found, add a line in the script to call the AddDriver subroutine
  253.     '
  254.     dim oMaster
  255.     dim oDriver
  256.     dim iDriverCount
  257.   
  258.     iDriverCount = 0
  259.     set oMaster  = CreateObject("PrintMaster.PrintMaster.1")
  260.     for each oDriver in oMaster.Drivers(strServerName)
  261.         
  262.         if Err = 0 then
  263.         
  264.             '
  265.             ' Add a call to "AddDriver" function in the script
  266.             '
  267.             iDriverCount = iDriverCount + 1
  268.             ws("    AddDriver   strDestServer, _")
  269.             ws("                """ & oDriver.ModelName     & """,  _") 
  270.             ws("                """ & GetVersion(oDriver.Version, oDriver.Environment) & """,  _")
  271.            
  272.             '
  273.             ' Change Path to be default, i.e. ""
  274.             '
  275.             ws("                """",  _")
  276.             ws("                """ & GetArchitecture(oDriver.Environment) & """,  _")
  277.            
  278.             '
  279.             ' Change InfFile to be default, i.e. ""
  280.             '
  281.             ws("                """" ")
  282.             
  283.         else
  284.         
  285.             '
  286.             ' Clean up
  287.             '
  288.             oScript.Close
  289.         
  290.             oFileSystem.DeleteFile strScriptName        
  291.             
  292.             wscript.echo "Error: Listing ports, error: 0x" & Hex(Err.Number) 
  293.             if Err.Description <> "" then
  294.                 wscript.echo "Error description: " & Err.Description
  295.             end if
  296.             
  297.             exit sub   
  298.         
  299.         end if    
  300.        
  301.     next
  302.  
  303.     wscript.echo "Success: Listing drivers on server " & strServerName
  304.     
  305.     '
  306.     '  Write the summary script
  307.     '
  308.     wscript.echo "A total of " & CStr(iDriverCount) & " drivers are listed."
  309.  
  310.     ws("    EchoLine kNormal, ""Attempted to install a total of "" & CStr(iDriverCount) & "" driver(s)."" ")
  311.     ws("    EchoLine kNormal, CStr(iSuccessCount) & "" driver(s) were successfully installed."" ")
  312.  
  313.     '
  314.     '  Append other functions to the driver cloning script
  315.     '
  316.     DriverCleanUp
  317.  
  318.     '       
  319.     ' Close the script file
  320.     '
  321.     oScript.Close
  322.  
  323.     wscript.echo "The script file for cloning drivers is """ & strScriptName & """."
  324.  
  325. end sub
  326.  
  327. '
  328. ' Writing the script for "AddDriver" function 
  329. '
  330. sub ScriptAddDriver
  331.     
  332.     '
  333.     ' Insert the comment line before the function header 
  334.     '
  335.     blank
  336.     ws("'")
  337.     ws("' Add a driver")
  338.     ws("'")
  339.    
  340.     ' 
  341.     ' The function header
  342.     '
  343.     ws("sub AddDriver(ByVal strServerName,         _")
  344.     ws("              ByVal strModelName,          _") 
  345.     ws("              ByVal strDriverVersion,      _")
  346.     ws("              ByVal strPath,               _")
  347.     ws("              ByVal strDriverArchitecture, _")
  348.     ws("              ByVal strInfFile             _")
  349.     ws(")")
  350.     blank
  351.  
  352.     '
  353.     ' The function body
  354.     '
  355.     ws("    on error resume next")
  356.     blank
  357.     
  358.     '
  359.     ' Print out the information about the driver that is about to be installed
  360.     '
  361.     ws("    iDriverCount = iDriverCount + 1")
  362.     ws("    EchoLine kVerbose, ""Driver:"" & CSTR(iDriverCount) ")
  363.     ws("    EchoLine kVerbose, ""    ServerName         : "" & strServerName ")
  364.     ws("    EchoLine kVerbose, ""    ModelName          : "" & strModelName ")
  365.     ws("    EchoLine kVerbose, ""    DriverVersion      : "" & strDriverVersion ")
  366.     ws("    EchoLine kVerbose, ""    DriverArchitecture : "" & strDriverArchitecture ")
  367.     blank
  368.  
  369.     '
  370.     ' The code that installs the driver
  371.     '
  372.     ws("    dim oMaster")
  373.     ws("    dim oDriver")
  374.     blank
  375.  
  376.     ws("    set oMaster = CreateObject(""PrintMaster.PrintMaster.1"")")
  377.     ws("    set oDriver = CreateObject(""Driver.Driver.1"")")
  378.     blank
  379.  
  380.     ws("    oDriver.ServerName         = strServerName")
  381.     ws("    oDriver.ModelName          = strModelName")
  382.     ws("    oDriver.DriverVersion      = strDriverVersion")
  383.     ws("    oDriver.Path               = strPath")
  384.     ws("    oDriver.DriverArchitecture = strDriverArchitecture")
  385.     ws("    oDriver.InfFile            = strInfFile")
  386.     blank
  387.  
  388.     ws("    oMaster.DriverAdd oDriver")
  389.     blank
  390.  
  391.     ws("    if Err = 0 then")
  392.     blank
  393.     
  394.     ws("        EchoLine kVerbose, ""Success: Driver "" & strModelName & "" added to server "" & strServerName ")
  395.     ws("        iSuccessCount = iSuccessCount + 1")
  396.     blank
  397.     
  398.     ws("    else")
  399.     blank
  400.  
  401.     ws("        EchoLine kNormal, ""Error adding driver "" & strModelName & "", error: 0x"" & Hex(Err.Number)")
  402.     ws("        if Err.Description <> """" then ")
  403.     ws("            EchoLine kNormal,  ""       Error description: "" & Err.Description ")
  404.     ws("        end if")
  405.     ws("        Err.Clear")
  406.     blank
  407.  
  408.  
  409.     ws("    end if")
  410.     blank
  411.  
  412.     ws("    EchoLine kVerbose, """"")
  413.     blank
  414.  
  415.     ws("end sub")
  416.     blank
  417.  
  418. end sub
  419.  
  420. '
  421. ' StartUp script for cloning drivers
  422. '
  423. sub DriverStartUp
  424.  
  425.     '
  426.     ' Start creating the driver cloning script
  427.     '
  428.     CopyrightScript 
  429.     DriverAbstractScript 
  430.  
  431.     '
  432.     ' The script program starts
  433.     '
  434.     blank
  435.     ws("option explicit")
  436.     blank
  437.     
  438.     ws("'")
  439.     ws("' Verbose Level")
  440.     ws("'")
  441.     ws("const kNormal    = 0")
  442.     ws("const kVerbose   = 1")
  443.     blank
  444.     
  445.     ws("'")
  446.     ws("' Flag, set if the user doesn't want to replace the old forms")
  447.     ws("'")
  448.     ws("dim bKeepOriginalOnes")
  449.     blank
  450.  
  451.     ws("dim strDestServer")
  452.     blank
  453.  
  454.     ws("' The number of drivers to be installed")
  455.     blank
  456.     ws("dim iDriverCount")
  457.     blank
  458.     ws("' The number of drivers successfully installed")
  459.     blank
  460.     ws("dim iSuccessCount")
  461.     blank
  462.     ws("dim bVerbose")
  463.     blank
  464.  
  465.     ws("main")
  466.     blank
  467.     ws("'")
  468.     ws("' Main execution starts here")
  469.     ws("'")
  470.  
  471.     ws("sub main")
  472.     blank
  473.     ws("    bVerbose = false")
  474.     ws("    bKeepOriginalOnes = false")
  475.     ws("    iDriverCount  = 0")
  476.     ws("    iSuccessCount = 0")
  477.     ws("    strDestServer = """"")
  478.     ws("    ParseCommandLine")
  479.     blank
  480.  
  481. end sub
  482.  
  483. '
  484. ' CleanUp script for cloning drivers
  485. '
  486. sub DriverCleanUp
  487.     
  488.     ws("end sub")
  489.     
  490.     '
  491.     ' Append the subroutine "AddDriver"
  492.     '
  493.     ScriptAddDriver
  494.  
  495.     '
  496.     ' Append the command line parsing script
  497.     '
  498.     ParseCommandLineScript
  499.  
  500.     '
  501.     ' Append the Usage script
  502.     '
  503.     DriverUsageScript
  504.  
  505.     ' 
  506.     ' Append the output macro
  507.     '
  508.     EchoLineScript
  509.  
  510. end sub
  511.  
  512. '
  513. ' Abstract for the driver cloning script
  514. '
  515. sub DriverAbstractScript
  516.  
  517.     ws("' Abstract:")
  518.     ws("'")
  519.     ws("' " & strScriptName & " - driver cloning script for Windows 2000")
  520.     ws("'")
  521.     oScript.WriteLine(kLongLineStr)
  522.  
  523. end sub
  524.  
  525. '
  526. ' The Usage script used in the driver cloning script
  527. '
  528. sub DriverUsageScript
  529.  
  530.     blank
  531.     ws("'")
  532.     ws("' Display command usage.")
  533.     ws("'")
  534.     ws("sub Usage(ByVal bExit)")
  535.     blank
  536.  
  537.     ws("    EchoLine kNormal, ""Usage: " & strScriptName & " [-c Destination_Server] [-v]"" ")
  538.     ws("    EchoLine kNormal, ""Arguments:"" ")
  539.     ws("    EchoLine kNormal, ""    -c   - destination server name"" ")
  540.     ws("    EchoLine kNormal, ""    -v   - verbose mode"" ")
  541.     ws("    EchoLine kNormal, ""    -?   - display command usage"" ")
  542.     ws("    EchoLine kNormal, """" ")
  543.     ws("    EchoLine kNormal, ""Examples:"" ")
  544.     ws("    EchoLine kNormal, ""    " & strScriptName & """ ") 
  545.     blank
  546.  
  547.     ws("    if bExit then")
  548.     ws("        wscript.quit(1)")
  549.     ws("    end if")
  550.     blank
  551.  
  552.     ws("end sub")
  553.     blank
  554.  
  555. end sub
  556.  
  557. '
  558. '------------------------------------------------------------------------
  559. '      Port cloning script
  560. '------------------------------------------------------------------------
  561. '
  562. sub PortCloneScript(ByVal strScriptName, ByVal strServerName)
  563.  
  564.     on error resume next
  565.  
  566.     wscript.echo
  567.     wscript.echo "Creating the port cloning script..."
  568.  
  569.     '
  570.     ' Open the script file
  571.     '
  572.     set oScript = oFileSystem.CreateTextFile(strScriptName,TRUE)
  573.  
  574.     PortStartUp
  575.  
  576.     ws("    EchoLine kNormal, """" ")
  577.     ws("    EchoLine kNormal, ""------------------------------"" ")
  578.     ws("    EchoLine kNormal, ""Start installing ports..."" ")
  579.  
  580.     '
  581.     ' Enumerate all the ports in server "strServerName", for each port found, 
  582.     ' add a line in the script to call the AddLocalPort subroutine
  583.     '
  584.     dim oMaster
  585.     dim oPort
  586.     dim iPortCount
  587.   
  588.     iPortCount = 0
  589.     set oMaster  = CreateObject("PrintMaster.PrintMaster.1")
  590.     for each oPort in oMaster.Ports(strServerName)
  591.  
  592.         if Err = 0 then 
  593.         
  594.            if oPort.PortType = kLprMon or oPort.PortType = kHPdlc then
  595.    
  596.                '
  597.                ' Skip these ports because PrnAdmin cannot add them
  598.                '
  599.                wscript.echo "Skipping port " & oPort.PortName & " (" & Description(oPort.PortType) & ")"
  600.    
  601.            else
  602.                '           
  603.                '  Duplicate only local ports different from LPTx:, COMx: 
  604.                '
  605.                if oPort.PortType         =  kLocal                           and _
  606.                   bFindPortPattern(kComPortPattern, oPort.PortName) = false  and _
  607.                   bFindPortPattern(kLptPortPattern, oPort.PortName) = false  then
  608.        
  609.                    '
  610.                    ' First try deleting the existing port
  611.                    '
  612.                    ws("    DeletePort      strDestServer, _")
  613.                    ws("                    """ & StuffQuote(oPort.PortName) & """")
  614.    
  615.                    '
  616.                    ' Add the local port
  617.                    '
  618.                    iPortCount = iPortCount + 1
  619.                    ws("    AddLocalPort    strDestServer, _")
  620.                    ws("                    """ & StuffQuote(oPort.PortName)  & """") 
  621.                    blank
  622.                
  623.                else
  624.    
  625.                    '
  626.                    ' Otherwise, clone Standard TCP/IP ports
  627.                    '
  628.                    if oPort.PortType = kTcpRaw      or _
  629.                       oPort.PortType = kTcpLpr      or _ 
  630.                       oPort.Description = kStdTCPIP then
  631.                       
  632.                        '
  633.                        ' Get the configuration of this TCP port
  634.                        '
  635.                        dim strPortNameBackup
  636.                        
  637.                        strPortNameBackup = oPort.PortName
  638.                        
  639.                        oMaster.PortGet strServerName, strPortNameBackup , oPort
  640.    
  641.                        if Err = 0 then
  642.                           
  643.                            '
  644.                            ' First try deleting the existing port
  645.                            '
  646.                            ws("    DeletePort      strDestServer, _")
  647.                            ws("                    """ & StuffQuote(oPort.PortName) & """") 
  648.    
  649.                            '
  650.                            ' Add this standard TCP/IP port
  651.                            '
  652.                            iPortCount = iPortCount + 1
  653.    
  654.                            if oPort.PortType = kTcpRaw then
  655.    
  656.                                '
  657.                                ' Add a call to "AddTCPRawPort"
  658.                                '
  659.                                ws("    AddTCPRawPort   strDestServer, _")
  660.                                ws("                    """ & StuffQuote(oPort.PortName)      & """,  _") 
  661.                                ws("                    """ & oPort.HostAddress               & """,  _")
  662.                                ws("                    "   & CStr(oPort.PortNumber)          & ",  _")
  663.                                ws("                    "   & BoolStr(oPort.SNMP)             & ",  _")
  664.                                ws("                    "   & CStr(oPort.SNMPDeviceIndex)     & ",  _")
  665.                                ws("                    """ & oPort.CommunityName             & """")
  666.                                blank
  667.                            
  668.                            else
  669.                            
  670.                                '
  671.                                ' Add a call to "AddTCPLprPort"
  672.                                '
  673.                                ws("    AddTCPLprPort   strDestServer, _")
  674.                                ws("                    """ & StuffQuote(oPort.PortName)      & """,  _") 
  675.                                ws("                    """ & oPort.HostAddress               & """,  _")
  676.                                ws("                    "   & CStr(oPort.PortNumber)          & ",    _")
  677.                                ws("                    """ & oPort.QueueName                 & """,  _")
  678.                                ws("                    "   & BoolStr(oPort.SNMP)             & ",  _")
  679.                                ws("                    "   & CStr(oPort.SNMPDeviceIndex)     & ",  _")
  680.                                ws("                    """ & oPort.CommunityName             & """,  _")
  681.                                ws("                    "   & BoolStr(oPort.DoubleSpool)      & "")
  682.                                blank
  683.    
  684.                             end if
  685.                        
  686.                         else
  687.                             
  688.                             wscript.echo "Error getting configuration for port " & oPort.PortName & " (Standard TCP Port)"
  689.    
  690.                             Err.Clear
  691.    
  692.                         end if
  693.    
  694.                    else
  695.    
  696.                        wscript.echo "Skipping port " & oPort.PortName & " (" & Description(oPort.PortType) & ")"
  697.                    
  698.                    end if
  699.    
  700.                end if 
  701.    
  702.            end if
  703.            
  704.         else
  705.         
  706.             '
  707.             ' Clean up
  708.             '
  709.             oScript.Close
  710.         
  711.             oFileSystem.DeleteFile strScriptName 
  712.             
  713.             wscript.echo "Error: Listing ports, error: 0x" & Hex(Err.Number) 
  714.             if Err.Description <> "" then
  715.                 wscript.echo "Error description: " & Err.Description
  716.             end if
  717.             
  718.             exit sub   
  719.         
  720.         end if
  721.         
  722.     next
  723.  
  724.     if Err = 0 then
  725.  
  726.         wscript.echo "Success: Listing ports on Server " & strServerName
  727.  
  728.     else
  729.  
  730.         wscript.echo "Error: Listing ports, error: 0x" & Hex(Err.Number) 
  731.         if Err.Description <> "" then
  732.             wscript.echo "Error description: " & Err.Description
  733.         end if
  734.               
  735.         Err.Clear
  736.  
  737.     end if
  738.  
  739.     '
  740.     ' Write the summary script
  741.     '
  742.     wscript.echo "A total of " & CStr(iPortCount) & " port(s) are listed."
  743.  
  744.     ws("    EchoLine kNormal, ""Attempted to install a total of "" & CStr(iPortCount) & "" port(s)."" ")
  745.     ws("    EchoLine kNormal, CStr(iSuccessCount) & "" port(s) successfully installed,"" ")
  746.     ws("    EchoLine kNormal, CStr(iExistCount) & "" port(s) already exist."" ")
  747.  
  748.     '
  749.     ' Append other functions of port cloning script
  750.     '
  751.     PortCleanUp
  752.  
  753.     '            
  754.     ' Close the script file
  755.     '
  756.     oScript.Close
  757.  
  758.     wscript.echo "The script file for cloning ports is """ & strScriptName & """."
  759.  
  760. end sub
  761.  
  762. '
  763. ' Subroutine of "AddLocalPort"
  764. '
  765. sub ScriptAddLocalPort
  766.     
  767.     '
  768.     ' Insert the comment line before the function header 
  769.     '
  770.     blank
  771.     ws("'")
  772.     ws("' Add a local port")
  773.     ws("'")
  774.    
  775.     '
  776.     ' The function header
  777.     '
  778.     ws("sub AddLocalPort(ByVal strServerName,         _")
  779.     ws("                 ByVal strPortName            _") 
  780.     ws(")")
  781.     blank
  782.  
  783.     '
  784.     ' The function body
  785.     '
  786.     ws("    on error resume next")
  787.     blank
  788.     
  789.     '
  790.     ' Print out the information about the port that is about to be installed 
  791.     '
  792.     ws("    iPortCount = iPortCount + 1")
  793.     ws("    EchoLine kVerbose, ""Port:"" & CStr(iPortCount) ")
  794.     ws("    EchoLine kVerbose, ""    ServerName         : "" & strServerName ")
  795.     ws("    EchoLine kVerbose, ""    PortName           : "" & strPortName ")
  796.     ws("    EchoLine kVerbose, ""    PortType           : "  & Description(kLocal) & """")
  797.     blank
  798.     
  799.     ws("    dim oMaster")
  800.     ws("    dim oPort")
  801.     blank
  802.  
  803.     ws("    set oMaster = CreateObject(""PrintMaster.PrintMaster.1"")")
  804.     ws("    set oPort   = CreateObject(""Port.Port.1"")")
  805.     blank
  806.  
  807.     ws("    oPort.ServerName         = strServerName")
  808.     ws("    oPort.PortName           = strPortName")
  809.     ws("    oPort.PortType           = kLocal" )
  810.     blank
  811.  
  812.     ws("    oMaster.PortAdd oPort")
  813.     blank
  814.  
  815.     ws("    if Err = 0 or Err.Number = &H800700B7 then")
  816.     blank
  817.     
  818.     ws("        if Err = 0 then")
  819.     ws("            EchoLine kVerbose, ""Success: Port "" & strPortName & "" (" & Description(kTcpRaw) & ") added to server "" & strServerName ")
  820.     ws("            iSuccessCount = iSuccessCount + 1")
  821.     ws("        else")
  822.     ws("            EchoLine kVerbose, ""Port "" & strPortName & "" (" & Description(kTcpRaw) & ") already exists on server "" & strServerName ")
  823.     ws("            iExistCount = iExistCount + 1")
  824.     ws("        end if")
  825.     blank
  826.     
  827.     ws("    else")
  828.     blank
  829.  
  830.     ws("        EchoLine kNormal, ""Error: adding port "" & strPortName & "" (" & Description(kLocal) & "), error: 0x"" & Hex(Err.Number) ")
  831.     ws("        if Err.Description <> """" then ")
  832.     ws("            EchoLine kNormal,  ""       Error description: "" & Err.Description ")
  833.     ws("        end if")
  834.     ws("        Err.Clear")
  835.     blank
  836.  
  837.  
  838.     ws("    end if")
  839.     blank
  840.  
  841.     ws("    EchoLine kVerbose, """"")
  842.     blank
  843.  
  844.     ws("end sub")
  845.     blank
  846.  
  847. end sub
  848.  
  849. '
  850. ' Subroutine of "AddTCPRawPort"
  851. '
  852. sub ScriptAddTCPRawPort
  853.     
  854.     '
  855.     ' Insert the comment line before the function header 
  856.     '
  857.     blank
  858.     ws("'")
  859.     ws("' Add a Tcp raw port")
  860.     ws("'")
  861.    
  862.     '
  863.     ' The function header
  864.     '
  865.     ws("sub AddTCPRawPort(ByVal strServerName,         _")
  866.     ws("                  ByVal strPortName,           _") 
  867.     ws("                  ByVal strHostAddress,        _")
  868.     ws("                  ByVal PortNumber,            _") 
  869.     ws("                  ByVal SNMP,                  _") 
  870.     ws("                  ByVal SNMPDeviceIndex,       _") 
  871.     ws("                  ByVal CommunityName          _") 
  872.     ws(")")
  873.     blank
  874.  
  875.     '
  876.     ' The function body 
  877.     '
  878.     ws("    on error resume next")
  879.     blank
  880.     
  881.     '
  882.     ' Print out the information about the port that is about to be installed
  883.     '
  884.     ws("    iPortCount = iPortCount + 1")
  885.     ws("    EchoLine kVerbose, ""Port:"" & CStr(iPortCount) ")
  886.     ws("    EchoLine kVerbose, ""    ServerName         : "" & strServerName ")
  887.     ws("    EchoLine kVerbose, ""    PortName           : "" & strPortName ")
  888.     ws("    EchoLine kVerbose, ""    PortType           : "  & Description(kTcpRaw) & """")
  889.     ws("    EchoLine kVerbose, ""    HostAddress        : "" & strHostAddress ")
  890.     ws("    EchoLine kVerbose, ""    PortNumber         : "" & CStr(PortNumber) ")
  891.     ws("    EchoLine kVerbose, ""    SNMP               : "" & BoolStr(SNMP) ")
  892.     ws("    EchoLine kVerbose, ""    SNMPDeviceIndex    : "" & CStr(SNMPDeviceIndex) ")
  893.     ws("    EchoLine kVerbose, ""    CommunityName      : "" & CommunityName ")
  894.     blank
  895.  
  896.     '
  897.     ' The code that installs the port
  898.     '
  899.     ws("    dim oMaster")
  900.     ws("    dim oPort")
  901.     blank
  902.  
  903.     ws("    set oMaster = CreateObject(""PrintMaster.PrintMaster.1"")")
  904.     ws("    set oPort   = CreateObject(""Port.Port.1"")")
  905.     blank
  906.  
  907.     ws("    oPort.ServerName         = strServerName")
  908.     ws("    oPort.PortName           = strPortName")
  909.     ws("    oPort.PortType           = kTcpRaw" )
  910.     ws("    oPort.HostAddress        = strHostAddress")
  911.     ws("    oPort.PortNumber         = PortNumber")
  912.     ws("    oPort.SNMP               = SNMP")
  913.     ws("    oPort.SNMPDeviceIndex    = SNMPDeviceIndex")
  914.     ws("    oPort.CommunityName      = CommunityName")
  915.     blank
  916.  
  917.     ws("    oMaster.PortAdd oPort")
  918.     blank
  919.  
  920.     ws("    if Err = 0 or Err.Number = &H80070034  then")
  921.     blank
  922.     
  923.     ws("        if Err = 0 then")
  924.     ws("            EchoLine kVerbose, ""Success: Port "" & strPortName & "" (" & Description(kTcpRaw) & ") added to server "" & strServerName ")
  925.     ws("            iSuccessCount = iSuccessCount + 1")
  926.     ws("        else")
  927.     ws("            EchoLine kVerbose, ""Port "" & strPortName & "" (" & Description(kTcpRaw) & ") already exists on server "" & strServerName ")
  928.     ws("            iExistCount = iExistCount + 1")
  929.     ws("        end if")
  930.     blank
  931.     
  932.     ws("    else")
  933.     blank
  934.  
  935.     ws("        EchoLine kNormal, ""Error: adding port "" & strPortName & "" (" & Description(kTcpRaw) & "), error: 0x"" & hex(Err.Number) ")
  936.     ws("        if Err.Description <> """" then ")
  937.     ws("            EchoLine kNormal,  ""       Error description: "" & Err.Description ")
  938.     ws("        end if")
  939.     ws("        Err.Clear")
  940.     blank
  941.  
  942.  
  943.     ws("    end if")
  944.     blank
  945.  
  946.     ws("    EchoLine kVerbose, """"")
  947.     blank
  948.  
  949.     ws("end sub")
  950.     blank
  951.  
  952. end sub
  953.  
  954. '
  955. ' Subroutine of "AddTCPLprPort"
  956. '
  957. sub ScriptAddTCPLprPort
  958.     
  959.     '
  960.     ' Insert the comment line before the function header 
  961.     '
  962.     blank
  963.     ws("'")
  964.     ws("' Add a Tcp lpr port")
  965.     ws("'")
  966.    
  967.     '
  968.     ' The function header
  969.     '
  970.     ws("sub AddTCPLprPort(ByVal strServerName,         _")
  971.     ws("                  ByVal strPortName,           _") 
  972.     ws("                  ByVal strHostAddress,        _")
  973.     ws("                  ByVal PortNumber,            _") 
  974.     ws("                  ByVal QueueName,             _") 
  975.     ws("                  ByVal SNMP,                  _") 
  976.     ws("                  ByVal SNMPDeviceIndex,       _") 
  977.     ws("                  ByVal CommunityName,         _") 
  978.     ws("                  ByVal DoubleSpool            _") 
  979.     ws(")")
  980.     blank
  981.  
  982.     '
  983.     ' The function body 
  984.     '
  985.     ws("    on error resume next")
  986.     blank
  987.     
  988.     '
  989.     ' Print out the information about the port that is about to be installed
  990.     '
  991.     ws("    iPortCount = iPortCount + 1")
  992.     ws("    EchoLine kVerbose, ""Port:"" & CStr(iPortCount) ")
  993.     ws("    EchoLine kVerbose, ""    ServerName         : "" & strServerName ")
  994.     ws("    EchoLine kVerbose, ""    PortName           : "" & strPortName ")
  995.     ws("    EchoLine kVerbose, ""    PortType           : "  & Description(kTcpLpr) & """")
  996.     ws("    EchoLine kVerbose, ""    HostAddress        : "" & strHostAddress ")
  997.     ws("    EchoLine kVerbose, ""    PortNumber         : "" & CStr(PortNumber) ")
  998.     ws("    EchoLine kVerbose, ""    QueueName          : "" &  QueueName ")
  999.     ws("    EchoLine kVerbose, ""    SNMP               : "" & BoolStr(SNMP) ")
  1000.     ws("    EchoLine kVerbose, ""    SNMPDeviceIndex    : "" & CStr(SNMPDeviceIndex) ")
  1001.     ws("    EchoLine kVerbose, ""    CommunityName      : "" & CommunityName ")
  1002.     ws("    EchoLine kVerbose, ""    DoubleSpool        : "" & BoolStr(DoubleSpool) ")
  1003.     blank
  1004.  
  1005.     '
  1006.     ' The code that installs the port
  1007.     '
  1008.     ws("    dim oMaster")
  1009.     ws("    dim oPort")
  1010.     blank
  1011.  
  1012.     ws("    set oMaster = CreateObject(""PrintMaster.PrintMaster.1"")")
  1013.     ws("    set oPort   = CreateObject(""Port.Port.1"")")
  1014.     blank
  1015.  
  1016.     ws("    oPort.ServerName         = strServerName")
  1017.     ws("    oPort.PortName           = strPortName")
  1018.     ws("    oPort.PortType           = kTcpLpr" )
  1019.     ws("    oPort.HostAddress        = strHostAddress")
  1020.     ws("    oPort.PortNumber         = PortNumber")
  1021.     ws("    oPort.QueueName          = QueueName")
  1022.     ws("    oPort.SNMP               = SNMP")
  1023.     ws("    oPort.SNMPDeviceIndex    = SNMPDeviceIndex")
  1024.     ws("    oPort.CommunityName      = CommunityName")
  1025.     ws("    oPort.DoubleSpool        = DoubleSpool")
  1026.     blank
  1027.  
  1028.     ws("    oMaster.PortAdd oPort")
  1029.     blank
  1030.  
  1031.     ws("    if Err = 0 or Err.Number = &H80070034 then")
  1032.     blank
  1033.     
  1034.     ws("        if Err = 0 then")
  1035.     ws("            EchoLine kVerbose, ""Success: Port "" & strPortName & "" (" & Description(kTcpRaw) & ") added to server "" & strServerName ")
  1036.     ws("            iSuccessCount = iSuccessCount + 1")
  1037.     ws("        else")
  1038.     ws("            EchoLine kVerbose, ""Port "" & strPortName & "" (" & Description(kTcpRaw) & ") already exists on server "" & strServerName ")
  1039.     ws("            iExistCount = iExistCount + 1")
  1040.     ws("        end if")
  1041.     blank
  1042.     
  1043.     ws("    else")
  1044.     blank
  1045.  
  1046.     ws("        EchoLine kNormal, ""Error: adding port "" & strPortName & "" (" & Description(kTcpLpr) & "), error: 0x"" & Hex(Err.Number) ")
  1047.     ws("        if Err.Description <> """" then ")
  1048.     ws("            EchoLine kVerbose,  ""       Error description: "" & Err.Description ")
  1049.     ws("        end if")
  1050.     ws("        Err.Clear")
  1051.     blank
  1052.  
  1053.  
  1054.     ws("    end if")
  1055.     blank
  1056.  
  1057.     ws("    EchoLine kVerbose, """"")
  1058.     blank
  1059.  
  1060.     ws("end sub")
  1061.     blank
  1062.  
  1063. end sub
  1064.  
  1065. '
  1066. ' Subroutine of "DeletePort"
  1067. '
  1068. sub ScriptDeletePort
  1069.     
  1070.     '
  1071.     ' Insert the comment line before the function header 
  1072.     '
  1073.     blank
  1074.     ws("'")
  1075.     ws("' Delete an existing port")
  1076.     ws("'")
  1077.    
  1078.     '
  1079.     ' The function header
  1080.     '
  1081.     ws("sub DeletePort(ByVal strServerName,         _")
  1082.     ws("               ByVal strPortName            _") 
  1083.     ws(")")
  1084.     blank
  1085.  
  1086.     '
  1087.     ' The function body 
  1088.     '
  1089.     ws("    on error resume next")
  1090.     blank
  1091.  
  1092.     '
  1093.     ' If the user asks for keeping the original port, then don't delete it
  1094.     '
  1095.     ws("    if bKeepOriginalOnes = true then")
  1096.     blank
  1097.     ws("        exit sub")
  1098.     blank
  1099.     ws("    end if")
  1100.     blank
  1101.         
  1102.     '
  1103.     ' Print out the information about the port that is about to be deleted
  1104.     '
  1105.     ws("    EchoLine kVerbose, ""  Deleting Port: """)
  1106.     ws("    EchoLine kVerbose, ""    ServerName         : "" & strServerName ")
  1107.     ws("    EchoLine kVerbose, ""    PortName           : "" & strPortName ")
  1108.     blank
  1109.  
  1110.     '
  1111.     ' The code that deletes the port
  1112.     ' 
  1113.     ws("    dim oMaster")
  1114.     ws("    dim oPort")
  1115.     blank
  1116.  
  1117.     ws("    set oMaster = CreateObject(""PrintMaster.PrintMaster.1"")")
  1118.     ws("    set oPort   = CreateObject(""Port.Port.1"")")
  1119.     blank
  1120.  
  1121.     ws("    oPort.ServerName = strServerName")
  1122.     ws("    oPort.PortName   = strPortName")
  1123.     blank
  1124.  
  1125.     ws("    oMaster.PortDel oPort")
  1126.     blank
  1127.  
  1128.     ws("    if Err = 0 then")
  1129.     blank
  1130.     
  1131.     ws("        EchoLine kVerbose, ""  Success: Delete Port"" ")
  1132.     blank
  1133.     
  1134.     ws("    else")
  1135.     blank
  1136.  
  1137.     ws("        EchoLine kVerbose, ""  Error deleting port. Error: 0x"" & hex(Err.Number)") 
  1138.     ws("        if Err.Description <> """" then ")
  1139.     ws("            EchoLine kVerbose,  ""       Error description: "" & Err.Description ")
  1140.     ws("        end if")
  1141.     ws("        Err.Clear")
  1142.     blank
  1143.  
  1144.     ws("    end if")
  1145.     blank
  1146.  
  1147.     ws("    EchoLine kVerbose, """"")
  1148.     blank
  1149.  
  1150.     ws("end sub")
  1151.     blank
  1152.  
  1153. end sub
  1154.  
  1155. '
  1156. ' StartUp script for cloning ports
  1157. '
  1158. sub PortStartUp
  1159.  
  1160.     '
  1161.     ' Start creating the port cloning script
  1162.     '
  1163.     CopyrightScript 
  1164.     PortAbstractScript 
  1165.  
  1166.     '
  1167.     ' The script program starts
  1168.     '
  1169.     blank
  1170.     ws("option explicit")
  1171.     blank
  1172.  
  1173.     ws("'")
  1174.     ws("' Verbose Level")
  1175.     ws("'")
  1176.     ws("const kNormal    = 0")
  1177.     ws("const kVerbose   = 1")
  1178.     blank
  1179.     
  1180.     ws("'")
  1181.     ws("' Port Types")
  1182.     ws("'")
  1183.     ws("const kTcpRaw   = 1")
  1184.     ws("const kTcpLpr   = 2")
  1185.     ws("const kLocal    = 3")
  1186.     ws("const kLprMon   = 5")
  1187.     ws("const kHPdlc    = 7")
  1188.     ws("const kUnknown  = 8")
  1189.     blank
  1190.  
  1191.     ws("'")
  1192.     ws("' Flag, set if users don't want to replace the old ports")
  1193.     ws("'")
  1194.     ws("dim bKeepOriginalOnes")
  1195.     blank
  1196.  
  1197.     ws("dim strDestServer")
  1198.     blank
  1199.  
  1200.     ws("' The number of ports to be installed")
  1201.     blank
  1202.     ws("dim iPortCount")
  1203.     blank
  1204.     ws("' The number of ports sucessfully installed or that already exist")
  1205.     blank
  1206.     ws("dim iSuccessCount")
  1207.     ws("dim iExistCount")
  1208.     blank
  1209.     ws("dim bVerbose")
  1210.     blank
  1211.  
  1212.     ws("main")
  1213.     blank
  1214.     ws("'")
  1215.     ws("' Main execution starts here")
  1216.     ws("'")
  1217.  
  1218.     ws("sub main")
  1219.     blank
  1220.     ws("    bVerbose = false")
  1221.     ws("    bKeepOriginalOnes=false")
  1222.     ws("    iPortCount  = 0")
  1223.     ws("    iSuccessCount = 0")
  1224.     ws("    iExistCount = 0")
  1225.     ws("    strDestServer = """"")
  1226.     ws("    ParseCommandLine")
  1227.     blank
  1228.  
  1229. end sub
  1230.  
  1231. '
  1232. ' CleanUp script for cloning ports
  1233. '
  1234. sub PortCleanUp
  1235.     
  1236.     ws("end sub")
  1237.     
  1238.     '
  1239.     ' Append the subroutine "AddLocalPort"
  1240.     '
  1241.     ScriptAddLocalPort
  1242.     
  1243.     '
  1244.     ' Append the subroutine "AddTCPRawPort"
  1245.     '
  1246.     ScriptAddTCPRawPort
  1247.  
  1248.     '
  1249.     ' Append the subroutine "AddTCPLprPort"
  1250.     '
  1251.     ScriptAddTCPLprPort
  1252.  
  1253.     '
  1254.     ' Append the subroutine "DeletePort"
  1255.     '
  1256.     ScriptDeletePort
  1257.  
  1258.     '
  1259.     ' Append the function "BoolStr"
  1260.     '
  1261.     BoolStrScript
  1262.  
  1263.     '
  1264.     ' Append the command line parsing script
  1265.     '
  1266.     ParseCommandLineScript
  1267.  
  1268.     '                             
  1269.     ' Append the Usage script
  1270.     '
  1271.     PortUsageScript
  1272.  
  1273.     '
  1274.     ' Append the output macro
  1275.     '
  1276.     EchoLineScript
  1277.  
  1278. end sub
  1279.  
  1280. '
  1281. ' Abstract for the port cloning script
  1282. '
  1283. sub PortAbstractScript
  1284.  
  1285.     ws("' Abstract:")
  1286.     ws("'")
  1287.     ws("' " & strScriptName & " - port cloning script for Windows 2000")
  1288.     ws("'")
  1289.     oScript.WriteLine(kLongLineStr)
  1290.  
  1291. end sub
  1292.  
  1293. '
  1294. ' The Usage script used in the port cloning script
  1295. '
  1296. sub PortUsageScript
  1297.  
  1298.     blank
  1299.     ws("'")
  1300.     ws("' Display command usage.")
  1301.     ws("'")
  1302.     ws("sub Usage(ByVal bExit)")
  1303.     blank
  1304.  
  1305.     ws("    EchoLine kNormal, ""Usage: " & strScriptName & " [-c Destination_Server] [-kv]"" ")
  1306.     ws("    EchoLine kNormal, ""Arguments:"" ")
  1307.     ws("    EchoLine kNormal, ""    -c   - destination server name"" ")
  1308.     ws("    EchoLine kNormal, ""    -k   - keep the existing port with the same name"" ")
  1309.     ws("    EchoLine kNormal, ""           (WARNING: If this flag is set, the cloned server may not be identical to the original one."" ")
  1310.     ws("    EchoLine kNormal, ""    -v   - verbose mode"" ")
  1311.     ws("    EchoLine kNormal, ""    -?   - display command usage"" ")
  1312.     ws("    EchoLine kNormal, """" ")
  1313.     ws("    EchoLine kNormal, ""Examples:"" ")
  1314.     ws("    EchoLine kNormal, ""    " & strScriptName & """ ") 
  1315.     blank
  1316.  
  1317.     ws("    if bExit then")
  1318.     ws("        wscript.quit(1)")
  1319.     ws("    end if")
  1320.     blank
  1321.  
  1322.     ws("end sub")
  1323.     blank
  1324.  
  1325. end sub
  1326.  
  1327. '
  1328. ' Gets a string description for a port type
  1329. '
  1330. function Description(ByVal value)
  1331.  
  1332.     select case value
  1333.  
  1334.            case kTcpRaw
  1335.  
  1336.                 Description = "TCP RAW Port"
  1337.  
  1338.            case kTcpLpr
  1339.  
  1340.                 Description = "TCP LPR Port"
  1341.  
  1342.            case kLocal
  1343.  
  1344.                 Description = "Standard Local Port"
  1345.  
  1346.            case kLprMon
  1347.  
  1348.                 Description = "LPR Mon Port"
  1349.                 
  1350.            case kHPdlc
  1351.  
  1352.                 Description = "HP DLC Port"   
  1353.  
  1354.            case kUnknown
  1355.  
  1356.                 Description = "Unknown Port"
  1357.  
  1358.            case Else
  1359.  
  1360.                 Description = "Invalid PortType"
  1361.     end select
  1362.  
  1363. end function
  1364.  
  1365. '
  1366. '------------------------------------------------------------------------
  1367. '      Printer cloning script
  1368. '------------------------------------------------------------------------
  1369. '
  1370. sub PrinterCloneScript(ByVal strScriptName, ByVal strServerName)
  1371.  
  1372.     on error resume next
  1373.  
  1374.     wscript.echo
  1375.     wscript.echo "Creating the printer cloning script..."
  1376.  
  1377.     dim strPersistFilename 
  1378.  
  1379.     '
  1380.     ' Open the script file
  1381.     '
  1382.     set oScript = oFileSystem.CreateTextFile(strScriptName,TRUE)
  1383.  
  1384.     PrinterStartUp
  1385.  
  1386.     ws("    EchoLine kNormal, """" ")
  1387.     ws("    EchoLine kNormal, ""------------------------------"" ")
  1388.     ws("    EchoLine kNormal, ""Start installing printers..."" ")
  1389.  
  1390.     '
  1391.     ' Enumerate all the printers in server "strServerName",
  1392.     ' for each printer found, add a line in the script to
  1393.     ' call the AddPrinter subroutine
  1394.     '
  1395.     dim oMaster
  1396.     dim oPrinter
  1397.     dim iPrinterCount
  1398.     dim strPrinterName
  1399.  
  1400.     iPrinterCount = 0
  1401.     set oMaster  = CreateObject("PrintMaster.PrintMaster.1")
  1402.     for each oPrinter in oMaster.Printers(strServerName)
  1403.         
  1404.         if Err = 0 then 
  1405.            '
  1406.            ' Check to see if we need to clone this printer
  1407.            ' We only clone local printers
  1408.            '
  1409.        
  1410.            if bIsLocal(strServerName, oPrinter.PrinterName) then
  1411.    
  1412.                '
  1413.                ' Remove the ServerName part of the PrinterName
  1414.                '
  1415.                strPrinterName = Strip(oPrinter.PrinterName)
  1416.                
  1417.                '
  1418.                ' Try deleting the existing printer
  1419.                '
  1420.                ws("    DeletePrinter  strDestServer,  _")
  1421.                ws("                   """ & StuffQuote(strPrinterName) & """") 
  1422.    
  1423.                '
  1424.                ' Add a call to "AddPrinter"
  1425.                '
  1426.                iPrinterCount = iPrinterCount + 1
  1427.                ws("    AddPrinter  strDestServer, _")
  1428.                ws("                """ & StuffQuote(strPrinterName)  & """,  _")
  1429.                ws("                """ & oPrinter.DriverName   & """,  _")
  1430.                ws("                """ & StuffQuote(oPrinter.PortName)  & """,  _")
  1431.                ws("                """",  _")               ' Use default DriverPath
  1432.                ws("                """"    ")               ' Use default InfFile
  1433.           
  1434.                '
  1435.                ' Persist save the printer
  1436.                '
  1437.                strPersistFilename = strPrefixServerName & "per" & CStr(iPrinterCount) & "_clone.vbs"
  1438.                if SavePrinter( oPrinter.PrinterName, strPersistFilename ) = false then
  1439.    
  1440.                    wscript.echo "Error: skipping printer """ & oPrinter.PrinterName & """ persist save due to the error when getting the persist information"
  1441.    
  1442.                else    
  1443.    
  1444.                    '
  1445.                    ' Add script for calling persist restore
  1446.                    '
  1447.                    ws("    RestorePrinter strDestServer, """ & strPrinterName & """, """ & strPersistFilename & """" )
  1448.                    wscript.echo "Printer Name: """ &  strPrinterName  & """    <==>    Persist filename: " & strPersistFilename 
  1449.    
  1450.                end if
  1451.    
  1452.                blank
  1453.    
  1454.            else
  1455.    
  1456.                '
  1457.                ' It is not a local printer. Don't clone it.
  1458.                '
  1459.                wscript.echo "Skipping non-local printer: """ & oPrinter.PrinterName & """."
  1460.    
  1461.            end if
  1462.            
  1463.         else
  1464.                     
  1465.             '
  1466.             ' Clean up
  1467.             '
  1468.             oScript.Close
  1469.         
  1470.             oFileSystem.DeleteFile strScriptName 
  1471.         
  1472.             wscript.echo "Error: Listing printers, error: 0x" & Hex(Err.Number) 
  1473.             if Err.Description <> "" then
  1474.                wscript.echo "Error description: " & Err.Description
  1475.             end if
  1476.             
  1477.             exit sub
  1478.             
  1479.         end if   
  1480.  
  1481.     next
  1482.  
  1483.     if Err = 0 then
  1484.  
  1485.         wscript.echo "Success: Listing printers on Server " & strServerName
  1486.  
  1487.     else
  1488.  
  1489.         wscript.echo "Error: Listing printers, error: 0x" & Hex(Err.Number) 
  1490.         if Err.Description <> "" then
  1491.             wscript.echo "Error description: " & Err.Description
  1492.         end if
  1493.            
  1494.         Err.Clear
  1495.  
  1496.     end if
  1497.  
  1498.     '
  1499.     ' Write the summary
  1500.     '
  1501.     wscript.echo "A total of " & CSTR(iPrinterCount) & " printers are listed."
  1502.  
  1503.     ws("    EchoLine kNormal, ""Attempted to install a total of "" & CStr(iPrinterCount) & "" printer(s)."" ")
  1504.     ws("    EchoLine kNormal, CStr(iSuccessCount) & "" printer(s) were successfully installed."" ")
  1505.  
  1506.  
  1507.     if strServerName = "" then
  1508.  
  1509.         '
  1510.         ' If the source server is local, get and set the default printer
  1511.         '
  1512.         dim strDefaultPrinterName
  1513.         set oMaster = CreateObject("PrintMaster.PrintMaster.1")
  1514.         strDefaultPrinterName = StuffQuote(oMaster.DefaultPrinter)
  1515.  
  1516.         if Err <> 0 then
  1517.  
  1518.             wscript.echo "Error: Getting default printer """ & oMaster.DefaultPrinter & """, error: 0x" & Hex(Err.Number) 
  1519.             if Err.Description <> "" then
  1520.                 wscript.echo "Error description: " & Err.Description
  1521.             end if
  1522.                         
  1523.             Err.Clear 
  1524.  
  1525.         else
  1526.         
  1527.             '
  1528.             ' Setting the default printer
  1529.             '
  1530.             blank
  1531.             ws("'")
  1532.             ws("' Set the default printer")
  1533.             ws("'   (do this only if the installation is on the local machine)")
  1534.             ws("'")
  1535.             ws("    if strDestServer = """" then ")
  1536.             blank
  1537.             ws("        dim oMaster")
  1538.             ws("        set oMaster = CreateObject(""PrintMaster.PrintMaster.1"") ")
  1539.             ws("        oMaster.DefaultPrinter = """ & strDefaultPrinterName & """" )
  1540.             blank
  1541.             ws("        if Err = 0 then")
  1542.             ws("            EchoLine kNormal, ""Success: Setting the default printer to """"" & strDefaultPrinterName & """"" "" " )
  1543.             ws("        else")
  1544.             ws("            EchoLine kNormal, ""Error: Setting default printer "" &  strDefaultPrinterName ")
  1545.             ws("        end if")
  1546.             blank
  1547.             ws("    end if")
  1548.             blank
  1549.  
  1550.         end if
  1551.  
  1552.     end if
  1553.  
  1554.     PrinterCleanUp
  1555.  
  1556.     '           
  1557.     ' Close the script file
  1558.     '
  1559.     oScript.Close
  1560.  
  1561.     wscript.echo "The script file for cloning printers is """ & strScriptName & """."
  1562.  
  1563. end sub
  1564.  
  1565. '
  1566. ' Subroutine of "AddPrinter"
  1567. '
  1568. sub ScriptAddPrinter
  1569.     
  1570.     '
  1571.     ' Insert the comment line before the function header 
  1572.     '
  1573.     blank
  1574.     ws("'")
  1575.     ws("' Add a printer")
  1576.     ws("'")
  1577.    
  1578.     '
  1579.     ' The function header
  1580.     '
  1581.     ws("sub AddPrinter(ByVal strServerName,       _")
  1582.     ws("               ByVal strPrinterName,      _") 
  1583.     ws("               ByVal strDriverName,       _")
  1584.     ws("               ByVal strPortName,         _")
  1585.     ws("               ByVal strDriverPath,       _")
  1586.     ws("               ByVal strInfFile           _")
  1587.     ws(")")
  1588.     blank
  1589.  
  1590.     '
  1591.     ' The function body
  1592.     '
  1593.     ws("    on error resume next")
  1594.     blank
  1595.  
  1596.     '
  1597.     ' Print out the information about the printer that is about to be installed 
  1598.     ' 
  1599.     ws("    iPrinterCount = iPrinterCount + 1")
  1600.     ws("    EchoLine kVerbose, ""Printer:"" & CSTR(iPrinterCount)                  ")
  1601.     ws("    EchoLine kVerbose, ""    ServerName      : "" & strServerName          ")
  1602.     ws("    EchoLine kVerbose, ""    PrinterName     : "" & strPrinterName         ")
  1603.     ws("    EchoLine kVerbose, ""    DriverName      : "" & strDriverName          ")
  1604.     ws("    EchoLine kVerbose, ""    PortName        : "" & strPortName            ")
  1605.     blank
  1606.  
  1607.     '
  1608.     ' The codes that installs the printer 
  1609.     '
  1610.     ws("    dim oMaster")
  1611.     ws("    dim oPrinter")
  1612.     blank
  1613.  
  1614.     ws("    set oMaster = CreateObject(""PrintMaster.PrintMaster.1"")")
  1615.     ws("    set oPrinter = CreateObject(""Printer.Printer.1"")")
  1616.     blank
  1617.  
  1618.     ws("    oPrinter.ServerName       = strServerName     ")
  1619.     ws("    oPrinter.PrinterName      = strPrinterName    ")
  1620.     ws("    oPrinter.DriverName       = strDriverName     ")
  1621.     ws("    oPrinter.PortName         = strPortName       ")
  1622.     ws("    oPrinter.DriverPath       = strDriverPath     ")
  1623.     ws("    oPrinter.InfFile          = strInfFile        ")
  1624.     blank
  1625.  
  1626.     ws("    oMaster.PrinterAdd oPrinter")
  1627.     blank
  1628.  
  1629.     ws("    if Err = 0 then")
  1630.     blank
  1631.     
  1632.     ws("        EchoLine kVerbose, ""Success: Printer "" & strPrinterName & "" added to server "" & strServerName ")
  1633.     ws("        iSuccessCount = iSuccessCount + 1")
  1634.     blank
  1635.     
  1636.     ws("    else")
  1637.     blank
  1638.  
  1639.     ws("        EchoLine kNormal, ""Error adding printer "" & strPrinterName & "", error: 0x"" & Hex(Err.Number) ")
  1640.     ws("        if Err.Description <> """" then ")
  1641.     ws("            EchoLine kVerbose,  ""       Error description: "" & Err.Description ")
  1642.     ws("        end if")
  1643.     ws("        Err.Clear")
  1644.     blank
  1645.  
  1646.  
  1647.     ws("    end if")
  1648.     blank
  1649.  
  1650.     ws("    EchoLine kVerbose, """"")
  1651.     blank
  1652.  
  1653.     ws("end sub")
  1654.     blank
  1655.  
  1656. end sub
  1657.  
  1658. '
  1659. ' Save printer configuration
  1660. '
  1661. function SavePrinter(ByVal strPrinterName, ByVal strFileName)
  1662.  
  1663.     on error resume next
  1664.     
  1665.     dim oMaster
  1666.     set oMaster = CreateObject("PrintMaster.PrintMaster.1")
  1667.     
  1668.     oMaster.PrinterPersistSave strPrinterName, strFileName, kAllSettings
  1669.  
  1670.     if Err <> 0 then
  1671.     
  1672.         wscript.echo "Error saving the configuration of the printer """ & strPrinterName & """, error: 0x" & Hex(Err.Number)
  1673.     
  1674.         SavePrinter = false
  1675.  
  1676.     else 
  1677.         
  1678.         SavePrinter = true
  1679.  
  1680.     end if
  1681.  
  1682. end function
  1683.  
  1684. '
  1685. ' Script for printer persist restore
  1686. '
  1687. sub RestorePrinterScript()
  1688.  
  1689.     ws("'")
  1690.     ws("' Restore printer configuration")
  1691.     ws("'")
  1692.     blank
  1693.  
  1694.     ws("sub RestorePrinter(ByVal strServerName, ByVal strPrinterName, ByVal strFileName)")
  1695.     blank
  1696.  
  1697.     ws("    on error resume next")
  1698.     blank
  1699.  
  1700.     ws("    dim oMaster")
  1701.     ws("    set oMaster = CreateObject(""PrintMaster.PrintMaster.1"") ")
  1702.     blank
  1703.         
  1704.     ws("    oMaster.PrinterPersistRestore strFullName(strServerName, strPrinterName), strFileName, _")
  1705.     ws("      kAllSettings + kResolveName + kReslovePort + kResolveShare")
  1706.     blank
  1707.  
  1708.     ws("    if Err = 0 then")
  1709.     ws("        EchoLine kVerbose, ""Success restoring the configuration of the printer"" & strPrinterName ")
  1710.     ws("        EchoLine kVerbose, """" ")
  1711.     ws("    else")
  1712.     ws("        if Err.Number = kErrorNoDs then")
  1713.     ws("            Err.Clear")  
  1714.     ws("            '")
  1715.     ws("            ' Try resoring without Printer Info 7")
  1716.     ws("            '")   
  1717.     ws("           oMaster.PrinterPersistRestore strFullName(strServerName, strPrinterName), strFileName, _")
  1718.     ws("           kPersistNoDs + kResolveName + kReslovePort + kResolveShare") 
  1719.     ws("        end if")
  1720.     ws("")
  1721.     ws("        if Err = 0 then")
  1722.     ws("            EchoLine kVerbose, ""Success restoring the configuration of the printer"" & strPrinterName ") 
  1723.     ws("            EchoLine kVerbose, """" ")
  1724.     ws("        else")
  1725.     ws("            EchoLine kNormal, ""Error restoring the configuration of the printer "" & strPrinterName & "", error: 0x"" & Hex(Err.Number)")
  1726.     ws("            EchoLine kNormal, """" ") 
  1727.     ws("            Err.Clear")
  1728.     ws("        end if")
  1729.     ws("    end if")
  1730.     blank
  1731.  
  1732.     ws("end sub")
  1733.     blank
  1734.  
  1735. end sub
  1736.  
  1737. '
  1738. ' Subroutine of "DeletePrinter"
  1739. '
  1740. sub ScriptDeletePrinter
  1741.     
  1742.     '
  1743.     ' Insert the comment line before the function header 
  1744.     '
  1745.     blank
  1746.     ws("'")
  1747.     ws("' Delete an existing printer")
  1748.     ws("'")
  1749.    
  1750.     '
  1751.     ' The function header
  1752.     '
  1753.     ws("sub DeletePrinter(ByVal strServerName,         _")
  1754.     ws("                  ByVal strPrinterName         _") 
  1755.     ws(")")
  1756.     blank
  1757.  
  1758.     '
  1759.     ' The function body 
  1760.     '
  1761.     ws("    on error resume next")
  1762.     blank
  1763.  
  1764.     '
  1765.     ' If the user asks for keeping the original printer, then don't delete it
  1766.     '
  1767.     ws("    if bKeepOriginalOnes = true then")
  1768.     blank
  1769.     ws("        exit sub")
  1770.     blank
  1771.     ws("    end if")
  1772.     blank
  1773.         
  1774.     '
  1775.     ' Print out the information about the printer that is about to be deleted 
  1776.     '
  1777.     ws("    EchoLine kVerbose, ""  Deleting Printer: """)
  1778.     ws("    EchoLine kVerbose, ""    ServerName         : "" & strServerName ")
  1779.     ws("    EchoLine kVerbose, ""    PrinterName        : "" & strPrinterName ")
  1780.     blank
  1781.  
  1782.     '
  1783.     ' The code that deletes the printer
  1784.     '
  1785.     ws("    dim oMaster")
  1786.     ws("    dim oPrinter")
  1787.     blank
  1788.  
  1789.     ws("    set oMaster = CreateObject(""PrintMaster.PrintMaster.1"")")
  1790.     ws("    set oPrinter = CreateObject(""Printer.Printer.1"")")
  1791.     blank
  1792.  
  1793.     ws("    oPrinter.ServerName       = strServerName     ")
  1794.     ws("    oPrinter.PrinterName      = strPrinterName    ")
  1795.     blank
  1796.  
  1797.     ws("    oMaster.PrinterDel oPrinter")
  1798.     blank
  1799.  
  1800.     ws("    if Err = 0 then")
  1801.     blank
  1802.     
  1803.     ws("        EchoLine kVerbose, ""  Success: Delete Printer"" ")
  1804.     blank
  1805.     
  1806.     ws("    else")
  1807.     blank
  1808.  
  1809.     ws("        EchoLine kVerbose, ""  Error deleting printer "" & strPrinterName & "". Error: 0x"" & Hex(Err.Number)") 
  1810.     ws("        if Err.Description <> """" then ")
  1811.     ws("            EchoLine kVerbose,  ""       Error description: "" & Err.Description ")
  1812.     ws("        end if")
  1813.     ws("        Err.Clear")
  1814.     blank
  1815.  
  1816.     ws("    end if")
  1817.     blank
  1818.  
  1819.     ws("    EchoLine kVerbose, """"")
  1820.     blank
  1821.  
  1822.     ws("end sub")
  1823.     blank
  1824.  
  1825. end sub
  1826.  
  1827. '
  1828. ' StartUp script for cloning printers
  1829. '
  1830. sub PrinterStartUp
  1831.  
  1832.     '
  1833.     ' Start to create the printer cloning script
  1834.     '
  1835.     CopyrightScript 
  1836.     PrinterAbstractScript 
  1837.  
  1838.     '
  1839.     ' The script program starts
  1840.     '
  1841.     blank
  1842.     ws("option explicit")
  1843.     blank
  1844.  
  1845.     ws("'")
  1846.     ws("' Verbose Level")
  1847.     ws("'")
  1848.     ws("const kNormal    = 0")
  1849.     ws("const kVerbose   = 1")
  1850.     blank
  1851.     
  1852.     '
  1853.     '  Add the printer persist constants
  1854.     '
  1855.     ws("'")
  1856.     ws("' Constants for printer persist")
  1857.     ws("'")
  1858.     ws("const kAllSettings            = 127")
  1859.     ws("const kPrinterInfo7           = 4")
  1860.     ws("const kResolveName            = 256")
  1861.     ws("const kReslovePort            = 512")
  1862.     ws("const kResolveShare           = 1024")
  1863.     ws("'")
  1864.     ws("'")
  1865.     ws("' If the DS is not present, restore printer without Printer Info 7") 
  1866.     ws("'")
  1867.     ws("const kPersistNoDs            = 123")
  1868.     ws("const kErrorNoDs              = &H8004000C")
  1869.     blank
  1870.  
  1871.     ws("'")
  1872.     ws("' Flag, set if users don't want to replace the old forms")
  1873.     ws("'")
  1874.     ws("dim bKeepOriginalOnes")
  1875.     blank
  1876.  
  1877.     ws("dim strDestServer")
  1878.     blank
  1879.  
  1880.     ws("' The number of printers to be installed")
  1881.     blank
  1882.     ws("dim iPrinterCount")
  1883.     blank
  1884.     ws("' The number of printers sucessfully installed")
  1885.     blank
  1886.     ws("dim iSuccessCount")
  1887.     blank
  1888.     ws("dim bVerbose")
  1889.     blank
  1890.  
  1891.     ws("main")
  1892.     blank
  1893.     ws("'")
  1894.     ws("' Main execution starts here")
  1895.     ws("'")
  1896.  
  1897.     ws("sub main")
  1898.     blank
  1899.     ws("    bVerbose = false")
  1900.     ws("    bKeepOriginalOnes=false")
  1901.     ws("    iPrinterCount  = 0")
  1902.     ws("    iSuccessCount = 0")
  1903.     ws("    strDestServer = """"")
  1904.     ws("    ParseCommandLine")
  1905.     blank
  1906.  
  1907. end sub
  1908.  
  1909. '
  1910. ' CleanUp script for cloning printers
  1911. '
  1912. sub PrinterCleanUp
  1913.     
  1914.     ws("end sub")
  1915.     
  1916.     ' Append the subroutine "AddPrinter"
  1917.     ScriptAddPrinter
  1918.  
  1919.     '
  1920.     ' Append the subroutine "RestorePrinter"
  1921.     '
  1922.     RestorePrinterScript
  1923.  
  1924.     '
  1925.     ' Append the subroutine "DeletePrinter"
  1926.     '
  1927.     ScriptDeletePrinter
  1928.  
  1929.     '
  1930.     ' Append the script for creating the full name for the printer
  1931.     '
  1932.     strFullNameScript
  1933.  
  1934.     '
  1935.     ' Append the command line parsing script
  1936.     '
  1937.     ParseCommandLineScript
  1938.  
  1939.     '
  1940.     ' Append the Usage script
  1941.     '
  1942.     PrinterUsageScript
  1943.  
  1944.     '
  1945.     ' Append the output macro
  1946.     '
  1947.     EchoLineScript
  1948.  
  1949. end sub
  1950.  
  1951. '
  1952. ' Script for creating the full printer name (containing ServerName and PrinterName)
  1953. ' which is used in RestorePrinter
  1954. '
  1955. function strFullNameScript()
  1956.  
  1957.     ws("'")
  1958.     ws("' Function for creating the full printer name")
  1959.     ws("'")
  1960.     ws("function strFullName(ByVal strServerName, ByVal strPrinterName)")
  1961.     blank
  1962.     ws("    if strServerName = """" then")
  1963.     blank
  1964.     ws("        strFullName = strPrinterName")
  1965.     blank
  1966.     ws("    else")
  1967.     blank 
  1968.     ws("        strFullName = strServerName & ""\"" & strPrinterName")
  1969.     blank
  1970.     ws("    end if")
  1971.     blank
  1972.     ws("end function")
  1973.     blank
  1974.  
  1975. end function
  1976.  
  1977. '
  1978. ' Abstract for the printer cloning script
  1979. '
  1980. sub PrinterAbstractScript
  1981.  
  1982.     ws("' Abstract:")
  1983.     ws("'")
  1984.     ws("' " & strScriptName & " - printer cloning script for Windows 2000")
  1985.     ws("'")
  1986.     oScript.WriteLine(kLongLineStr)
  1987.  
  1988. end sub
  1989.  
  1990. '
  1991. ' The Usage script used in the printer cloning script
  1992. '
  1993. sub PrinterUsageScript
  1994.  
  1995.     blank
  1996.     ws("'")
  1997.     ws("' Display command usage.")
  1998.     ws("'")
  1999.     ws("sub Usage(ByVal bExit)")
  2000.     blank
  2001.  
  2002.     ws("    EchoLine kNormal, ""Usage: " & strScriptName & " [-c Destination_Server] [-kv]"" ")
  2003.     ws("    EchoLine kNormal, ""Arguments:"" ")
  2004.     ws("    EchoLine kNormal, ""    -c   - destination server name"" ")
  2005.     ws("    EchoLine kNormal, ""    -k   - keep the existing printer with the same name"" ")
  2006.     ws("    EchoLine kNormal, ""           (WARNING: If this flag is set, the cloned server may not be identical to the original one."" ")
  2007.     ws("    EchoLine kNormal, ""    -v   - verbose mode"" ")
  2008.     ws("    EchoLine kNormal, ""    -?   - display command usage"" ")
  2009.     ws("    EchoLine kNormal, """" ")
  2010.     ws("    EchoLine kNormal, ""Examples:"" ")
  2011.     ws("    EchoLine kNormal, ""    " & strScriptName & """ ") 
  2012.     blank
  2013.  
  2014.     ws("    if bExit then")
  2015.     ws("        wscript.quit(1)")
  2016.     ws("    end if")
  2017.     blank
  2018.  
  2019.     ws("end sub")
  2020.     blank
  2021.  
  2022. end sub
  2023.  
  2024. '
  2025. '------------------------------------------------------------------------
  2026. '      Form cloning script
  2027. '------------------------------------------------------------------------
  2028. '
  2029. sub FormCloneScript(ByVal strScriptName, ByVal strServerName)
  2030.  
  2031.     on error resume next
  2032.  
  2033.     wscript.echo
  2034.     wscript.echo   "Creating the form cloning script..."
  2035.  
  2036.     dim iHeight
  2037.     dim iWidth
  2038.     dim iTop
  2039.     dim iLeft
  2040.     dim iBottom
  2041.     dim iRight
  2042.  
  2043.     '
  2044.     ' Open the script file
  2045.     '
  2046.     set oScript = oFileSystem.CreateTextFile(strScriptName,TRUE)
  2047.  
  2048.     FormStartUp
  2049.  
  2050.     ws("    EchoLine kNormal, """" ")
  2051.     ws("    EchoLine kNormal, ""------------------------------"" ")
  2052.     ws("    EchoLine kNormal, ""Start installing forms..."" ")
  2053.  
  2054.     '
  2055.     ' Enumerate all the forms in server "strServerName",
  2056.     ' for each form found, add a line in the script to
  2057.     ' call the AddForm subroutine
  2058.     '
  2059.     dim oMaster
  2060.     dim oForm
  2061.     dim iFormCount
  2062.   
  2063.     iFormCount = 0
  2064.     set oMaster  = CreateObject("PrintMaster.PrintMaster.1")
  2065.     for each oForm in oMaster.Forms(strServerName)
  2066.     
  2067.         if Err = 0 then
  2068.            '
  2069.            ' Try deleting the existing form    
  2070.            '
  2071.            ws("    DeleteForm  strDestServer,  _")
  2072.            ws("                """ & StuffQuote(oForm.Name) & """") 
  2073.    
  2074.            oForm.GetSize iHeight, iWidth
  2075.            oForm.GetImageableArea  iTop, iLeft, iBottom, iRight
  2076.    
  2077.            iFormCount = iFormCount + 1
  2078.            ws("    AddForm     strDestServer, _")
  2079.            ws("                """ & StuffQuote(oForm.Name)  & """, _") 
  2080.            ws("                "   & CStr(oForm.Flags)    & ", _")
  2081.            ws("                "   & CStr(iHeight)  & ", _") 
  2082.            ws("                "   & CStr(iWidth)   & ", _") 
  2083.            ws("                "   & CStr(iTop)     & ", _") 
  2084.            ws("                "   & CStr(iLeft)    & ", _") 
  2085.            ws("                "   & CStr(iBottom)  & ", _") 
  2086.            ws("                "   & CStr(iRight)   ) 
  2087.            blank
  2088.         
  2089.         else      
  2090.             
  2091.             '
  2092.             ' Clean up
  2093.             '
  2094.             oScript.Close
  2095.         
  2096.             oFileSystem.DeleteFile strScriptName 
  2097.  
  2098.             wscript.echo "Error: Listing forms, error: 0x" & Hex(Err.Number) 
  2099.             if Err.Description <> "" then
  2100.                 wscript.echo "Error description: " & Err.Description
  2101.             end if
  2102.  
  2103.             exit sub
  2104.            
  2105.         end if
  2106.        
  2107.     next
  2108.  
  2109.     if Err = 0 then
  2110.  
  2111.         wscript.echo "Success: Listing forms on Server " & strServerName
  2112.  
  2113.     else
  2114.  
  2115.         wscript.echo "Error: Listing forms, error: 0x" & Hex(Err.Number) 
  2116.         if Err.Description <> "" then
  2117.             wscript.echo "Error description: " & Err.Description
  2118.         end if
  2119.        
  2120.         Err.Clear
  2121.  
  2122.     end if
  2123.  
  2124.     wscript.echo  "A total of " & CSTR(iFormCount) & " forms are listed."
  2125.  
  2126.     ws("    EchoLine kNormal, ""Attempted to install a total of "" & CStr(iFormCount) & "" forms."" ")
  2127.     ws("    EchoLine kNormal, CStr(iSuccessCount) & "" forms successfully installed."" ")
  2128.  
  2129.     FormCleanUp
  2130.  
  2131.     '                  
  2132.     ' Close the script file
  2133.     '
  2134.     oScript.Close
  2135.  
  2136.     wscript.echo  "The script file for cloning forms is """ & strScriptName & """."
  2137.  
  2138. end sub
  2139.  
  2140. '
  2141. ' Subroutine of "AddForm"
  2142. '
  2143. sub ScriptAddForm
  2144.     
  2145.     '
  2146.     ' Insert the comment line before the function header 
  2147.     '
  2148.     blank
  2149.     ws("'")
  2150.     ws("' Add a Form")
  2151.     ws("'")
  2152.    
  2153.     '
  2154.     ' The function header
  2155.     '
  2156.     ws("sub AddForm(ByVal strServerName,         _")
  2157.     ws("            ByVal strName,               _") 
  2158.     ws("            ByVal iFlags,                _")
  2159.     ws("            ByVal iHeight,               _")
  2160.     ws("            ByVal iWidth,                _")
  2161.     ws("            ByVal iTop,                  _")
  2162.     ws("            ByVal iLeft,                 _")
  2163.     ws("            ByVal iBottom,               _")
  2164.     ws("            ByVal iRight                 _")
  2165.     ws(")")
  2166.     blank
  2167.  
  2168.     '
  2169.     ' The function body
  2170.     '
  2171.     ws("    on error resume next")
  2172.     blank
  2173.     
  2174.     '
  2175.     ' Print out the information about the form that is about to be installed
  2176.     '
  2177.     ws("    iFormCount = iFormCount + 1")
  2178.     ws("    EchoLine kVerbose, ""Form:"" & CSTR(iFormCount) ")
  2179.     ws("    EchoLine kVerbose, ""    ServerName : "" & strServerName ")
  2180.     ws("    EchoLine kVerbose, ""    Name       : "" & strName ")
  2181.     ws("    EchoLine kVerbose, ""    Type       : "" & CStr(iFlags) ")
  2182.     ws("    EchoLine kVerbose, ""    Height     : "" & CStr(iHeight) ")
  2183.     ws("    EchoLine kVerbose, ""    Width      : "" & CStr(iWidth) ")
  2184.     ws("    EchoLine kVerbose, ""    Top        : "" & CStr(iTop) ")
  2185.     ws("    EchoLine kVerbose, ""    Left       : "" & CStr(iLeft) ")
  2186.     ws("    EchoLine kVerbose, ""    Bottom     : "" & CStr(iBottom) ")
  2187.     ws("    EchoLine kVerbose, ""    Right      : "" & CStr(iRight) ")
  2188.     blank
  2189.  
  2190.     '
  2191.     ' The code that installs the form 
  2192.     '
  2193.     ws("    dim oMaster")
  2194.     ws("    dim oForm")
  2195.     blank
  2196.  
  2197.     ws("    set oMaster = CreateObject(""PrintMaster.PrintMaster.1"")")
  2198.     ws("    set oForm = CreateObject(""Form.Form.1"")")
  2199.     blank
  2200.  
  2201.     ws("    oForm.ServerName  = strServerName")
  2202.     ws("    oForm.Name        = strName")
  2203.     ws("    oForm.Flags       = iFlags")
  2204.     ws("    oForm.SetSize iHeight, iWidth")
  2205.     ws("    oForm.SetImageableArea iTop, iLeft, iBottom, iRight")
  2206.     blank
  2207.  
  2208.     ws("    oMaster.FormAdd oForm")
  2209.     blank
  2210.  
  2211.     ws("' If no error or error code is for ""existing form"" then succeed")
  2212.     ws("    if Err = 0 or Err.number = &H80070050 then")
  2213.     blank
  2214.     
  2215.     ws("        EchoLine kVerbose, ""Success: Form "" & strName & "" added to server "" & strServerName ")
  2216.     ws("        iSuccessCount = iSuccessCount + 1")
  2217.     blank
  2218.     
  2219.     ws("    else")
  2220.     blank
  2221.  
  2222.     ws("        EchoLine kNormal, ""Error: adding Form "" & strName & "", error: 0x"" & hex(Err.Number) ")
  2223.     ws("        if Err.Description <> """" then ")
  2224.     ws("            EchoLine kVerbose,  ""       Error description: "" & Err.Description ")
  2225.     ws("        end if")
  2226.     ws("        Err.Clear")
  2227.     blank
  2228.  
  2229.  
  2230.     ws("    end if")
  2231.     blank
  2232.  
  2233.     ws("    EchoLine kVerbose, """"")
  2234.     blank
  2235.  
  2236.     ws("end sub")
  2237.     blank
  2238.  
  2239. end sub
  2240.  
  2241. '
  2242. ' Subroutine of "DeleteForm"
  2243. '
  2244. sub ScriptDeleteForm
  2245.     
  2246.     '
  2247.     ' Insert the comment line before the function header 
  2248.     '
  2249.     blank
  2250.     ws("'")
  2251.     ws("' Delete an existing form")
  2252.     ws("'")
  2253.    
  2254.     '
  2255.     ' The function header
  2256.     '
  2257.     ws("sub DeleteForm(ByVal strServerName,         _")
  2258.     ws("               ByVal strFormName            _") 
  2259.     ws(")")
  2260.     blank
  2261.     
  2262.     '
  2263.     ' The function body 
  2264.     '
  2265.     ws("    on error resume next")
  2266.     blank
  2267.  
  2268.     '
  2269.     ' If the user asks for keeping the original form, then don't delete it
  2270.     '
  2271.     ws("    if bKeepOriginalOnes = true then")
  2272.     blank
  2273.     ws("        exit sub")
  2274.     blank
  2275.     ws("    end if")
  2276.     blank
  2277.         
  2278.     '
  2279.     ' Print out the information about the form that is about to be deleted
  2280.     '
  2281.     ws("    EchoLine kVerbose, ""  Deleting Form: """)
  2282.     ws("    EchoLine kVerbose, ""    ServerName         : "" & strServerName ")
  2283.     ws("    EchoLine kVerbose, ""    FormName           : "" & strFormName ")
  2284.     blank
  2285.  
  2286.     '
  2287.     ' The code that deletes the form
  2288.     '
  2289.     ws("    dim oMaster")
  2290.     ws("    dim oForm")
  2291.     blank
  2292.  
  2293.     ws("    set oMaster = CreateObject(""PrintMaster.PrintMaster.1"")")
  2294.     ws("    set oForm   = CreateObject(""Form.Form.1"")")
  2295.     blank
  2296.  
  2297.     ws("    oForm.Name       = strFormName")
  2298.     ws("    oForm.ServerName = strServerName")
  2299.     ws("    oMaster.FormDel  oForm")
  2300.     blank
  2301.  
  2302.     ws("    if Err = 0 then")
  2303.     blank
  2304.     
  2305.     ws("        EchoLine kVerbose, ""  Success: Delete Form"" & strFormName ")
  2306.     blank
  2307.     
  2308.     ws("    else")
  2309.     blank
  2310.  
  2311.     ws("        EchoLine kVerbose, ""  Error deleting form "" & strFormName & "". Error: 0x"" & hex(Err.Number)")
  2312.     ws("        if Err.Description <> """" then ")
  2313.     ws("            EchoLine kVerbose,  ""       Error description: "" & Err.Description ")
  2314.     ws("        end if")
  2315.     ws("        Err.Clear")
  2316.     blank
  2317.  
  2318.     ws("    end if")
  2319.     blank
  2320.  
  2321.     ws("    EchoLine kVerbose, """"")
  2322.     blank
  2323.  
  2324.     ws("end sub")
  2325.     blank
  2326.  
  2327. end sub
  2328.  
  2329. '
  2330. ' StartUp script for cloning forms
  2331. '
  2332. sub FormStartUp
  2333.  
  2334.     '
  2335.     ' Start creating the form cloning script
  2336.     '
  2337.     CopyrightScript 
  2338.     FormAbstractScript 
  2339.  
  2340.     '
  2341.     ' The script program starts
  2342.     '
  2343.     blank
  2344.     ws("option explicit")
  2345.     blank
  2346.  
  2347.     ws("'")
  2348.     ws("' Verbose Level")
  2349.     ws("'")
  2350.     ws("const kNormal    = 0")
  2351.     ws("const kVerbose   = 1")
  2352.     blank
  2353.     
  2354.     ws("'")
  2355.     ws("' Flag, set if users don't want to replace the old forms")
  2356.     ws("'")
  2357.     ws("dim bKeepOriginalOnes")
  2358.     blank
  2359.  
  2360.     ws("dim strDestServer")
  2361.     blank
  2362.  
  2363.     ws("' The number of forms to be installed")
  2364.     blank
  2365.     ws("dim iFormCount")
  2366.     blank
  2367.     ws("' The number of forms sucessfully installed")
  2368.     blank
  2369.     ws("dim iSuccessCount")
  2370.     blank
  2371.     ws("dim bVerbose")
  2372.     blank
  2373.  
  2374.     ws("main")
  2375.     blank
  2376.     ws("'")
  2377.     ws("' Main execution starts here")
  2378.     ws("'")
  2379.  
  2380.     ws("sub main")
  2381.     blank
  2382.     ws("    bVerbose = false")
  2383.     ws("    bKeepOriginalOnes = false")
  2384.     ws("    iFormCount  = 0")
  2385.     ws("    iSuccessCount = 0")
  2386.     ws("    strDestServer = """"")
  2387.     ws("    ParseCommandLine")
  2388.     blank
  2389.  
  2390. end sub
  2391.  
  2392. '
  2393. ' CleanUp script for cloning forms
  2394. '
  2395. sub FormCleanUp
  2396.     
  2397.     ws("end sub")
  2398.     
  2399.     '                       
  2400.     ' Append the subroutine "AddForm"
  2401.     '
  2402.     ScriptAddForm
  2403.  
  2404.     '
  2405.     ' Append the subroutine "DeleteForm"
  2406.     '
  2407.     ScriptDeleteForm
  2408.  
  2409.     '
  2410.     ' Append the commandline parsing script
  2411.     '
  2412.     ParseCommandLineScript
  2413.  
  2414.     '
  2415.     ' Append the Usage script
  2416.     '
  2417.     FormUsageScript
  2418.  
  2419.     '
  2420.     ' Append the output macro
  2421.     '
  2422.     EchoLineScript
  2423.  
  2424. end sub
  2425.  
  2426. '
  2427. ' Abstract for the form cloning script
  2428. '
  2429. sub FormAbstractScript
  2430.  
  2431.     ws("' Abstract:")
  2432.     ws("'")
  2433.     ws("' " & strScriptName & " - Form cloning script for Windows 2000")
  2434.     ws("'")
  2435.     oScript.WriteLine(kLongLineStr)
  2436.  
  2437. end sub
  2438.  
  2439. '
  2440. ' The Usage script used in the form cloning script
  2441. '
  2442. sub FormUsageScript
  2443.  
  2444.     blank
  2445.     ws("'")
  2446.     ws("' Display command usage.")
  2447.     ws("'")
  2448.     ws("sub Usage(ByVal bExit)")
  2449.     blank
  2450.  
  2451.     ws("    EchoLine kNormal, ""Usage: " & strScriptName & " [-c Destination_Server] [-kv]"" ")
  2452.     ws("    EchoLine kNormal, ""Arguments:"" ")
  2453.     ws("    EchoLine kNormal, ""    -c   - destination server name"" ")
  2454.     ws("    EchoLine kNormal, ""    -k   - keep the existing form that has the same name"" ")
  2455.     ws("    EchoLine kNormal, ""           (WARNING: If this flag is set, the cloned server may not be identical to the original one."" ")
  2456.     ws("    EchoLine kNormal, ""    -v   - verbose mode"" ")
  2457.     ws("    EchoLine kNormal, ""    -?   - display command usage"" ")
  2458.     ws("    EchoLine kNormal, """" ")
  2459.     ws("    EchoLine kNormal, ""Examples:"" ")
  2460.     ws("    EchoLine kNormal, ""    " & strScriptName & """ ") 
  2461.     blank
  2462.  
  2463.     ws("    if bExit then")
  2464.     ws("        wscript.quit(1)")
  2465.     ws("    end if")
  2466.     blank
  2467.  
  2468.     ws("end sub")
  2469.     blank
  2470.  
  2471. end sub
  2472.  
  2473.  
  2474. '------------------------------------------------------------------------
  2475. '      Common scripts for the new generated cloning script
  2476. '------------------------------------------------------------------------
  2477.  
  2478. '
  2479. ' Copyright header in the script
  2480. '
  2481. sub CopyrightScript()
  2482.  
  2483.     oScript.WriteLine(kLongLineStr)
  2484.     ws("'")
  2485.     ws("' Copyright (c) Microsoft Corporation 1999")
  2486.     ws("' All Rights Reserved")
  2487.     ws("'")
  2488.  
  2489. end sub
  2490.  
  2491. '
  2492. ' The command line parsing script used in the generated cloning script
  2493. '
  2494. sub ParseCommandLineScript()
  2495.     
  2496.     blank
  2497.     ws("'")
  2498.     ws("' Command line parsing")
  2499.     ws("'")
  2500.     blank
  2501.  
  2502.     ws("sub ParseCommandLine()")
  2503.     blank
  2504.  
  2505.     ws("    dim oArgs")
  2506.     ws("    dim i")
  2507.     blank
  2508.  
  2509.     ws("    set oArgs = wscript.Arguments")
  2510.     blank
  2511.  
  2512.     ws("    while i < oArgs.Count")
  2513.     blank
  2514.  
  2515.     ws("       select case oArgs(i)")
  2516.     blank
  2517.  
  2518.     ws("           case ""-c"" ")
  2519.     ws("              i = i + 1")
  2520.     ws("              strDestServer = oArgs(i)")
  2521.     blank
  2522.  
  2523.     ws("           case ""-k"" ")
  2524.     ws("              bKeepOriginalOnes = true")
  2525.     blank
  2526.  
  2527.     ws("           case ""-v"" ")
  2528.     ws("              bVerbose = true")
  2529.     blank
  2530.  
  2531.     ws("           case ""-?"" ")
  2532.     ws("              Usage(true)")
  2533.     ws("              exit sub")
  2534.     blank
  2535.  
  2536.     ws("           case else")
  2537.     ws("              Usage(true)")
  2538.     ws("              exit sub")
  2539.     blank
  2540.  
  2541.     ws("         end select")
  2542.     blank
  2543.  
  2544.     ws("       i = i + 1")
  2545.     blank
  2546.  
  2547.     ws("     wend")
  2548.     blank
  2549.  
  2550.     ws("end sub")
  2551.     blank
  2552.  
  2553. end sub
  2554.  
  2555. '
  2556. ' Script for converting a bool to a string
  2557. '
  2558. sub BoolStrScript
  2559.  
  2560.     ws("'")
  2561.     ws("' Transform a bool value to a string")
  2562.     ws("'")
  2563.     ws("function BoolStr(ByVal bValue)")
  2564.     blank
  2565.     ws("  if bValue then")
  2566.     blank
  2567.     ws("      BoolStr = " & kTrueStr)
  2568.     blank
  2569.     ws("  else")
  2570.     blank
  2571.     ws("      BoolStr = " & kFalseStr)
  2572.     blank
  2573.     ws("  end if ")
  2574.     blank
  2575.     ws("end function")
  2576.     blank
  2577.  
  2578. end sub
  2579.  
  2580. '
  2581. ' Writing the script for debug output function
  2582. '
  2583. sub EchoLineScript
  2584.  
  2585.     ws("'")
  2586.     ws("' Print debug message according to the verbose level")
  2587.     ws("'")
  2588.     ws("sub EchoLine(ByVal Level, ByVal strALine)")
  2589.     blank
  2590.     ws("  if Level <> kVerbose or bVerbose = true then")
  2591.     blank
  2592.     ws("      wscript.echo strALine")
  2593.     blank
  2594.     ws("  end if ")
  2595.     blank
  2596.     ws("end sub")
  2597.     blank
  2598.  
  2599. end sub
  2600.  
  2601. '
  2602. ' The function returns the name of the local machine
  2603. '
  2604. function strGetLocalMachineName() 
  2605.  
  2606.     dim WSHShell
  2607.     dim WSHSysEnv
  2608.  
  2609.     set WSHShell = WScript.CreateObject("Wscript.Shell")
  2610.     set WSHSysEnv = WSHShell.Environment("Process")
  2611.     strGetLocalMachineName = WSHSysEnv("COMPUTERNAME")
  2612.  
  2613. end function
  2614.  
  2615. '
  2616. ' Function to determine is a printer is local
  2617. '
  2618. function bIsLocal(ByVal strServerName, ByVal strPrinterName) 
  2619.  
  2620.     on error resume next
  2621.  
  2622.     dim bRet
  2623.  
  2624.     dim oPrinter
  2625.     dim oMaster
  2626.  
  2627.     if strServerName <> "" then
  2628.  
  2629.         bIsLocal = true
  2630.  
  2631.         exit function 
  2632.  
  2633.     end if
  2634.  
  2635.     set oMaster = CreateObject("PrintMaster.PrintMaster.1")           
  2636.     set oPrinter = CreateObject("Printer.Printer.1")
  2637.   
  2638.     oMaster.PrinterGet strServerName, strPrinterName, oPrinter
  2639.  
  2640.     if Err = 0 then
  2641.     
  2642.         if  ( oPrinter.Attributes and kPrinterLocal)   = kPrinterLocal  and  _
  2643.             ( oPrinter.Attributes and kPrinterNetwork) = 0              then 
  2644.  
  2645.            '
  2646.            ' It is a local printer
  2647.            '
  2648.            bRet = true
  2649.  
  2650.         else
  2651.  
  2652.            '
  2653.            ' It is not local
  2654.            '
  2655.            bRet = false
  2656.  
  2657.         end if
  2658.  
  2659.     else
  2660.     
  2661.         '
  2662.         ' Error getting printer configuration, then assume it is local and try installing it 
  2663.         '
  2664.         wscript.echo "Error: Get printer configuration for printer """ & strPrinterName & """" _
  2665.                      & " on server """ & strServerName & """"
  2666.         wscript.echo "Error: 0x" & Hex(Err.Number) 
  2667.         if Err.Description <> "" then
  2668.             wscript.echo "Error description: " & Err.Description
  2669.         end if
  2670.  
  2671.         Err.Clear
  2672.  
  2673.         bRet = true 
  2674.  
  2675.     end if
  2676.  
  2677.     bIsLocal = bRet
  2678.  
  2679. end function 
  2680.  
  2681. '
  2682. ' Function to remove the ServerName prefix in the printer name 
  2683. '
  2684. function Strip(ByVal strOriginalPrinterName)
  2685.  
  2686.    dim strReturnPrinterName
  2687.    strReturnPrinterName=strOriginalPrinterName
  2688.  
  2689.    dim regEx                         
  2690.    set regEx = New RegExp            
  2691.    regEx.Pattern =  "^\\\\[^\\]*\\"  
  2692.    regEx.IgnoreCase = true           
  2693.  
  2694.    '
  2695.    ' Remove the ServerName prefix by replacing  "\\*\" with ""
  2696.    '
  2697.    strReturnPrinterName=regEx.Replace(strReturnPrinterName, "")   
  2698.  
  2699.    Strip=strReturnPrinterName
  2700.  
  2701. end function
  2702.  
  2703. '
  2704. ' Function to remove the "\\" in front of the ServerName 
  2705. '
  2706. function strGetNameStringOnly(ByVal strPrefixServerName)
  2707.  
  2708.    dim strReturn
  2709.    strReturn=strPrefixServerName
  2710.  
  2711.    dim regEx   
  2712.    set regEx = New RegExp    
  2713.    regEx.Pattern =  "^\\\\"  
  2714.    regEx.IgnoreCase = true   
  2715.  
  2716.    '
  2717.    ' Remove of "\\" 
  2718.    '
  2719.    strReturn=regEx.Replace(strReturn, "")   
  2720.  
  2721.    strGetNameStringOnly=strReturn
  2722.  
  2723. end function
  2724.  
  2725. '
  2726. ' Function to change single " in the string to be double "s
  2727. '
  2728. function StuffQuote(ByVal strInput)
  2729.  
  2730.   Dim iIndex
  2731.   Dim strOutput
  2732.   strOutput = ""
  2733.  
  2734.   for iIndex = 1 to len(strInput)
  2735.  
  2736.     if mid(strInput, iIndex, 1) <> """" then
  2737.         
  2738.         ' This char is not a "
  2739.  
  2740.         strOutput = strOutput & mid(strInput, iIndex, 1)
  2741.  
  2742.     else
  2743.  
  2744.         ' It is a ", change it to be two "s
  2745.  
  2746.         strOutput = strOutput & """"""  
  2747.  
  2748.     end if
  2749.  
  2750.   next
  2751.  
  2752.   StuffQuote = strOutput
  2753.  
  2754. end function
  2755.  
  2756.  
  2757. '------------------------------------------------------------------------
  2758. '      Helper functions for this program itself
  2759. '------------------------------------------------------------------------
  2760.  
  2761. '
  2762. ' Transform a bool value to a string
  2763. '
  2764. function BoolStr(ByVal bValue)
  2765.  
  2766.   if bValue then
  2767.     
  2768.     BoolStr = kTrueStr
  2769.  
  2770.   else
  2771.   
  2772.     BoolStr = kFalseStr
  2773.  
  2774.   end if 
  2775.  
  2776. end function
  2777.  
  2778. '
  2779. ' Parse the command line into it's components
  2780. '
  2781. sub ParseCommandLine()
  2782.  
  2783.     dim oArgs
  2784.     dim i
  2785.  
  2786.     iAction = kActionUnknown
  2787.  
  2788.     set oArgs = wscript.Arguments
  2789.  
  2790.     if oArgs.Count = 0 then
  2791.         Usage(true)
  2792.         exit sub
  2793.     end if
  2794.  
  2795.     while i < oArgs.Count
  2796.  
  2797.         select case oArgs(i)
  2798.  
  2799.             case "-d"
  2800.                 iAction = kActionDrivers
  2801.  
  2802.             case "-o"
  2803.                 iAction = kActionPorts
  2804.  
  2805.             case "-p"
  2806.                 iAction = kActionPrinters
  2807.                
  2808.             case "-f"
  2809.                 iAction = kActionForms
  2810.  
  2811.             case "-a"
  2812.                 iAction = kActionAll
  2813.  
  2814.             case "-c"
  2815.                 i = i + 1
  2816.                 strServerName = oArgs(i)
  2817.  
  2818.             case "-?"
  2819.                 Usage(true)
  2820.                 exit sub
  2821.  
  2822.             case else
  2823.                 Usage(true)
  2824.                 exit sub
  2825.  
  2826.         end select
  2827.  
  2828.         i = i + 1
  2829.  
  2830.     wend
  2831.  
  2832. end sub
  2833.  
  2834. '
  2835. ' Display command usage.
  2836. '
  2837. sub Usage(ByVal bExit)
  2838.  
  2839.     wscript.echo "Usage: clone [-dopfa?] [-c server-name]"
  2840.     wscript.echo "Arguments:"
  2841.     wscript.echo "-d     - generate script for cloning the drivers"
  2842.     wscript.echo "-o     - generate script for cloning the ports"
  2843.     wscript.echo "-p     - generate script for cloning the printers"
  2844.     wscript.echo "-f     - generate script for cloning the forms"
  2845.     wscript.echo "-a     - generate script for cloning the drivers, ports, printers and forms"
  2846.     wscript.echo "-c     - source server name, default for local machine"
  2847.     wscript.echo "-?     - display command usage"
  2848.     wscript.echo ""
  2849.     wscript.echo "Examples:"
  2850.     wscript.echo "clone -d"
  2851.     wscript.echo "clone -o -c \\server"
  2852.     wscript.echo "clone -p -c \\server" 
  2853.     wscript.echo "clone -f" 
  2854.     wscript.echo "clone -a"
  2855.  
  2856.     if bExit then
  2857.         wscript.quit(1)
  2858.     end if
  2859.  
  2860. end sub
  2861.  
  2862. '
  2863. ' Function determining if the port name matches the pattern
  2864. '
  2865. function bFindPortPattern(strPattern, strString)
  2866.     
  2867.     dim RegEx                           
  2868.     set RegEx = New RegExp              
  2869.     RegEx.Pattern = strPattern          
  2870.     RegEx.IgnoreCase = true             
  2871.     bFindPortPattern = RegEx.Test(strString)    
  2872.  
  2873. end function
  2874.  
  2875. '
  2876. ' Macro for writing a line in the script
  2877. '
  2878. sub ws(ByVal strALine)
  2879.  
  2880.    oScript.WriteLine(strALine)       
  2881.  
  2882. end sub
  2883.  
  2884. sub blank()
  2885.  
  2886.    ws("")       
  2887.  
  2888. end sub
  2889.  
  2890. '-------  End of Cloning scripts
  2891.  
  2892. '
  2893. '------------------------------------------------------------------------
  2894. '      Shell Installing script  (use for launching the cloning scripts)
  2895. '------------------------------------------------------------------------
  2896. '
  2897.  
  2898. sub InstallScript(ByVal strScriptName, ByVal strPrefixServerName)
  2899.  
  2900.     wscript.echo
  2901.     wscript.echo "Creating the installing script..."
  2902.  
  2903.     '
  2904.     ' Open the script file
  2905.     '
  2906.     set oScript = oFileSystem.CreateTextFile(strScriptName,TRUE)
  2907.  
  2908.     '
  2909.     ' Start creating the shell script
  2910.     '
  2911.     ws("@rem Abstract:")
  2912.     ws("@rem")
  2913.     ws("@rem " & strScriptName & " - shell script for installing all the server components")
  2914.     ws("@rem")
  2915.     blank
  2916.  
  2917.     ws("@echo off")
  2918.     blank
  2919.  
  2920.     ws("if ""%1"" == ""-?"" goto Usage")
  2921.     ws("if ""%1"" == ""/?"" goto Usage")
  2922.     blank
  2923.  
  2924.     dim strParameters 
  2925.     strParameters = " %1 %2 %3 %4 "
  2926.  
  2927.     ws("cscript " & strPrefixServerName & kDriverScript   & strParameters)
  2928.     ws("cscript " & strPrefixServerName & kPortScript     & strParameters)
  2929.     ws("cscript " & strPrefixServerName & kPrinterScript  & strParameters)
  2930.     ws("cscript " & strPrefixServerName & kFormScript     & strParameters)
  2931.     blank
  2932.  
  2933.     ws("goto End")
  2934.     blank
  2935.  
  2936.     ws(":Usage")
  2937.     blank
  2938.  
  2939.     InstallUsageScript
  2940.  
  2941.     ws(":End")
  2942.  
  2943.     '
  2944.     ' Close the script file
  2945.     '
  2946.     oScript.Close
  2947.  
  2948.     wscript.echo "The script file for installing all server components is """ & strScriptName & """."
  2949.  
  2950. end sub
  2951.  
  2952. '
  2953. ' The Usage script used in the install script
  2954. '
  2955. sub InstallUsageScript
  2956.  
  2957.     ws("    echo Usage: " & strScriptName & " [-kv?] [-c server-name]")
  2958.     ws("    echo Arguments: ")
  2959.     ws("    echo -k     - keep the existing component with the same name") 
  2960.     ws("    echo -v     - verbose mode")
  2961.     ws("    echo -c     - destination server name")
  2962.     ws("    echo -?     - display command usage")
  2963.     ws("    echo.")
  2964.     ws("    echo Examples: ")
  2965.     ws("    echo    " & strScriptName )
  2966.     ws("    echo    " & strScriptName & " -v ")
  2967.     ws("    echo    " & strScriptName & " -c \\server ") 
  2968.     ws("    echo    " & strScriptName & " -v -c \\server ") 
  2969.     ws("    echo    " & strScriptName & " -k -v -c \\server ")
  2970.     ws("    echo    " & strScriptName & " -? ")
  2971.     blank
  2972.  
  2973. end sub
  2974.  
  2975. '
  2976. ' Determines which program is used to run this script. 
  2977. ' Returns true if the script host is cscript.exe
  2978. '
  2979. function IsHostCscript()
  2980.  
  2981.     on error resume next
  2982.     
  2983.     dim strFullName 
  2984.     dim strCommand 
  2985.     dim i, j 
  2986.     dim bReturn
  2987.     
  2988.     bReturn = false
  2989.     
  2990.     strFullName = WScript.FullName
  2991.     
  2992.     i = InStr(1, strFullName, ".exe", 1)
  2993.     
  2994.     if i <> 0 then
  2995.         
  2996.         j = InStrRev(strFullName, "\", i, 1)
  2997.         
  2998.         if j <> 0 then
  2999.             
  3000.             strCommand = Mid(strFullName, j+1, i-j-1)
  3001.             
  3002.             if LCase(strCommand) = "cscript" then
  3003.             
  3004.                 bReturn = true  
  3005.             
  3006.             end if    
  3007.                 
  3008.         end if
  3009.         
  3010.     end if
  3011.     
  3012.     if Err <> 0 then
  3013.     
  3014.         call wscript.echo("Error 0x" & hex(Err.Number) & " occurred. " & Err.Description _
  3015.                           & ". " & vbCRLF & "The scripting host could not be determined.")       
  3016.         
  3017.     end if
  3018.     
  3019.     IsHostCscript = bReturn
  3020.  
  3021. end function
  3022.  
  3023. '
  3024. ' Converts a driver environment string to a string 
  3025. ' representing the architecture of the driver. 
  3026. '
  3027. function GetArchitecture(strEnvironment)
  3028.                            
  3029.     dim strArchitecture
  3030.     
  3031.     if strEnvironment = kEnvironmentIntel then
  3032.         strArchitecture = kArchIntel
  3033.     elseif strEnvironment = kEnvironmentMIPS then
  3034.         strArchitecture = kArchMIPS
  3035.     elseif strEnvironment = kEnvironmentAlpha then
  3036.         strArchitecture = kArchAlpha
  3037.     elseif strEnvironment = kEnvironmentPowerPC then
  3038.         strArchitecture = kArchPowerPC
  3039.     elseif strEnvironment = kEnvironmentWindows then 
  3040.         strArchitecture = kArchIntel
  3041.     else 
  3042.         strArchitecture = kArchUnknown
  3043.     end if    
  3044.     
  3045.     GetArchitecture = strArchitecture
  3046.     
  3047. end function
  3048.  
  3049. '
  3050. ' Converts a driver environment string and a number to 
  3051. ' a string representing the driver version
  3052. '
  3053. function GetVersion(uVersion, strEnvironment)
  3054.  
  3055.     dim strVersion
  3056.  
  3057.     select case uVersion
  3058.     case 0:
  3059.         if strEnvironment = kEnvironmentWindows then
  3060.             strVersion = kVersionWindows95
  3061.         else 
  3062.             strVersion = kVersionNT31
  3063.             
  3064.         end if    
  3065.         
  3066.     case 1:
  3067.         if strEnvironment = kEnvironmentPowerPC then
  3068.             strVersion = kVersion351
  3069.         else
  3070.             strVersion = kVersion35x
  3071.         end if    
  3072.         
  3073.     case 2:
  3074.         if strEnvironment = kEnvironmentPowerPC or _
  3075.            strEnvironment = kEnvironmentMIPS    or _
  3076.            strEnvironment = kEnvironmentAlpha   then
  3077.             strVersion = kVersion40
  3078.         else
  3079.             strVersion = kVersion4050
  3080.         end if
  3081.  
  3082.     case 3:
  3083.         strVersion = kVersion50
  3084.         
  3085.     case else:
  3086.         strVersion = kArchUnknown
  3087.         
  3088.     end select    
  3089.     
  3090.     GetVersion = strVersion
  3091.     
  3092. end function
  3093.