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

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