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

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