Home > Articles > Programming > Visual Basic

  • Print
  • + Share This
This chapter is from the book

Writing the Main Script

The function was probably the toughest part to write; with that out of the way, I can adapt my prototype code to create the main script, shown in Listing 20.3.

Listing 20.3. MainScript.vbs. Queries the domain, creates the output file, and calls the custom function I already wrote.

Dim sDomain
sDomain = InputBox("Enter domain to inventory")

'connect to domain and retrieve
'a list of member objects
Dim oDomain
Set oDomain = GetObject("WinNT://" & sDomain)

'get the filesystemobject
Dim oFSO
Set oFSO = CreateObject("Scripting.FileSystemObject")

'open an output file
Dim oOutput
Set oOutput = oFSO.CreateTextFile("\\server1\public\output.txt")

'run through the objects
Dim oObject, sComputerName, sDetails
For Each oObject In oDomain

 'is this object a computer?
 If oObject.Class = "Computer" Then

  'yes - get computer name
  sComputerName = oObject.Name

  'get OS info
  sDetails = GetOSInfo(sComputerName)

  'write info to the file
  oOutput.Write sDetails

 End If
Next

'close the output file
oOutput.Close

'release objects
Set oOutput = Nothing
Set oFSO = Nothing
Set oObject = nothing
Set oDomain = Nothing

'display completion message
WScript.Echo "Output saved to \\server1\public\output.txt"

I'll provide my usual walk-through of this script in a bit; for now, try to pick out the adapted pieces of prototype code. Notice where I'm querying the domain, opening and writing to the text file, closing the text file, and calling the GetOSInfo() function.

arrow.gif Inventorying the Domain

Listing 20.4 shows the complete, ready-to-run script. Get this ready to run, but don't execute it just yet. In the next section, I'll cover testing and troubleshooting this script.

Listing 20.4. InventoryDomain.vbs. The complete domain inventory script.

'get domain name
Dim sDomain
sDomain = InputBox("Enter domain to inventory")

'connect to domain and retrieve
'a list of member objects
Dim oDomain
Set oDomain = GetObject("WinNT://" & sDomain

'get the filesystemobject
Dim oFSO
Set oFSO = CreateObject("Scripting.FileSystemObject")

'open an output file
Dim oOutput
oOutput = oFSO.CreateTextFile("\\server1\public\output.txt")

'run through the objects
Dim oObject, sComputerName, sDetails
For Each oObject In oDomain

 'is this object a computer?
 If oObject.Class = "Computer" Then

  'yes - get computer name
  sComputerName = oObject.Name

  'get OS info
  sDetails = GetOSInfo(sComputerName)

  'write info to the file
  oOutput.Write sDetails

 End If
Next

'close the output file
oOutput.Close

'release objects
Set oOutput = Nothing
Set oFSO = Nothing
Set oObject = nothing
Set oDomain = Nothing

'display completion message
WScript.Echo "Output saved to \\server1\public\output.txt"

Function GetOSInfo(sComputer)

      'declare variables
      Dim objWMIService
      Dim colItems
      Dim strOutput

      'get WMI service
      Set objWMIService = GetObject("winmgmts:\\" & _
       strComputer & "\root\cimv2")

      'get item collection
      Set colItems = objWMIService.ExecQuery( _
       "Select * from Win32_OperatingSystem",,48)

      'init output string
      sOutput = String(70,"-")
      sOutput = sOutput & sComputer

      'append info to output string
      For Each objItem in colItems
            strOutput = strOutput & "BuildNumber: " & _
             objItem.BuildNumber & vbCrLf
            strOutput = strOutput & "BuildType: " & _
             objItem.BuildType & vbCrLf
            strOutput = strOutput & "Caption: " & _
             objItem.Caption & vbCrLf
            strOutput = strOutput & "EncryptionLevel: " & _
             objItem.EncryptionLevel & vbCrLf
            strOutput = strOutput & "InstallDate: " & _
             objItem.InstallDate & vbCrLf
            strOutput = strOutput & "Manufacturer: " & _
             objItem.Manufacturer & vbCrLf
            strOutput = strOutput & "MaxNumberOfProcesses: " & _
             objItem.MaxNumberOfProcesses & vbCrLf
      strOutput = strOutput & "MaxProcessMemorySize: " & _
             objItem.MaxProcessMemorySize & vbCrLf
       strOutput = strOutput & "Name: " & _
             objItem.Name & vbCrLf
            strOutput = strOutput & _
             "NumberOfLicensedUsers: " & _
             objItem.NumberOfLicensedUsers & vbCrLf
            strOutput = strOutput & "NumberOfProcesses: " & _
             objItem.NumberOfProcesses & vbCrLf
            strOutput = strOutput & "NumberOfUsers: " & _
             objItem.NumberOfUsers & vbCrLf
            strOutput = strOutput & "OSProductSuite: " & _
             objItem.OSProductSuite & vbCrLf
            strOutput = strOutput & "OSType: " & _
             objItem.OSType & vbCrLf
            strOutput = strOutput & "OtherTypeDescription: " & _
             objItem.OtherTypeDescription & vbCrLf
            strOutput = strOutput & "Primary: " & _
             objItem.Primary & vbCrLf
            strOutput = strOutput & "ProductType: " & _
             objItem.ProductType & vbCrLf
            strOutput = strOutput & "RegisteredUser: " & _
             objItem.RegisteredUser & vbCrLf
            strOutput = strOutput & "SerialNumber: " & _
             objItem.SerialNumber & vbCrLf
            strOutput = strOutput & _
             "ServicePackMajorVersion: " & _
             objItem.ServicePackMajorVersion & vbCrLf
            strOutput = strOutput & _
             "ServicePackMinorVersion: " & _
             objItem.ServicePackMinorVersion & vbCrLf
            strOutput = strOutput & "Version: " & _
             objItem.Version & vbCrLf
            strOutput = strOutput & "WindowsDirectory: " & _
      Next             objItem.WindowsDirectory & vbCrLf

 'return results
      GetOSInfo = sOutput

End Function

You need to change where this script puts its output file before using it in your environment. The script prompts for the domain name, so you won't have to make any changes there.

arrow.gif Inventorying the Domain—Explained

The script starts by prompting for the domain name. This allows the script to be used in a multidomain environment. The domain name is stored in a string variable.

'get domain name
Dim sDomain
sDomain = InputBox("Enter domain to inventory")

Next, the script uses ADSI to connect to the domain and retrieve a list of all domain objects. This may be a lengthy operation in a large domain, because computer, user, and all other objects are included in the results.

'connect to domain and retrieve
'a list of member objects
Dim oDomain
Set oDomain = GetObject("WinNT://" & sDomain

The script creates a new FileSystemObject and assigns it to a variable.

'get the filesystemobject
Dim oFSO
Set oFSO = CreateObject("Scripting.FileSystemObject")

The script now creates a new text file by using the FileSystemObject's CreateTextFile method. The method returns a TextStream object, which is assigned to the variable oOutput.

'open an output file
Dim oOutput
oOutput = oFSO.CreateTextFile("\\server1\public\output.txt")

oDomain now represents all of the objects in the domain; I'll use a For Each…Next loop to iterate through each object in turn. Within the loop, oObject will represent the current object.

'run through the objects
Dim oObject, sComputerName, sDetails
For Each oObject In oDomain

Because oDomain contains more than just computers, I need to check each object to see if its Class property equals "Computer." That way, I can just work with the computer objects and skip the rest.

 'is this object a computer?
 If oObject.Class = "Computer" Then

For objects that are a computer, I pull the computer name into a variable. Then, I assign the results of GetOSInfo() to variable sDetails. Finally, I write sDetails to the output text file using the TextStream object's Write method. Closing up the loop with Next moves on to the next object in the domain.

  'yes - get computer name
  sComputerName = oObject.Name

  'get OS info
  sDetails = GetOSInfo(sComputerName)

  'write info to the file
  oOutput.Write sDetails

 End If
Next

When I'm done with all the objects, I close the output file, release all the objects I created by setting them equal to Nothing, and then display a simple completion message.

'close the output file
oOutput.Close

'release objects
Set oOutput = Nothing
Set oFSO = Nothing
Set oObject = nothing
Set oDomain = Nothing

'display completion message
WScript.Echo "Output saved to \\server1\public\output.txt"

Here's that function I wrote earlier. It starts with basic variable declaration.

Function GetOSInfo(sComputer)

      'declare variables
      Dim objWMIService
      Dim colItems
      Dim strOutput

Next is pure wizard code, which uses GetObject to connect to the specified computer's WMI service.

'get WMI service
Set objWMIService = GetObject("winmgmts:\\" & _
 strComputer & "\root\cimv2")

After I am connected, I execute a query to retrieve the Win32_OperatingSystem class.

'get item collection
Set colItems = objWMIService.ExecQuery( _
 "Select * from Win32_OperatingSystem",,48)

I set up my output string to include a line of hyphens and the current computer name.

'init output string
sOutput = String(70,"-")
sOutput = sOutput & sComputer

Finally, I append the WMI information to the output string.

'append info to output string
For Each objItem in colItems
      strOutput = strOutput & "BuildNumber: " & _
       objItem.BuildNumber & vbCrLf
      strOutput = strOutput & "BuildType: " & _
       objItem.BuildType & vbCrLf
      strOutput = strOutput & "Caption: " & _
       objItem.Caption & vbCrLf
      strOutput = strOutput & "EncryptionLevel: " & _
       objItem.EncryptionLevel & vbCrLf
      strOutput = strOutput & "InstallDate: " & _
       objItem.InstallDate & vbCrLf
      strOutput = strOutput & "Manufacturer: " & _
       objItem.Manufacturer & vbCrLf
      strOutput = strOutput & "MaxNumberOfProcesses: " & _
       objItem.MaxNumberOfProcesses & vbCrLf
strOutput = strOutput & "MaxProcessMemorySize: " & _
       objItem.MaxProcessMemorySize & vbCrLf
strOutput = strOutput & "Name: " & _
      objItem.Name & vbCrLf
     strOutput = strOutput & _
      "NumberOfLicensedUsers: " & _
      objItem.NumberOfLicensedUsers & vbCrLf
     strOutput = strOutput & "NumberOfProcesses: " & _
      objItem.NumberOfProcesses & vbCrLf
     strOutput = strOutput & "NumberOfUsers: " & _
      objItem.NumberOfUsers & vbCrLf
     strOutput = strOutput & "OSProductSuite: " & _
      objItem.OSProductSuite & vbCrLf
     strOutput = strOutput & "OSType: " & _
      objItem.OSType & vbCrLf
     strOutput = strOutput & "OtherTypeDescription: " & _
      objItem.OtherTypeDescription & vbCrLf
     strOutput = strOutput & "Primary: " & _
      objItem.Primary & vbCrLf
     strOutput = strOutput & "ProductType: " & _
      objItem.ProductType & vbCrLf
     strOutput = strOutput & "RegisteredUser: " & _
      objItem.RegisteredUser & vbCrLf
     strOutput = strOutput & "SerialNumber: " & _
      objItem.SerialNumber & vbCrLf
     strOutput = strOutput & _
      "ServicePackMajorVersion: " & _
      objItem.ServicePackMajorVersion & vbCrLf
     strOutput = strOutput & _
      "ServicePackMinorVersion: " & _
      objItem.ServicePackMinorVersion & vbCrLf
     strOutput = strOutput & "Version: " & _
      objItem.Version & vbCrLf
     strOutput = strOutput & "WindowsDirectory: " & _
      objItem.WindowsDirectory & vbCrLf
Next

With the main script finished, I return the output string as the function's result.

 'return results
      GetOSInfo = sOutput

End Function

There you have it—a nice, easy-to-use administrative script that uses both WMI and ADSI to accomplish a useful task.

  • + Share This
  • 🔖 Save To Your Account