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

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