Enumerate WMI 2.0 (Powershell)

<#
.SYNOPSIS
    Gets all namespaces, classes, methods and properties in the specified WMI namespace.
.DESCRIPTION
    Gets all namespaces, classes, methods and properties in the specified WMI namespace and below.
.PARAMETER ComputerName
    Specify host to scan.
.PARAMETER Namespace
    Specify the WMI namespace to scan.
.PARAMETER Recurse
    Recursively dump all WMI namespaces.
.EXAMPLE
    -------------------------- EXAMPLE 1 --------------------------

    PS C:\>Enumerate-WMI

    Return a list of all namespaces, classes, methods and properties in the "root\cimv2" WMI namespace on the local system

    -------------------------- EXAMPLE 2 --------------------------

    PS C:\>Enumerate-WMI -Namespace "root\ccm" -Recurse

    Return a list of all namespaces, classes, methods and properties in the "root\ccm" WMI namespace and all sub-namespaces on the local system

    -------------------------- EXAMPLE 3 --------------------------

    PS C:\>Enumerate-WMI -ComputerName SERVER1 -Namespace "root\sms" -Recurse

    Return a list of all namespaces, classes and properties in the "root\sms" WMI namespace and all sub-namespaces on SERVER1
.LINK
    http://www.1st-technologies.com/library/scripts/enumerate-wmi-2-0-powershell
.NOTES
    Name     : Enumerate WMI
    Version  : 2.0
    Copyright: 1st Technologies, Inc. 2015
    Author   : 1st Technologies, Inc.
    Date     : June 25, 2015
#>


[CmdletBinding()]
Param(
    [Parameter(Mandatory = $false, Position=0, HelpMessage="Specify host to scan.")]
    [ValidateNotNullOrEmpty()]
    [string]$ComputerName = ".",

    [Parameter(Mandatory = $false, Position=1, HelpMessage="Specify the WMI namespace to scan.")]
    [ValidateNotNullOrEmpty()]
    [string]$Namespace = "root\cimv2",

    [Parameter(Mandatory = $false, Position=2, HelpMessage="Recursively dump all WMI namespaces.")]
    [switch]$Recurse = $false
)


# Enumerate all WMI namespaces in the specified WMI root
Function Get-WMINamespaces{
    param([string]$WMINamespace)
    Get-WMIObject -ComputerName $ComputerName -Namespace $WMINamespace -Class __Namespace | ForEach-Object{
        ($SubNameSpace = "{0}\{1}" -f $_.__NAMESPACE, $_.Name)
        Get-WMINamespaces $SubNameSpace
    }
}


## MAIN ##
write-verbose "Replacing forward slashes in '$Namespace' with backslashes..."
$Namespace = $Namespace.Replace('/','\')

ForEach ($Class in (Get-WmiObject -ComputerName $ComputerName -Namespace $Namespace -List)){
    write-verbose("Enumerating '{0}'..." -f $Class.Name)
    ForEach ($Property in $Class.Properties){
        write-output ("{0},{1},{2},{3},{4}" -f $ComputerName, $Namespace, $Class.Name, "Property", $Property.Name)
    }
    ForEach ($Method in $Class.Methods){
        write-output ("{0},{1},{2},{3},{4}" -f $ComputerName, $Namespace, $Class.Name, "Method", $Method.Name)
    }
}


If ($Recurse -eq $true){
    write-verbose("Enumerating Sub-Namespaces in '{0}'..." -f $Namespace)
    ForEach ($SubNamespace in (Get-WMINamespaces -WMINamespace $Namespace)){
        write-verbose("Enumerating Sub-Namespaces in '{0}'..." -f $SubNamespace)
        ForEach ($Class in (Get-WmiObject -ComputerName $ComputerName -Namespace $SubNamespace -List)){
            write-verbose("Enumerating '{0}'..." -f $Class.Name)
            ForEach ($Property in $Class.Properties){
                write-output ("{0},{1},{2},{3},{4}" -f $ComputerName, $SubNamespace, $Class.Name, "Property", $Property.Name)
            }
            ForEach ($Method in $Class.Methods){
                write-output ("{0},{1},{2},{3},{4}" -f $ComputerName, $Namespace, $Class.Name, "Method", $Method.Name)
            }
        }
    }
}

Document Actions