WMI Tags for Task Sequencer Logic

One of the things that I am often required to obtain for customers are certain WMI tags so that we can write task sequence IF statements and provide the build process with some logic. Gathering these WMI tags can be tricky, so we put together a VB Script to pull out the 10 most popular items and display them to the screen - we also copy the results to a file called sysinfo.txt. By running this file on the machines that will be built, we can ensure that we use the correct WMI entries for things like MANUFACTURER, MODEL and CHASIS.

The scipt (sysinfo.vbs) is listed below and is a variation on the script used by BDD to gather information at the start of the build process:

' Initialization
Set fso = CreateObject("Scripting.FileSystemObject")
Set shell = CreateObject("Wscript.Shell")
Set reg = GetObject("winmgmts:root\default:StdRegProv")
Dim sOutput

On Error Resume Next

' Create the appropriate OS information
For each os in GetObject("winmgmts:").InstancesOf("Win32_OperatingSystem")
   If Instr(1,os.caption,"XP") <> 0 then Call makefile("OS = XP")
   If Instr(1,os.caption,"2000") <> 0 then Call makefile("OS = WIN2000")
   If Instr(1,os.caption,"2003") <> 0 then Call makefile("OS = WIN2003")
   If Instr(1,os.caption,"NT") <> 0 then Call makefile("OS = NT4")
   If Instr(1,os.caption,"2000 Server") <> 0 then  Call makefile("OSTYPE = SERVER")
   If Instr(1,os.caption,"Advanced Server") <> 0 then  Call makefile("OSTYPE = ADVANCED")
   If Instr(1,os.caption,"Professional") <> 0 then  Call makefile("OSTYPE = PRO")
   If Instr(1,os.caption,"Standard") <> 0 then Call makefile("OSTYPE = STANDARD")
   If Instr(1,os.caption,"Enterprise") <> 0 then Call makefile("OSTYPE = ENTERPRISE")
   If Instr(1,os.caption,"Web") <> 0 then Call makefile("OSTYPE = WEB")
   If os.ServicePackMajorVersion <> "" then
      Call makefile("OSSP = " & os.ServicePackMajorVersion)
   Else
      Call makefile("OSSP = NONE")
   End if
Next

' Obtain the enclosure type
for each Enclosure in GetObject("winmgmts:").InstancesOf("Win32_SystemEnclosure")
   if join (Enclosure.Tag)<>"System Enclosure 1" then
      CaseType = Enclosure.ChassisTypes(0)
   end if
next
Select case CaseType
  Case "3", "4", "5", "6", "7", "15"
     Call makefile("CHASSIS = " & "DESKTOP")

  Case "8", "10", "12", "14", "18", "21"
     Call makefile("CHASSIS = " & "LAPTOP")

  Case "23"
     Call makefile("CHASSIS = " & "SERVER")

  Case ELSE
     Call makefile("CHASSIS = " & "OTHER")
End Select

' Since there is no good way to identify a Tablet PC except by using an API call (GetSystemMetrics),
' cheat and use a well-known registry location.
Err.Clear
ver = shell.RegRead("HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Tablet PC\Ident")
If Err then
    ' Not a tablet
Else
    Call makefile("OSTYPE = TABLET")
End if

' Obtain the HAL that is being used
halID = shell.RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E966-E325-11CE-BFC1-08002BE10318}\0000\MatchingDeviceId")
halName = shell.RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E966-E325-11CE-BFC1-08002BE10318}\0000\DriverDesc")
'Wscript.Echo "HAL ID=" & halID
'Wscript.Echo "HAL Name=" & halName
Call makefile("HALID = " & halID)
Call makefile("HALNAME = " & halName)

' Obtain the manufacturer and model
For each os in GetObject("winmgmts:").InstancesOf("Win32_ComputerSystem")
   If Instr(1,os.Manufacturer," ") <> 0 then
      Manu=Left(os.Manufacturer,(instr(1,os.Manufacturer," "))-1)
   else
      Manu=os.manufacturer
   end if
   Call makefile("MANUFACTURER = "&manu)
   Call makefile("MODEL = "&os.model)
Next

' Get the CD/DVD information
x = 0
CD = false
DVD = false
For each os in GetObject("winmgmts:").InstancesOf("Win32_CDROMDrive")
   x = x + 1
   If Instr(1,UCASE(os.name),"RW") <> 0 then Call makefile("CDROM-RW")
   If Instr(1,UCASE(os.name),"DVD") <> 0 then
      DVD = true
   ElseIf instr(1,UCASE(os.name),"DV")<>0 then
      DVD = true
   ElseIf instr(1,UCASE(os.name),"CD")<>0 then
      CD = true
   End If
Next
If DVD then
   Call makefile("CDROM = DVD")
ElseIf CD then
   Call makefile("CDROM = CD")
Else
   Call makefile("CDROM = NONE")
End if

' Get the BIOS information
For each os in GetObject("winmgmts:").InstancesOf("Win32_BIOS")
   Call makefile("BIOS = "&os.SMBIOSBIOSVERSION)
Next

' Get the video information
For each os in GetObject("winmgmts:").InstancesOf("Win32_VideoController")
   Call makefile("VIDEO = "&os.name)
next

' Get the audio information
For each os in GetObject("winmgmts:").InstancesOf("Win32_SoundDevice")
   Call makefile("Audio = "&os.name)
Next

' Display output
shell.popup sOutput

'create a file called sysinfo.txt
call CreateFile

Sub Makefile (filename)
 filename = Trim(filename) ' Strip whitespace
 sOutput = sOutput & filename & vbcrlf
End sub

Sub CreateFile()
 Set objFSO = CreateObject("Scripting.FileSystemObject")
 Set objTextFile = objFSO.OpenTextFile("sysinfo.txt", 2, True)
 objTextFile.WriteLine sOutput
 objTextFile.Close
End Sub

A simple alternative to this script - if you just want to find make and model information - is to follow the process identified by my MCS colleague Ben

1. Open a Command Prompt

2. Type WMIC

3. To determine the Make, type CSProduct Get Vendor

4. To determine the Model, type CSProduct Get Name

Ben also has an excellent article on how to use specific WMI information in rules to perform different tasks based on hardware types. You can find his blog entry here