home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 May / W2KPRK.iso / ras.cab / enumclasses.vbs < prev    next >
Text File  |  1999-11-04  |  25KB  |  705 lines

  1. '********************************************************************
  2. '*
  3. '* File:           EnumClasses.VBS 
  4. '* Created:        March 1999
  5. '* Version:        1.0
  6. '*
  7. '*  Main Function:  Enumerates WBEM classes within a namespace on a server.
  8. '*
  9. '*  EnumClasses.vbs [/N namespace] [C class] [/R]
  10. '*                  [/S <server>] [/U <username>]
  11. '*                  [/W <password>][/O <outputfile>]
  12. '*
  13. '* Copyright (C) 1999 Microsoft Corporation
  14. '*
  15. '********************************************************************
  16. OPTION EXPLICIT
  17.  
  18.     'Define constants
  19.     CONST CONST_ERROR                   = 0
  20.     CONST CONST_WSCRIPT                 = 1
  21.     CONST CONST_CSCRIPT                 = 2
  22.     CONST CONST_SHOW_USAGE              = 3
  23.     CONST CONST_PROCEED                 = 4
  24.  
  25.     'Declare variables
  26.     Dim intOpMode, i
  27.     Dim strServer, strUserName, strPassword, strOutputFile
  28.     Dim strNameSpace, strClass
  29.     Dim blnRecursive
  30.  
  31.     'Make sure the host is csript, if not then abort
  32.     VerifyHostIsCscript()
  33.  
  34.     'Parse the command line
  35.     intOpMode = intParseCmdLine(strServer     ,  _
  36.                                 strUserName   ,  _
  37.                                 strPassword   ,  _
  38.                                 strOutputFile ,  _
  39.                                 strNameSpace  ,  _
  40.                                 strClass      ,  _
  41.                                 blnRecursive     )
  42.  
  43.  
  44.     Select Case intOpMode
  45.  
  46.         Case CONST_SHOW_USAGE
  47.             Call ShowUsage()
  48.  
  49.         Case CONST_PROCEED                 
  50.             Call EnumClasses(strServer     ,  _
  51.                              strUserName   ,  _
  52.                              strPassword   ,  _
  53.                              strOutputFile ,  _
  54.                              strNameSpace  ,  _
  55.                              strClass      ,  _
  56.                              blnRecursive     )
  57.  
  58.         Case CONST_ERROR
  59.             'Do Nothing
  60.  
  61.         Case Else                    'Default -- should never happen
  62.             Call Wscript.Echo("Error occurred in passing parameters.")
  63.  
  64.     End Select
  65.  
  66. '********************************************************************
  67. '* End of Script
  68. '********************************************************************
  69.  
  70. '********************************************************************
  71. '*
  72. '* Sub EnumClasses()
  73. '* Purpose: Enumerates WBEM classes on a server.
  74. '* Input:   strServer       a machine name
  75. '*          strUserName     the current user's name
  76. '*          strPassword     the current user's password
  77. '*          strOutputFile   an output file name
  78. '*          strNameSpace    a namespace
  79. '*          strClass        a class name
  80. '*          blnRecursive    specifies a recursive enumeration
  81. '* Output:  Results of the search are either printed on screen or
  82. '*          saved in strOutputFile.
  83. '*
  84. '********************************************************************
  85.  
  86. Private Sub EnumClasses(strServer     ,  _
  87.                         strUserName   ,  _
  88.                         strPassword   ,  _
  89.                         strOutputFile ,  _
  90.                         strNameSpace  ,  _
  91.                         strClass      ,  _
  92.                         blnRecursive     )
  93.  
  94.     ON ERROR RESUME NEXT
  95.  
  96.     Dim objFileSystem, objOutputFile, objService, objClass
  97.  
  98.     'Open a text file for output if the file is requested
  99.     If Not IsEmpty(strOutputFile) Then
  100.         If (NOT blnOpenFile(strOutputFile, objOutputFile)) Then
  101.             Call Wscript.Echo ("Could not open an output file.")
  102.             Exit Sub
  103.         End If
  104.     End If
  105.  
  106.  
  107.     'Establish a connection with the server.
  108.     If IsNull(strNameSpace) then
  109.         If blnConnect("Root\cimv2" , _
  110.                        strUserName , _
  111.                        strPassword , _
  112.                        strServer   , _
  113.                        objService  ) Then
  114.             Call Wscript.Echo("")
  115.             Call Wscript.Echo("Please check the server name, " _
  116.                             & "credentials and WBEM Core.")
  117.             Exit Sub
  118.         End If
  119.     Else
  120.         If blnConnect(strNameSpace , _
  121.                        strUserName , _
  122.                        strPassword , _
  123.                        strServer   , _
  124.                        objService  ) Then
  125.             Call Wscript.Echo("")
  126.             Call Wscript.Echo("Please check the server name, " _
  127.                             & "credentials, WBEM Core and Valid Name Space.")
  128.             Exit Sub
  129.         End If
  130.     End If
  131.  
  132.     Call WriteLine("Classes for " & strClass & " on machine " & strServer & ":", objOutputFile)
  133.     Call WriteLine("", objOutputFile)
  134.  
  135.     Call EnumClassRecursive(objService, strClass, 0, objOutputFile, _
  136.                             blnRecursive)
  137.  
  138.     If IsObject(objOutputFile) Then
  139.         objOutputFile.Close
  140.         Call Wscript.Echo ("Results are saved in file " & strOutputFile & ".")
  141.     End If
  142.  
  143. End Sub
  144.  
  145. '********************************************************************
  146. '*
  147. '* Sub EnumClassRecursive()
  148. '* Purpose: Recursively queries subclasses of a class.
  149. '* Input:   objService      the service object
  150. '*          strClass        the name of a class
  151. '*          intLevel        the level of then recursion
  152. '*          objOutputFile   an output file object
  153. '*          blnRecursive    specifies a recursive enumeration
  154. '* Output:  Results of the query are either printed on screen or 
  155. '*          saved in objOutputFile.
  156. '*
  157. '********************************************************************
  158.  
  159. Private Sub EnumClassRecursive(objService, ByVal strClass, intLevel, _
  160.     objOutputFile, blnRecursive)
  161.  
  162.     ON ERROR RESUME NEXT
  163.  
  164.     Dim objClass, strMessage
  165.  
  166.     For Each objClass in objService.SubclassesOf(strClass, 1)
  167.         strMessage = objClass.Path_.Class
  168.         WriteLine Space(6*intLevel) & strMessage, objOutputFile
  169.         If Err.Number Then
  170.             'The can be caused by a wrong class name.
  171.             Print "Class " & strClass & " does not exist."
  172.             Err.Clear
  173.             Exit Sub
  174.         End If
  175.         If blnRecursive Then
  176.             Call EnumClassRecursive(objService, strMessage, intLevel+1, _
  177.                  objOutputFile, blnRecursive)
  178.         End If
  179.     Next
  180.  
  181. End Sub
  182.  
  183. '********************************************************************
  184. '*
  185. '* Function intParseCmdLine()
  186. '*
  187. '* Purpose: Parses the command line.
  188. '* Input:   
  189. '*
  190. '* Output:  strServer         a remote server ("" = local server")
  191. '*          strUserName       the current user's name
  192. '*          strPassword       the current user's password
  193. '*          strOutputFile     an output file name
  194. '*          strNameSpace      a namespace
  195. '*          strClass          a class name
  196. '*          blnRecursive      specifies a recursive enumeration
  197.  
  198. '*
  199. '********************************************************************
  200. Private Function intParseCmdLine( ByRef strServer     ,  _
  201.                                   ByRef strUserName   ,  _
  202.                                   ByRef strPassword   ,  _
  203.                                   ByRef strOutputFile ,  _
  204.                                   ByRef strNameSpace  ,  _
  205.                                   ByRef strClass      ,  _
  206.                                   ByRef blnRecursive     )
  207.  
  208.  
  209.     ON ERROR RESUME NEXT
  210.  
  211.     Dim strFlag
  212.     Dim intState, intArgIter
  213.     Dim objFileSystem
  214.  
  215.     If Wscript.Arguments.Count > 0 Then
  216.         strFlag = Wscript.arguments.Item(0)
  217.     End If
  218.  
  219.     If IsEmpty(strFlag) Then                'No arguments have been received
  220.         intParseCmdLine = CONST_PROCEED
  221.         Exit Function
  222.     End If
  223.  
  224.     'Check if the user is asking for help or is just confused
  225.     If (strFlag="help") OR (strFlag="/h") OR (strFlag="\h") OR (strFlag="-h") _
  226.         OR (strFlag = "\?") OR (strFlag = "/?") OR (strFlag = "?") _ 
  227.         OR (strFlag="h") Then
  228.         intParseCmdLine = CONST_SHOW_USAGE
  229.         Exit Function
  230.     End If
  231.  
  232.     'Retrieve the command line and set appropriate variables
  233.      intArgIter = 0
  234.     Do While intArgIter <= Wscript.arguments.Count - 1
  235.         Select Case Left(LCase(Wscript.arguments.Item(intArgIter)),2)
  236.   
  237.             Case "/s"
  238.                 If Not blnGetArg("Server", strServer, intArgIter) Then
  239.                     intParseCmdLine = CONST_ERROR
  240.                     Exit Function
  241.                 End If
  242.                 intArgIter = intArgIter + 1
  243.  
  244.             Case "/o"
  245.                 If Not blnGetArg("Output File", strOutputFile, intArgIter) Then
  246.                     intParseCmdLine = CONST_ERROR
  247.                     Exit Function
  248.                 End If
  249.                 intArgIter = intArgIter + 1
  250.  
  251.             Case "/u"
  252.                 If Not blnGetArg("User Name", strUserName, intArgIter) Then
  253.                     intParseCmdLine = CONST_ERROR
  254.                     Exit Function
  255.                 End If
  256.                 intArgIter = intArgIter + 1
  257.  
  258.             Case "/w"
  259.                 If Not blnGetArg("User Password", strPassword, intArgIter) Then
  260.                     intParseCmdLine = CONST_ERROR
  261.                     Exit Function
  262.                 End If
  263.                 intArgIter = intArgIter + 1
  264.  
  265.             Case "/n"
  266.                 If Not blnGetArg("Name Space", strNameSpace, intArgIter) Then
  267.                     intParseCmdLine = CONST_ERROR
  268.                     Exit Function
  269.                 End If
  270.                 intArgIter = intArgIter + 1
  271.  
  272.             Case "/c"
  273.                 If Not blnGetArg("Class", strClass, intArgIter) Then
  274.                     intParseCmdLine = CONST_ERROR
  275.                     Exit Function
  276.                 End If
  277.                 intArgIter = intArgIter + 1
  278.  
  279.             Case "/r"
  280.                 blnRecursive = True
  281.                 intArgIter = intArgIter + 1
  282.  
  283.             Case Else 'We shouldn't get here
  284.                 Call Wscript.Echo("Invalid or misplaced parameter: " _
  285.                    & Wscript.arguments.Item(intArgIter) & vbCRLF _
  286.                    & "Please check the input and try again," & vbCRLF _
  287.                    & "or invoke with '/?' for help with the syntax.")
  288.                 Wscript.Quit
  289.  
  290.         End Select
  291.  
  292.     Loop '** intArgIter <= Wscript.arguments.Count - 1
  293.  
  294.     If IsEmpty(intParseCmdLine) Then _
  295.         intParseCmdLine = CONST_PROCEED
  296.  
  297. End Function
  298.  
  299. '********************************************************************
  300. '*
  301. '* Sub ShowUsage()
  302. '*
  303. '* Purpose: Shows the correct usage to the user.
  304. '*
  305. '* Input:   None
  306. '*
  307. '* Output:  Help messages are displayed on screen.
  308. '*
  309. '********************************************************************
  310. Private Sub ShowUsage()
  311.  
  312.     Wscript.Echo ""
  313.     Wscript.Echo "Enumerates WBEM classes within a namespace on a server."
  314.     Wscript.Echo ""
  315.     Wscript.Echo "SYNTAX:"
  316.     Wscript.Echo "  EnumClasses.vbs [/N namespace] [C class] [/R]"
  317.     Wscript.Echo "                  [/S <server>] [/U <username>]"
  318.     Wscript.Echo "                  [/W <password>][/O <outputfile>]"
  319.     Wscript.Echo ""
  320.     Wscript.Echo "PARAMETER SPECIFIERS:"
  321.     Wscript.Echo "   namespace     A namespace string. The default is " _
  322.                & "root\cimv2."
  323.     Wscript.Echo "   class         Name of the parent class."
  324.     Wscript.Echo "   server        A machine name."
  325.     Wscript.Echo "   username      The current user's name."
  326.     Wscript.Echo "   password      Password of the current user."
  327.     Wscript.Echo "   outputfile    The output file name."
  328.     Wscript.Echo "   /R            Enumerates subclasses of all levels. " _
  329.                & "If not specified"
  330.     Wscript.Echo ""
  331.     Wscript.Echo "EXAMPLE:"
  332.     Wscript.Echo "1. cscript EnumClasses.vbs /c __SystemClass"
  333.     Wscript.Echo "     Lists all subclasses of __SystemClass within root\cimv2."
  334.     Wscript.Echo "2. cscript EnumClasses.vbs /c __SystemClass /s MyMachine2"
  335.     Wscript.Echo "     Lists all subclasses of __SystemClass for " _
  336.                & "the machine MyMachine2."
  337.  
  338. End Sub
  339.  
  340. '********************************************************************
  341. '* General Routines
  342. '********************************************************************
  343.  
  344. '********************************************************************
  345. '*
  346. '* Function strPackString()
  347. '*
  348. '* Purpose: Attaches spaces to a string to increase the length to intWidth.
  349. '*
  350. '* Input:   strString   a string
  351. '*          intWidth    the intended length of the string
  352. '*          blnAfter    Should spaces be added after the string?
  353. '*          blnTruncate specifies whether to truncate the string or not if
  354. '*                      the string length is longer than intWidth
  355. '*
  356. '* Output:  strPackString is returned as the packed string.
  357. '*
  358. '********************************************************************
  359. Private Function strPackString( ByVal strString, _
  360.                                 ByVal intWidth,  _
  361.                                 ByVal blnAfter,  _
  362.                                 ByVal blnTruncate)
  363.  
  364.     ON ERROR RESUME NEXT
  365.  
  366.     intWidth      = CInt(intWidth)
  367.     blnAfter      = CBool(blnAfter)
  368.     blnTruncate   = CBool(blnTruncate)
  369.  
  370.     If Err.Number Then
  371.         Call Wscript.Echo ("Argument type is incorrect!")
  372.         Err.Clear
  373.         Wscript.Quit
  374.     End If
  375.  
  376.     If IsNull(strString) Then
  377.         strPackString = "null" & Space(intWidth-4)
  378.         Exit Function
  379.     End If
  380.  
  381.     strString = CStr(strString)
  382.     If Err.Number Then
  383.         Call Wscript.Echo ("Argument type is incorrect!")
  384.         Err.Clear
  385.         Wscript.Quit
  386.     End If
  387.  
  388.     If intWidth > Len(strString) Then
  389.         If blnAfter Then
  390.             strPackString = strString & Space(intWidth-Len(strString))
  391.         Else
  392.             strPackString = Space(intWidth-Len(strString)) & strString & " "
  393.         End If
  394.     Else
  395.         If blnTruncate Then
  396.             strPackString = Left(strString, intWidth-1) & " "
  397.         Else
  398.             strPackString = strString & " "
  399.         End If
  400.     End If
  401.  
  402. End Function
  403.  
  404. '********************************************************************
  405. '* 
  406. '*  Function blnGetArg()
  407. '*
  408. '*  Purpose: Helper to intParseCmdLine()
  409. '* 
  410. '*  Usage:
  411. '*
  412. '*     Case "/s" 
  413. '*       blnGetArg ("server name", strServer, intArgIter)
  414. '*
  415. '********************************************************************
  416. Private Function blnGetArg ( ByVal StrVarName,   _
  417.                              ByRef strVar,       _
  418.                              ByRef intArgIter) 
  419.  
  420.     blnGetArg = False 'failure, changed to True upon successful completion
  421.  
  422.     If Len(Wscript.Arguments(intArgIter)) > 2 then
  423.         If Mid(Wscript.Arguments(intArgIter),3,1) = ":" then
  424.             If Len(Wscript.Arguments(intArgIter)) > 3 then
  425.                 strVar = Right(Wscript.Arguments(intArgIter), _
  426.                          Len(Wscript.Arguments(intArgIter)) - 3)
  427.                 blnGetArg = True
  428.                 Exit Function
  429.             Else
  430.                 intArgIter = intArgIter + 1
  431.                 If intArgIter > (Wscript.Arguments.Count - 1) Then
  432.                     Call Wscript.Echo( "Invalid " & StrVarName & ".")
  433.                     Call Wscript.Echo( "Please check the input and try again.")
  434.                     Exit Function
  435.                 End If
  436.  
  437.                 strVar = Wscript.Arguments.Item(intArgIter)
  438.                 If Err.Number Then
  439.                     Call Wscript.Echo( "Invalid " & StrVarName & ".")
  440.                     Call Wscript.Echo( "Please check the input and try again.")
  441.                     Exit Function
  442.                 End If
  443.  
  444.                 If InStr(strVar, "/") Then
  445.                     Call Wscript.Echo( "Invalid " & StrVarName)
  446.                     Call Wscript.Echo( "Please check the input and try again.")
  447.                     Exit Function
  448.                 End If
  449.  
  450.                 blnGetArg = True 'success
  451.             End If
  452.         Else
  453.             strVar = Right(Wscript.Arguments(intArgIter), _
  454.                      Len(Wscript.Arguments(intArgIter)) - 2)
  455.             blnGetArg = True 'success
  456.             Exit Function
  457.         End If
  458.     Else
  459.         intArgIter = intArgIter + 1
  460.         If intArgIter > (Wscript.Arguments.Count - 1) Then
  461.             Call Wscript.Echo( "Invalid " & StrVarName & ".")
  462.             Call Wscript.Echo( "Please check the input and try again.")
  463.             Exit Function
  464.         End If
  465.  
  466.         strVar = Wscript.Arguments.Item(intArgIter)
  467.         If Err.Number Then
  468.             Call Wscript.Echo( "Invalid " & StrVarName & ".")
  469.             Call Wscript.Echo( "Please check the input and try again.")
  470.             Exit Function
  471.         End If
  472.  
  473.         If InStr(strVar, "/") Then
  474.             Call Wscript.Echo( "Invalid " & StrVarName)
  475.             Call Wscript.Echo( "Please check the input and try again.")
  476.             Exit Function
  477.         End If
  478.         blnGetArg = True 'success
  479.     End If
  480. End Function
  481.  
  482. '********************************************************************
  483. '*
  484. '* Function blnConnect()
  485. '*
  486. '* Purpose: Connects to machine strServer.
  487. '*
  488. '* Input:   strServer       a machine name
  489. '*          strNameSpace    a namespace
  490. '*          strUserName     name of the current user
  491. '*          strPassword     password of the current user
  492. '*
  493. '* Output:  objService is returned  as a service object.
  494. '*          strServer is set to local host if left unspecified
  495. '*
  496. '********************************************************************
  497. Private Function blnConnect(ByVal strNameSpace, _
  498.                             ByVal strUserName,  _
  499.                             ByVal strPassword,  _
  500.                             ByRef strServer,    _
  501.                             ByRef objService)
  502.  
  503.     ON ERROR RESUME NEXT
  504.  
  505.     Dim objLocator, objWshNet
  506.  
  507.     blnConnect = False     'There is no error.
  508.  
  509.     'Create Locator object to connect to remote CIM object manager
  510.     Set objLocator = CreateObject("WbemScripting.SWbemLocator")
  511.     If Err.Number then
  512.         Call Wscript.Echo( "Error 0x" & CStr(Hex(Err.Number)) & _
  513.                            " occurred in creating a locator object." )
  514.         If Err.Description <> "" Then
  515.             Call Wscript.Echo( "Error description: " & Err.Description & "." )
  516.         End If
  517.         Err.Clear
  518.         blnConnect = True     'An error occurred
  519.         Exit Function
  520.     End If
  521.  
  522.     'Connect to the namespace which is either local or remote
  523.     Set objService = objLocator.ConnectServer (strServer, strNameSpace, _
  524.        strUserName, strPassword)
  525.     ObjService.Security_.impersonationlevel = 3
  526.     If Err.Number then
  527.         Call Wscript.Echo( "Error 0x" & CStr(Hex(Err.Number)) & _
  528.                            " occurred in connecting to server " _
  529.            & strServer & ".")
  530.         If Err.Description <> "" Then
  531.             Call Wscript.Echo( "Error description: " & Err.Description & "." )
  532.         End If
  533.         Err.Clear
  534.         blnConnect = True     'An error occurred
  535.     End If
  536.  
  537.     'Get the current server's name if left unspecified
  538.     If IsEmpty(strServer) Then
  539.         Set objWshNet = CreateObject("Wscript.Network")
  540.     strServer     = objWshNet.ComputerName
  541.     End If
  542.  
  543. End Function
  544.  
  545. '********************************************************************
  546. '*
  547. '* Sub      VerifyHostIsCscript()
  548. '*
  549. '* Purpose: Determines which program is used to run this script.
  550. '*
  551. '* Input:   None
  552. '*
  553. '* Output:  If host is not cscript, then an error message is printed 
  554. '*          and the script is aborted.
  555. '*
  556. '********************************************************************
  557. Sub VerifyHostIsCscript()
  558.  
  559.     ON ERROR RESUME NEXT
  560.  
  561.     Dim strFullName, strCommand, i, j, intStatus
  562.  
  563.     strFullName = WScript.FullName
  564.  
  565.     If Err.Number then
  566.         Call Wscript.Echo( "Error 0x" & CStr(Hex(Err.Number)) & " occurred." )
  567.         If Err.Description <> "" Then
  568.             Call Wscript.Echo( "Error description: " & Err.Description & "." )
  569.         End If
  570.         intStatus =  CONST_ERROR
  571.     End If
  572.  
  573.     i = InStr(1, strFullName, ".exe", 1)
  574.     If i = 0 Then
  575.         intStatus =  CONST_ERROR
  576.     Else
  577.         j = InStrRev(strFullName, "\", i, 1)
  578.         If j = 0 Then
  579.             intStatus =  CONST_ERROR
  580.         Else
  581.             strCommand = Mid(strFullName, j+1, i-j-1)
  582.             Select Case LCase(strCommand)
  583.                 Case "cscript"
  584.                     intStatus = CONST_CSCRIPT
  585.                 Case "wscript"
  586.                     intStatus = CONST_WSCRIPT
  587.                 Case Else       'should never happen
  588.                     Call Wscript.Echo( "An unexpected program was used to " _
  589.                                        & "run this script." )
  590.                     Call Wscript.Echo( "Only CScript.Exe or WScript.Exe can " _
  591.                                        & "be used to run this script." )
  592.                     intStatus = CONST_ERROR
  593.                 End Select
  594.         End If
  595.     End If
  596.  
  597.     If intStatus <> CONST_CSCRIPT Then
  598.         Call WScript.Echo( "Please run this script using CScript." & vbCRLF & _
  599.              "This can be achieved by" & vbCRLF & _
  600.              "1. Using ""CScript EnumClasses.vbs arguments"" for Windows 95/98 or" _
  601.              & vbCRLF & "2. Changing the default Windows Scripting Host " _
  602.              & "setting to CScript" & vbCRLF & "    using ""CScript " _
  603.              & "//H:CScript //S"" and running the script using" & vbCRLF & _
  604.              "    ""EnumClasses.vbs arguments"" for Windows NT/2000." )
  605.         WScript.Quit
  606.     End If
  607.  
  608. End Sub
  609.  
  610. '********************************************************************
  611. '*
  612. '* Sub WriteLine()
  613. '* Purpose: Writes a text line either to a file or on screen.
  614. '* Input:   strMessage  the string to print
  615. '*          objFile     an output file object
  616. '* Output:  strMessage is either displayed on screen or written to a file.
  617. '*
  618. '********************************************************************
  619. Sub WriteLine(ByVal strMessage, ByVal objFile)
  620.  
  621.     On Error Resume Next
  622.     If IsObject(objFile) then        'objFile should be a file object
  623.         objFile.WriteLine strMessage
  624.     Else
  625.         Call Wscript.Echo( strMessage )
  626.     End If
  627.  
  628. End Sub
  629.  
  630. '********************************************************************
  631. '* 
  632. '* Function blnErrorOccurred()
  633. '*
  634. '* Purpose: Reports error with a string saying what the error occurred in.
  635. '*
  636. '* Input:   strIn        string saying what the error occurred in.
  637. '*
  638. '* Output:  displayed on screen 
  639. '* 
  640. '********************************************************************
  641. Private Function blnErrorOccurred (ByVal strIn)
  642.  
  643.     If Err.Number Then
  644.         Call Wscript.Echo( "Error 0x" & CStr(Hex(Err.Number)) & ": " & strIn)
  645.         If Err.Description <> "" Then
  646.             Call Wscript.Echo( "Error description: " & Err.Description)
  647.         End If
  648.         Err.Clear
  649.         blnErrorOccurred = True
  650.     Else
  651.         blnErrorOccurred = False
  652.     End If
  653.  
  654. End Function
  655.  
  656. '********************************************************************
  657. '* 
  658. '* Function blnOpenFile
  659. '*
  660. '* Purpose: Opens a file.
  661. '*
  662. '* Input:   strFileName        A string with the name of the file.
  663. '*
  664. '* Output:  Sets objOpenFile to a FileSystemObject and setis it to 
  665. '*            Nothing upon Failure.
  666. '* 
  667. '********************************************************************
  668. Private Function blnOpenFile(ByVal strFileName, ByRef objOpenFile)
  669.  
  670.     ON ERROR RESUME NEXT
  671.  
  672.     Dim objFileSystem
  673.  
  674.     Set objFileSystem = Nothing
  675.  
  676.     If IsEmpty(strFileName) OR strFileName = "" Then
  677.         blnOpenFile = False
  678.         Set objOpenFile = Nothing
  679.         Exit Function
  680.     End If
  681.  
  682.     'Create a file object
  683.     Set objFileSystem = CreateObject("Scripting.FileSystemObject")
  684.     If blnErrorOccurred("Could not create filesystem object.") Then
  685.         blnOpenFile = False
  686.         Set objOpenFile = Nothing
  687.         Exit Function
  688.     End If
  689.  
  690.     'Open the file for output
  691.     Set objOpenFile = objFileSystem.OpenTextFile(strFileName, 8, True)
  692.     If blnErrorOccurred("Could not open") Then
  693.         blnOpenFile = False
  694.         Set objOpenFile = Nothing
  695.         Exit Function
  696.     End If
  697.     blnOpenFile = True
  698.  
  699. End Function
  700.  
  701. '********************************************************************
  702. '*                                                                  *
  703. '*                           End of File                            *
  704. '*                                                                  *
  705. '********************************************************************