home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 May / W2KPRK.iso / ras.cab / useraccount.vbs < prev   
Text File  |  1999-11-04  |  26KB  |  730 lines

  1. '********************************************************************
  2. '*
  3. '* File:           UserAccount.vbs
  4. '* Created:        April 1999
  5. '* Version:        1.0
  6. '*
  7. '*  Main Function:  Displays User Account Information.
  8. '*
  9. '*      UserAccount.vbs [/D <domain>] [/N <username>] </L> </B>
  10. '*      [/S <server>] [/U <username>] [/W <password>]
  11. '*      [/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 strDomain, strName
  30.     Dim blnQuery, blnLockout, blnDisabled
  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.                                 blnQuery      ,  _
  41.                                 strDomain     ,  _
  42.                                 strName       ,  _
  43.                                 blnLockout    ,  _
  44.                                 blnDisabled      )
  45.  
  46.     Select Case intOpMode
  47.  
  48.         Case CONST_SHOW_USAGE
  49.             Call ShowUsage()
  50.  
  51.         Case CONST_PROCEED                 
  52.             Call UserAccounts(strServer     ,  _
  53.                               strOutputFile ,  _
  54.                               strUserName   ,  _
  55.                               strPassword   ,  _
  56.                               blnQuery      ,  _
  57.                               strDomain     ,  _
  58.                               strName       ,  _
  59.                               blnLockout    ,  _
  60.                               blnDisabled      )
  61.         Case CONST_ERROR
  62.             'Do Nothing
  63.  
  64.         Case Else                    'Default -- should never happen
  65.             Call Wscript.Echo("Error occurred in passing parameters.")
  66.  
  67.     End Select
  68.  
  69. '********************************************************************
  70. '* End of Script
  71. '********************************************************************
  72.  
  73. '********************************************************************
  74. '*
  75. '* Sub UserAccounts()
  76. '*
  77. '* Purpose: Displays User Account Information.
  78. '*
  79. '* Input:   strServer           a machine name
  80. '*          strOutputFile       an output file name
  81. '*          strUserName         the current user's name
  82. '*          strPassword         the current user's password
  83. '*
  84. '* Output:  Results are either printed on screen or saved in strOutputFile.
  85. '*
  86. '********************************************************************
  87. Private Sub UserAccounts(strServer     ,  _
  88.                          strOutputFile ,  _
  89.                          strUserName   ,  _
  90.                          strPassword   ,  _
  91.                          blnQuery      ,  _
  92.                          strDomain     ,  _
  93.                          strName       ,  _
  94.                          blnLockout    ,  _
  95.                          blnDisabled      )
  96.  
  97.     ON ERROR RESUME NEXT
  98.  
  99.     Dim objFileSystem, objOutputFile, objService, objSet, obj
  100.     Dim strWBEMClass
  101.     Dim strLine, strSep, strQuery
  102.     Dim H
  103.     Dim strQueryArray(4)
  104.  
  105.     'Open a text file for output if the file is requested
  106.     If Not IsEmpty(strOutputFile) Then
  107.         If (NOT blnOpenFile(strOutputFile, objOutputFile)) Then
  108.             Call Wscript.Echo ("Could not open an output file.")
  109.             Exit Sub
  110.         End If
  111.     End If
  112.  
  113.     'Establish a connection with the server.
  114.     If blnConnect("root\cimv2" , _
  115.                    strUserName , _
  116.                    strPassword , _
  117.                    strServer   , _
  118.                    objService  ) Then
  119.         Call Wscript.Echo("")
  120.         Call Wscript.Echo("Please check the server name, " _
  121.                         & "credentials and WBEM Core.")
  122.         Exit Sub
  123.     End If
  124.  
  125.     strWBEMClass = "Win32_UserAccount"
  126.   
  127.     'Get the first instance
  128.     If blnQuery = true  then
  129.  
  130.         I = 1
  131.         If strDomain <> "" then
  132.             strQueryArray(I) = "Domain = """ & strDomain & """"
  133.             I = I + 1
  134.         End If
  135.         If strName <> "" then
  136.             strQueryArray(I) = "Name = """ & strName & """"
  137.             I = I + 1
  138.         End If
  139.         If blnLockout = true then
  140.             strQueryArray(I) = "Lockout = True"
  141.             I = I + 1
  142.         End If
  143.         If blnDisabled = true then
  144.             strQueryArray(I) = "Disabled = True"
  145.             I = I + 1
  146.         End If
  147.         I = I - 1
  148.         strQuery = "Select * from Win32_UserAccount Where " & strQueryArray(1)
  149.         If I > 1 then
  150.             For H = 2 to I
  151.                 strQuery = strQuery & " and " & strQueryArray(H)
  152.             Next
  153.         End If
  154.         Set objSet = objService.ExecQuery(strQuery,,0)
  155.         If blnErrorOccurred ("obtaining the "& strWBEMClass) Then Exit Sub
  156.     Else
  157.  
  158.         Set objSet = objService.ExecQuery("Select * from " & strWBEMClass,,0)
  159.         If blnErrorOccurred ("obtaining the "& strWBEMClass) Then Exit Sub
  160.     End If
  161.  
  162.     I = objSet.Count
  163.     If I = 0 then
  164.         Call WriteLine("There is no User Account Data available.", _
  165.             objOutputFile)
  166.     End If
  167.  
  168.     For Each obj In objSet
  169.         WriteLine strSep, objOutputFile
  170.         WriteLine "UserAccount : " & obj.Caption    , objOutputFile
  171.         WriteLine "FullName    : " & obj.FullName   , objOutputFile
  172.         WriteLine "Description : " & Left(obj.Description, 65), objOutputFile
  173.         WriteLine "SID         : " & obj.SID        , objOutputFile
  174.         WriteLine "AccountType : " & CStr(obj.AccountType), objOutputFile
  175.         WriteLine "SIDType     : " & CStr(obj.SIDType)    , objOutputFile
  176.         WriteLine "Status      : " & obj.Status           , objOutputFile
  177.         WriteLine "Password      ", objOutputFile
  178.         WriteLine "  Expires   : " & obj.PasswordExpires, objOutputFile
  179.         WriteLine "  Changeable: " & obj.PasswordChangeable, objOutputFile        
  180.         WriteLine "  Required  : " & obj.PasswordRequired, objOutputFile        
  181.         WriteLine "Lockout     : " & obj.Lockout           , objOutputFile
  182.         WriteLine "Disabled    : " & obj.Disabled           , objOutputFile
  183.    
  184.      Next
  185.  
  186.     If IsObject(objOutputFile) Then
  187.         objOutputFile.Close
  188.         Call Wscript.Echo ("Results are saved in file " & strOutputFile & ".")
  189.     End If
  190.  
  191. End Sub
  192.  
  193. '********************************************************************
  194. '*
  195. '* Function intParseCmdLine()
  196. '*
  197. '* Purpose: Parses the command line.
  198. '* Input:   
  199. '*
  200. '* Output:  strServer         a remote server ("" = local server")
  201. '*          strUserName       the current user's name
  202. '*          strPassword       the current user's password
  203. '*          strOutputFile     an output file name
  204. '*
  205. '********************************************************************
  206. Private Function intParseCmdLine( ByRef strServer,        _
  207.                                   ByRef strUserName,      _
  208.                                   ByRef strPassword,      _
  209.                                   ByRef strOutputFile,    _
  210.                                   ByRef blnQuery,         _
  211.                                   ByRef strDomain,        _
  212.                                   ByRef strName,          _
  213.                                   ByRef blnLockout,       _
  214.                                   ByRef blnDisabled      )
  215.  
  216.  
  217.  
  218.     ON ERROR RESUME NEXT
  219.  
  220.     Dim strFlag
  221.     Dim intState, intArgIter
  222.     Dim objFileSystem
  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 "/d"
  275.                 blnQuery = True
  276.                 If Not blnGetArg("Domain", strDomain, intArgIter) Then
  277.                     intParseCmdLine = CONST_ERROR
  278.                     Exit Function
  279.                 End If
  280.                 intArgIter = intArgIter + 1
  281.  
  282.             Case "/n"
  283.                 blnQuery = True
  284.                 If Not blnGetArg("User Name", strName, intArgIter) Then
  285.                     intParseCmdLine = CONST_ERROR
  286.                     Exit Function
  287.                 End If
  288.                 intArgIter = intArgIter + 1
  289.  
  290.             Case "/l"
  291.                 blnQuery = True
  292.                 blnLockout = True
  293.                 intArgIter = intArgIter + 1
  294.  
  295.             Case "/b"
  296.                 blnQuery = True
  297.                 blnDisabled = True
  298.                 intArgIter = intArgIter + 1
  299.  
  300.             Case Else 'We shouldn't get here
  301.                 Call Wscript.Echo("Invalid or misplaced parameter: " _
  302.                    & Wscript.arguments.Item(intArgIter) & vbCRLF _
  303.                    & "Please check the input and try again," & vbCRLF _
  304.                    & "or invoke with '/?' for help with the syntax.")
  305.                 Wscript.Quit
  306.  
  307.         End Select
  308.  
  309.     Loop '** intArgIter <= Wscript.arguments.Count - 1
  310.  
  311.     If IsEmpty(intParseCmdLine) Then _
  312.         intParseCmdLine = CONST_PROCEED
  313.  
  314. End Function
  315.  
  316. '********************************************************************
  317. '*
  318. '* Sub ShowUsage()
  319. '*
  320. '* Purpose: Shows the correct usage to the user.
  321. '*
  322. '* Input:   None
  323. '*
  324. '* Output:  Help messages are displayed on screen.
  325. '*
  326. '********************************************************************
  327. Private Sub ShowUsage()
  328.  
  329.     Wscript.Echo ""
  330.     Wscript.Echo "Displays User Account Information."
  331.     Wscript.Echo ""
  332.     Wscript.Echo "SYNTAX:"
  333.     Wscript.Echo "  UserAccount.vbs [/D <domain>] [/N <username>] </L> </B>"
  334.     Wscript.Echo "  [/S <server>] [/U <username>] [/W <password>]"
  335.     Wscript.Echo "  [/O <outputfile>]"
  336.     Wscript.Echo ""
  337.     Wscript.Echo "PARAMETER SPECIFIERS:"
  338.     Wscript.Echo "   domain        Filter by domain name"
  339.     Wscript.Echo "   username      Filter by user name"
  340.     Wscript.Echo "   /L            Filter by locked out accounts"
  341.     Wscript.Echo "   /B            Filter by disabled accounts"
  342.     Wscript.Echo "   server        A machine name."
  343.     Wscript.Echo "   username      The current user's name."
  344.     Wscript.Echo "   password      Password of the current user."
  345.     Wscript.Echo "   outputfile    The output file name."
  346.     Wscript.Echo ""
  347.     Wscript.Echo "EXAMPLE:"
  348.     Wscript.Echo "1. cscript UserAccount.vbs"
  349.     Wscript.Echo "   Get the user account configurations for the" _
  350.                & " current domain."
  351.     Wscript.Echo "2. cscript UserAccount.vbs /d MyDomain /b"
  352.     Wscript.Echo "   Get the disabled user account configurations " _
  353.                & "for domain MyDomain"
  354.     Wscript.Echo "NOTES:"
  355.     Wscript.Echo "   This script may seem to run slow when running " _
  356.                & "on large networks"
  357.     Wscript.Echo "   and WANS.  If necessary use one of the filter switches."
  358.     Wscript.Echo ""
  359.  
  360. End Sub
  361.  
  362. '********************************************************************
  363. '* General Routines
  364. '********************************************************************
  365.  
  366. '********************************************************************
  367. '*
  368. '* Function strPackString()
  369. '*
  370. '* Purpose: Attaches spaces to a string to increase the length to intWidth.
  371. '*
  372. '* Input:   strString   a string
  373. '*          intWidth    the intended length of the string
  374. '*          blnAfter    Should spaces be added after the string?
  375. '*          blnTruncate specifies whether to truncate the string or not if
  376. '*                      the string length is longer than intWidth
  377. '*
  378. '* Output:  strPackString is returned as the packed string.
  379. '*
  380. '********************************************************************
  381. Private Function strPackString( ByVal strString, _
  382.                                 ByVal intWidth,  _
  383.                                 ByVal blnAfter,  _
  384.                                 ByVal blnTruncate)
  385.  
  386.     ON ERROR RESUME NEXT
  387.  
  388.     intWidth      = CInt(intWidth)
  389.     blnAfter      = CBool(blnAfter)
  390.     blnTruncate   = CBool(blnTruncate)
  391.  
  392.     If Err.Number Then
  393.         Call Wscript.Echo ("Argument type is incorrect!")
  394.         Err.Clear
  395.         Wscript.Quit
  396.     End If
  397.  
  398.     If IsNull(strString) Then
  399.         strPackString = "null" & Space(intWidth-4)
  400.         Exit Function
  401.     End If
  402.  
  403.     strString = CStr(strString)
  404.     If Err.Number Then
  405.         Call Wscript.Echo ("Argument type is incorrect!")
  406.         Err.Clear
  407.         Wscript.Quit
  408.     End If
  409.  
  410.     If intWidth > Len(strString) Then
  411.         If blnAfter Then
  412.             strPackString = strString & Space(intWidth-Len(strString))
  413.         Else
  414.             strPackString = Space(intWidth-Len(strString)) & strString & " "
  415.         End If
  416.     Else
  417.         If blnTruncate Then
  418.             strPackString = Left(strString, intWidth-1) & " "
  419.         Else
  420.             strPackString = strString & " "
  421.         End If
  422.     End If
  423.  
  424. End Function
  425.  
  426. '********************************************************************
  427. '* 
  428. '*  Function blnGetArg()
  429. '*
  430. '*  Purpose: Helper to intParseCmdLine()
  431. '* 
  432. '*  Usage:
  433. '*
  434. '*     Case "/s" 
  435. '*       blnGetArg ("server name", strServer, intArgIter)
  436. '*
  437. '********************************************************************
  438. Private Function blnGetArg ( ByVal StrVarName,   _
  439.                              ByRef strVar,       _
  440.                              ByRef intArgIter) 
  441.  
  442.     blnGetArg = False 'failure, changed to True upon successful completion
  443.  
  444.     If Len(Wscript.Arguments(intArgIter)) > 2 then
  445.         If Mid(Wscript.Arguments(intArgIter),3,1) = ":" then
  446.             If Len(Wscript.Arguments(intArgIter)) > 3 then
  447.                 strVar = Right(Wscript.Arguments(intArgIter), _
  448.                          Len(Wscript.Arguments(intArgIter)) - 3)
  449.                 blnGetArg = True
  450.                 Exit Function
  451.             Else
  452.                 intArgIter = intArgIter + 1
  453.                 If intArgIter > (Wscript.Arguments.Count - 1) Then
  454.                     Call Wscript.Echo( "Invalid " & StrVarName & ".")
  455.                     Call Wscript.Echo( "Please check the input and try again.")
  456.                     Exit Function
  457.                 End If
  458.  
  459.                 strVar = Wscript.Arguments.Item(intArgIter)
  460.                 If Err.Number 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.                 If InStr(strVar, "/") Then
  467.                     Call Wscript.Echo( "Invalid " & StrVarName)
  468.                     Call Wscript.Echo( "Please check the input and try again.")
  469.                     Exit Function
  470.                 End If
  471.  
  472.                 blnGetArg = True 'success
  473.             End If
  474.         Else
  475.             strVar = Right(Wscript.Arguments(intArgIter), _
  476.                      Len(Wscript.Arguments(intArgIter)) - 2)
  477.             blnGetArg = True 'success
  478.             Exit Function
  479.         End If
  480.     Else
  481.         intArgIter = intArgIter + 1
  482.         If intArgIter > (Wscript.Arguments.Count - 1) Then
  483.             Call Wscript.Echo( "Invalid " & StrVarName & ".")
  484.             Call Wscript.Echo( "Please check the input and try again.")
  485.             Exit Function
  486.         End If
  487.  
  488.         strVar = Wscript.Arguments.Item(intArgIter)
  489.         If Err.Number Then
  490.             Call Wscript.Echo( "Invalid " & StrVarName & ".")
  491.             Call Wscript.Echo( "Please check the input and try again.")
  492.             Exit Function
  493.         End If
  494.  
  495.         If InStr(strVar, "/") Then
  496.             Call Wscript.Echo( "Invalid " & StrVarName)
  497.             Call Wscript.Echo( "Please check the input and try again.")
  498.             Exit Function
  499.         End If
  500.         blnGetArg = True 'success
  501.     End If
  502. End Function
  503.  
  504. '********************************************************************
  505. '*
  506. '* Function blnConnect()
  507. '*
  508. '* Purpose: Connects to machine strServer.
  509. '*
  510. '* Input:   strServer       a machine name
  511. '*          strNameSpace    a namespace
  512. '*          strUserName     name of the current user
  513. '*          strPassword     password of the current user
  514. '*
  515. '* Output:  objService is returned  as a service object.
  516. '*          strServer is set to local host if left unspecified
  517. '*
  518. '********************************************************************
  519. Private Function blnConnect(ByVal strNameSpace, _
  520.                             ByVal strUserName,  _
  521.                             ByVal strPassword,  _
  522.                             ByRef strServer,    _
  523.                             ByRef objService)
  524.  
  525.     ON ERROR RESUME NEXT
  526.  
  527.     Dim objLocator, objWshNet
  528.  
  529.     blnConnect = False     'There is no error.
  530.  
  531.     'Create Locator object to connect to remote CIM object manager
  532.     Set objLocator = CreateObject("WbemScripting.SWbemLocator")
  533.     If Err.Number then
  534.         Call Wscript.Echo( "Error 0x" & CStr(Hex(Err.Number)) & _
  535.                            " occurred in creating a locator object." )
  536.         If Err.Description <> "" Then
  537.             Call Wscript.Echo( "Error description: " & Err.Description & "." )
  538.         End If
  539.         Err.Clear
  540.         blnConnect = True     'An error occurred
  541.         Exit Function
  542.     End If
  543.  
  544.     'Connect to the namespace which is either local or remote
  545.     Set objService = objLocator.ConnectServer (strServer, strNameSpace, _
  546.        strUserName, strPassword)
  547.     ObjService.Security_.impersonationlevel = 3
  548.     If Err.Number then
  549.         Call Wscript.Echo( "Error 0x" & CStr(Hex(Err.Number)) & _
  550.                            " occurred in connecting to server " _
  551.            & strServer & ".")
  552.         If Err.Description <> "" Then
  553.             Call Wscript.Echo( "Error description: " & Err.Description & "." )
  554.         End If
  555.         Err.Clear
  556.         blnConnect = True     'An error occurred
  557.     End If
  558.  
  559.     'Get the current server's name if left unspecified
  560.     If IsEmpty(strServer) Then
  561.         Set objWshNet = CreateObject("Wscript.Network")
  562.     strServer     = objWshNet.ComputerName
  563.     End If
  564.  
  565. End Function
  566.  
  567. '********************************************************************
  568. '*
  569. '* Sub      VerifyHostIsCscript()
  570. '*
  571. '* Purpose: Determines which program is used to run this script.
  572. '*
  573. '* Input:   None
  574. '*
  575. '* Output:  If host is not cscript, then an error message is printed 
  576. '*          and the script is aborted.
  577. '*
  578. '********************************************************************
  579. Sub VerifyHostIsCscript()
  580.  
  581.     ON ERROR RESUME NEXT
  582.  
  583.     Dim strFullName, strCommand, i, j, intStatus
  584.  
  585.     strFullName = WScript.FullName
  586.  
  587.     If Err.Number then
  588.         Call Wscript.Echo( "Error 0x" & CStr(Hex(Err.Number)) & " occurred." )
  589.         If Err.Description <> "" Then
  590.             Call Wscript.Echo( "Error description: " & Err.Description & "." )
  591.         End If
  592.         intStatus =  CONST_ERROR
  593.     End If
  594.  
  595.     i = InStr(1, strFullName, ".exe", 1)
  596.     If i = 0 Then
  597.         intStatus =  CONST_ERROR
  598.     Else
  599.         j = InStrRev(strFullName, "\", i, 1)
  600.         If j = 0 Then
  601.             intStatus =  CONST_ERROR
  602.         Else
  603.             strCommand = Mid(strFullName, j+1, i-j-1)
  604.             Select Case LCase(strCommand)
  605.                 Case "cscript"
  606.                     intStatus = CONST_CSCRIPT
  607.                 Case "wscript"
  608.                     intStatus = CONST_WSCRIPT
  609.                 Case Else       'should never happen
  610.                     Call Wscript.Echo( "An unexpected program was used to " _
  611.                                        & "run this script." )
  612.                     Call Wscript.Echo( "Only CScript.Exe or WScript.Exe can " _
  613.                                        & "be used to run this script." )
  614.                     intStatus = CONST_ERROR
  615.                 End Select
  616.         End If
  617.     End If
  618.  
  619.     If intStatus <> CONST_CSCRIPT Then
  620.         Call WScript.Echo( "Please run this script using CScript." & vbCRLF & _
  621.              "This can be achieved by" & vbCRLF & _
  622.              "1. Using ""CScript UserAccount.vbs arguments"" for Windows 95/98 or" _
  623.              & vbCRLF & "2. Changing the default Windows Scripting Host " _
  624.              & "setting to CScript" & vbCRLF & "    using ""CScript " _
  625.              & "//H:CScript //S"" and running the script using" & vbCRLF & _
  626.              "    ""UserAccount.vbs arguments"" for Windows NT/2000." )
  627.         WScript.Quit
  628.     End If
  629.  
  630. End Sub
  631.  
  632. '********************************************************************
  633. '*
  634. '* Sub WriteLine()
  635. '* Purpose: Writes a text line either to a file or on screen.
  636. '* Input:   strMessage  the string to print
  637. '*          objFile     an output file object
  638. '* Output:  strMessage is either displayed on screen or written to a file.
  639. '*
  640. '********************************************************************
  641. Sub WriteLine(ByVal strMessage, ByVal objFile)
  642.  
  643.     On Error Resume Next
  644.     If IsObject(objFile) then        'objFile should be a file object
  645.         objFile.WriteLine strMessage
  646.     Else
  647.         Call Wscript.Echo( strMessage )
  648.     End If
  649.  
  650. End Sub
  651.  
  652. '********************************************************************
  653. '* 
  654. '* Function blnErrorOccurred()
  655. '*
  656. '* Purpose: Reports error with a string saying what the error occurred in.
  657. '*
  658. '* Input:   strIn        string saying what the error occurred in.
  659. '*
  660. '* Output:  displayed on screen 
  661. '* 
  662. '********************************************************************
  663. Private Function blnErrorOccurred (ByVal strIn)
  664.  
  665.     If Err.Number Then
  666.         Call Wscript.Echo( "Error 0x" & CStr(Hex(Err.Number)) & ": " & strIn)
  667.         If Err.Description <> "" Then
  668.             Call Wscript.Echo( "Error description: " & Err.Description)
  669.         End If
  670.         Err.Clear
  671.         blnErrorOccurred = True
  672.     Else
  673.         blnErrorOccurred = False
  674.     End If
  675.  
  676. End Function
  677.  
  678. '********************************************************************
  679. '* 
  680. '* Function blnOpenFile
  681. '*
  682. '* Purpose: Opens a file.
  683. '*
  684. '* Input:   strFileName        A string with the name of the file.
  685. '*
  686. '* Output:  Sets objOpenFile to a FileSystemObject and setis it to 
  687. '*            Nothing upon Failure.
  688. '* 
  689. '********************************************************************
  690. Private Function blnOpenFile(ByVal strFileName, ByRef objOpenFile)
  691.  
  692.     ON ERROR RESUME NEXT
  693.  
  694.     Dim objFileSystem
  695.  
  696.     Set objFileSystem = Nothing
  697.  
  698.     If IsEmpty(strFileName) OR strFileName = "" Then
  699.         blnOpenFile = False
  700.         Set objOpenFile = Nothing
  701.         Exit Function
  702.     End If
  703.  
  704.     'Create a file object
  705.     Set objFileSystem = CreateObject("Scripting.FileSystemObject")
  706.     If blnErrorOccurred("Could not create filesystem object.") Then
  707.         blnOpenFile = False
  708.         Set objOpenFile = Nothing
  709.         Exit Function
  710.     End If
  711.  
  712.     'Open the file for output
  713.     Set objOpenFile = objFileSystem.OpenTextFile(strFileName, 8, True)
  714.     If blnErrorOccurred("Could not open") Then
  715.         blnOpenFile = False
  716.         Set objOpenFile = Nothing
  717.         Exit Function
  718.     End If
  719.     blnOpenFile = True
  720.  
  721. End Function
  722.  
  723. '********************************************************************
  724. '*                                                                  *
  725. '*                           End of File                            *
  726. '*                                                                  *
  727. '********************************************************************
  728.  
  729.  
  730.