Discovering namespaces part 2

I recently showed how to use Get-CimInstance to discover the namespaces present in a particular CIM namespace.  I’m going to try to use CIM instaed of WMI but expect the old terminology to creep in occasionally.

The function I showed last time will only find the first level of namespaces in a namespace – what if those namespaces contain namespaces.

This is where you get to meet the concept of recursion.  In this case all it means is that we’re going to call our function from within the function.  Its easier to show with code.

function get-cimnamespace {
param (
[string]$namespace = ‘root/cimv2’,
[switch]$nobase
)

if (-not $nobase)
{
  New-Object -TypeName psobject -Property @{
    Name = $namespace
  }
}

Get-CimInstance -ClassName __NameSpace -Namespace $namespace |
foreach {
  $ns = New-Object -TypeName psobject -Property @{
    Name = “$($psitem.CimSystemProperties.NameSpace)/$($psitem.Name)”
  }
 
  Write-Output $ns
  get-cimnamespace -namespace $ns.Name  -nobase
}
}

The function has 2 parameters – the startign namespace parameter and a switch parameter. The switch controls if the namespace used as a parameter is output.

Get-CimInstance is used to find each instance of the __Namespace class. Foreach instance the namespace name is output and then used to call get-cimnamespace with the new namespace as a paramter. Its already been output so the –nobase switch is used to prevent duplicate output. And that’s recursion.

On my test  machine I get this

£> get-cimnamespace

Name
—-
root/cimv2
ROOT/cimv2/mdm
ROOT/cimv2/mdm/MS_40c
ROOT/cimv2/mdm/MS_809
ROOT/cimv2/mdm/MS_413
ROOT/cimv2/mdm/MS_409
ROOT/cimv2/mdm/MS_407
ROOT/cimv2/ms_40c
ROOT/cimv2/Security
ROOT/cimv2/Security/MicrosoftTpm
ROOT/cimv2/Security/MicrosoftVolumeEncryption
ROOT/cimv2/ms_809
ROOT/cimv2/power
ROOT/cimv2/power/MS_40c
ROOT/cimv2/power/ms_809
ROOT/cimv2/power/MS_413
ROOT/cimv2/power/ms_409
ROOT/cimv2/power/MS_407
ROOT/cimv2/ms_413
ROOT/cimv2/ms_409
ROOT/cimv2/TerminalServices
ROOT/cimv2/TerminalServices/ms_40c
ROOT/cimv2/TerminalServices/ms_809
ROOT/cimv2/TerminalServices/ms_413
ROOT/cimv2/TerminalServices/ms_407
ROOT/cimv2/ms_407
ROOT/cimv2/Applications
ROOT/cimv2/Applications/WindowsParentalControls
ROOT/cimv2/Applications/WindowsParentalControls/Secured
ROOT/cimv2/Applications/Games
ROOT/cimv2/Applications/Games/ms_40c
ROOT/cimv2/Applications/Games/ms_809
ROOT/cimv2/Applications/Games/ms_413
ROOT/cimv2/Applications/Games/ms_409
ROOT/cimv2/Applications/Games/ms_407

 

I’m loading the function as part of a CimInvetsigation module which now has 2 cmdlets:

Get-CimMethod
Get-CimNamespace

Advertisements
This entry was posted in CIM, PowerShell and WMI, PowerShell V3, PowerShell v4. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s