SMS WMI Namespaces and Classes

When Microsoft Systems Management Server (SMS) 2003 is installed, there are several WMI namespaces created, and depending on the namespace, hundreds of classes can be created under the namespace. Also, each site may have classes that other sites may not have depending on the specific site settings, the inventory that is tracked, and so forth.

SMS WMI Namespaces

The following WMI namespaces are created by SMS 2003:

  • root\ccm

  • root\CCM\VulnerabilityAssessment

  • root\CCM\Events

  • root\CCM\invagt

  • root\CCM\SoftMgmtAgent

  • root\CCM\LocationServices

  • root\CCM\DataTransferService

  • root\CCM\Messaging

  • root\CCM\Policy

  • root\CCM\SoftwareMeteringAgent

  • root\CCM\ContentTransferManager

  • root\CCM\Scheduler

  • root\cimv2\sms

  • root\SmsDm

  • root\sms

  • root\sms\inv_schema

  • root\sms\site_<sitecode>

The CCM namespaces are for Advanced Client information and the others are for site-specific information. The SMS 2003 views are almost all based off of the classes within the root\sms\site_<sitecode> namespace.

Scan WMI with a Visual Basic Script

Running a Microsoft Visual Basic script is one of the easiest ways to list the SMS-related classes that have been created on your site. The following script will scan all of the classes within each of the WMI namespaces listed above and output the results to a text file.

VBScript to scan the SMS WMI namespaces and classes

  1. Copy the following code into Notepad:

    '===================================================================
    '
    ' NAME: WMIScan.vbs
    '
    ' AUTHOR: Dougeby , Microsoft Corporation
    ' DATE  : 6/12/2006
    '
    ' COMMENT: Script to scan SMS WMI classes.
    '
    '===================================================================
    
    Dim SearchChar
    Dim TotChar
    Dim RightChar
    Dim ClassName
    Dim Computer
    Dim strComputer
    Dim strUser
    Dim strPassword
    Dim strSiteCode
    Dim strNameSpace
    Dim strFolder
    Dim strFile
    Dim strLogFile
    Dim strFullFile
    Dim strFullLogFile
    Dim isError
    
    Const ForWriting = 2
    Const ForAppending = 8
    Const adOpenStatic = 3
    Const adLockOptimistic = 3
    Const adUseClient = 3
    
    set colNamedArguments=wscript.Arguments.Named
    If colNamedArguments.Exists("Sitecode") Then
      strSiteCode = colNamedArguments.Item("Sitecode")
    Else
      WScript.Echo "Invalid Command Line Arguments" &amp; vbCrLf &amp; _
        vbCrLf &amp; "Usage: WMIScan.vbs /Sitecode:&lt;sitecode&gt; " &amp; _
        "/Computer:&lt;computername&gt;" &amp; vbCrLf &amp; vbCrLf &amp; _
        "Example1: WMIScan.vbs /Sitecode:PS1" &amp; vbCrLf &amp; _
        "Example2: WMIScan.vbs /Sitecode:PS1 /Computer:Computer1"
      WScript.Quit(1)
    End If
    If colNamedArguments.Exists("Computer") Then
      strComputer = colNamedArguments.Item("Computer")
    Else strComputer = "."
    End If
    
    'define the values for Files and Folders
    strFolder = "c:\WMIScan"
    strFile = "WMIScan.txt"
    strLogFile = "WMIScan.log"
    strFullFile = strFolder &amp; "\" &amp; strFile
    strFullLogFile = strFolder &amp; "\" &amp; strLogFile
    isError = 0
    
    'list of SMS namespaces are put into an array.
    arrNameSpaces = Array("root\ccm","root\CCM\Events",_
      "root\CCM\VulnerabilityAssessment","root\CCM\invagt",_
      "root\CCM\SoftMgmtAgent","root\CCM\LocationServices",_
      "root\CCM\DataTransferService","root\CCM\Messaging",_
      "root\CCM\Policy","root\CCM\SoftwareMeteringAgent",_
      "root\CCM\ContentTransferManager","root\CCM\Scheduler",_
      "root\cimv2\sms","root\SmsDm","root\sms",_
      "root\sms\inv_schema", "root\sms\site_"&amp; strSiteCode)
    
    'creates the folder and files for the scan output and log file
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    
    'Does strFolder Folder exist?  If not, it's created.
    If Not objFSO.FolderExists(strFolder) then
      Set objFolder = objFSO.CreateFolder(strFolder)
    End If
    
    'Creates the WMIScan.txt and WMIScan.log files
    Set objFile = objFSO.CreateTextFile(strFullFile)
    Set objLogFile = objFSO.CreateTextFile(strFullLogFile)
    objFile.close
    objLogFile.close
    
    'Opens the WMIScan.log in write mode
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objLogFile = objFSO.OpenTextFile(strFullLogFile, ForWriting)
    objLogFile.WriteLine "********************************************"
    objLogFile.WriteLine " WMIScan Tool Executed - " &amp; Now()
    objLogFile.WriteLine "********************************************"
    
    'Opens the WMIScan.txt file in write mode
    Set objFile = objFSO.OpenTextFile(strFullFile, ForWriting)
    objLogFile.WriteLine "--------------------------------------------"
    Computer = strComputer
    If Computer = "." Then Computer = "Local System"
    objLogFile.WriteLine " Scanning WMI Namespaces On " &amp; Computer
    objLogFile.WriteLine "--------------------------------------------"
    
    WScript.echo "Starting WMI scan on " &amp; Computer
    
    ' create a collection of Namespaces from the array And
    ' call the EnumNameSpaces subroutine to do the scan
    For Each strNameSpace In arrNameSpaces
       Call EnumNameSpaces(strNameSpace, strComputer)
    Next
    objLogFile.WriteLine "---------------------------------------------"
    objLogFile.WriteLine " Done scanning WMI Namespaces on " &amp; Computer
    objLogFile.WriteLine "---------------------------------------------"
    
    'close the WMISscan.txt file
    objFile.close
    
    If isError = 1 Then
      WScript.Echo "WMI Scan has Completed with Errors!" &amp; vbCrLf &amp; _
      "Check the " &amp; strLogFile &amp; " file for more details." &amp; vbCrLf &amp; _
      vbCrLf &amp; strFile &amp; " &amp; " &amp; strLogFile &amp; " have been written to "_
      &amp; strFolder &amp; "."
    Else
      WScript.Echo "WMI Scan has Completed without any Errors!" &amp; _
      vbCrLf &amp; vbCrLf &amp; strFile &amp; " &amp; " &amp; strLogFile &amp; _
      " have been written to " &amp; strFolder &amp; "."
    End If  
    
    '***************************************************************
    '***   Subroutine to do the Classes scan on the Namespace.   ***
    '***************************************************************
    Sub EnumNameSpaces(strNameSpace, strComputer)
      Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
      On Error Resume next
      Set objSWbemServices= objSWbemLocator.ConnectServer (strComputer,_
        strNameSpace)
      objLogFile.Write "Connecting to the \\" &amp; strComputer &amp; "\" &amp;_
        strNameSpace &amp; " WMI NameSpace...."
      If Err.number = 0 Then 
        objLogFile.WriteLine "Success!!"
        objLogFile.Write "  Scanning for Classes in "&amp;strNameSpace _
          &amp; "..."
    
        'Create a collection of all the subclasses of the namespace
        Set colClasses = objSWbemServices.SubclassesOf()
    
        'Scan all WMI classes and write them to the scan1.txt file
        objFile.WriteBlanklines(1)
        objFile.WriteLine "\\" &amp; strComputer &amp; "\" &amp; strNameSpace
    
        For Each objClass In colClasses
          SearchChar = instr(objClass.Path_.Path, ":")
          TotChar = len(objClass.Path_.Path)
          RightChar = TotChar - SearchChar
          ClassName = right(objClass.Path_.Path,RightChar)
          objFile.WriteLine "   " &amp; ClassName
        Next
        objLogFile.WriteLine "Success!!"
      ElseIf Err.Number = -2147024891 Then
        objLogFile.WriteLine "Error " &amp; Err.Number &amp; _
          "! Connection to "&amp; strComputer &amp; " Failed!"
        isError = 1
      Elseif Err.Number = -2147217394 Then
        objLogFile.WriteLine "Error " &amp; Err.Number &amp; "!! Namespace "&amp;_    
          strNameSpace &amp; " NOT Found!!"
        isError = 1  
      Else
        objLogFile.WriteLine "Error " &amp; Err.Number &amp; "!!"
      isError = 1
      End If
    
    End Sub
    
  2. Create the folder C:\WMIScan.

  3. Save the script as WMIScan.vbs in the C:\WMIScan folder.

  4. Click Start, click Run, type cmd in the Open: text box, and click OK to start a command window.

  5. Type C:\WMIScan\WMIScan.vbs /sitecode:ABC and press Enter. Make sure to replace ABC with the appropriate site code.

Note

The above command line assumes that the script is run from an SMS primary site server. To connect to WMI on a remote site server, use the /computer:<computername> argument to specify the remote computer. For example, to connect to site code ABC on Computer1, you would type C:\WMIScan\WMIScan.vbs /sitecode:ABC /computer:Computer1 in the command line.

The script creates a text file with all of the WMI classes in each of the WMI namespaces for SMS when run on an SMS primary site server. A log file is also created listing all of the namespaces scanned and if the scan was successful. Be aware that some namespaces will not be present on some site servers depending on which options have been configured. For example, the root\smsdm namespace is created when the Device Manager Feature Pack is installed on the site server and otherwise will not be present.