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

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