CIMScriptMaker.ps1
#requires -version 3.0 <# Version: 3.0 Author : Jeff Hicks @jeffhicks http://jdhitsolutions.com/blog "Those who forget to script are doomed to repeat their work." Learn more about PowerShell: http://jdhitsolutions.com/blog/essential-powershell-resources/ **************************************************************** * DO NOT USE IN A PRODUCTION ENVIRONMENT UNTIL YOU HAVE TESTED * * THOROUGHLY IN A LAB ENVIRONMENT. USE AT YOUR OWN RISK. IF * * YOU DO NOT UNDERSTAND WHAT THIS SCRIPT DOES OR HOW IT WORKS, * * DO NOT USE IT OUTSIDE OF A SECURE, TEST SETTING. * **************************************************************** #> Function New-CIMCommand { Param([string]$computername = $env:COMPUTERNAME) Function Get-Namespace { #this function will recursively enumerate namespaces Param( [string]$Namespace="Root", [Microsoft.Management.Infrastructure.CimSession]$CimSession ) $nspaces = $cimsession | Get-CimInstance -Namespace $Namespace -ClassName __Namespace foreach ($nspace in $nspaces) { $child = Join-Path -Path $Namespace -ChildPath $nspace.Name $child Get-Namespace $child $CimSession } } #create a CIMSession $cimsess = New-CimSession -ComputerName $computername #browse namespaces Write-Host "Enumerating namspaces on $computername....please wait..." -ForegroundColor Cyan $ns = Get-Namespace -CimSession $cimsess | Sort | Out-GridView -Title "$($cimsess.Computername): Select a namespace" -OutputMode Single if ($ns) { #get classes filtering out system classes Write-Host "Enumerating classes...please wait..." -ForegroundColor Cyan $class = $cimsess | Get-CimClass -Namespace $ns | Where {$_.cimclassname -notmatch "^__" -AND $_.CimClassProperties.Name -notcontains "Antecedent"} | Sort CimClassName | Select CimClassName,CimClassProperties | Out-GridView -Title "$NS : Select a class name" -OutputMode Single } if ($class) { #create a VBScript message box $wshell = New-Object -ComObject "Wscript.Shell" $r = $wshell.Popup("Do you want to test this class?",-1,$class.CimClassname,32+4) if ($r -eq 6) { #Yes $test = $cimsess | Get-CimInstance -Namespace $ns -ClassName $class.CimClassName if ($test) { $test | Out-GridView -Title "$NS\$($Class.cimClassName)" -Wait $prompt="Do you want to continue?" $icon=32+4 } else { $prompt="No results were returned. Do you want to continue?" $icon=16+4 } $r = $wshell.Popup($prompt,-1,$class.CimClassname,$icon) if ($r -eq 7) { Write-Host "Exiting. Please try again later." -ForegroundColor Yellow #bail out Return } } #if r = 6 #define basic command $cmd = "Get-CimInstance @cimParam" #create a filter $filterProperty = $class.CimClassProperties | Select Name,CimType,Flags | Out-GridView -Title "Select a property to filter on or cancel to not filter." -OutputMode Single if ($filterProperty) { $operator = "=","<",">","<>",">=","<=","like" | Out-GridView -Title "Select an operator. Default if you cancel is =" -OutputMode Single #create a VBSCript inputbox Add-Type -AssemblyName "microsoft.visualbasic" -ErrorAction Stop $Prompt = "Enter a value for your filter. If using a string, wrap the value in ''. If using Like, use % as the wildcard character." $title= "-filter ""$($filterproperty.Name) $operator ?""" $value=[microsoft.visualbasic.interaction]::InputBox($Prompt,$Title) $filter = "-filter ""$($filterproperty.Name) $operator $value""" $cmd+=" $filter" } #if filterproperty #show properties Write-Host "Getting class properties" -ForegroundColor Cyan $properties = $class.CimClassProperties | select Name,CimType,Flags | Out-Gridview -Title "$($class.CimClassName) : Select one or more properties. Cancel will select *" -PassThru if ($properties) { $select = $properties.name -join "," $cmd+= @" | Select-Object -property $select,PSComputername "@ } #if properties } #if $class #define a name for the function using the class name #remove _ from class name $cname = $class.CimClassName.Replace("_","") $cmdName = "Get-$cname" #the auto-generated PowerShell code $myScript = @" #Requires -version 3.0 Function $cmdName { <# .Synopsis Get $($Class.CimClassName) information .Description This command uses the CIM cmdlets to query a remote computer for information from the $($Class.CimClassName) class in the $NS namespace. This command requires PowerShell 3.0 or later. .Parameter Computername The name of a computer to query. It should be running PowerShell 3.0 or later. This parameter also supports aliases of CN and Host. .Parameter CimSession A previously created CimSession. Works best when you pipe the CimSession to this command. See examples. .Example PS C:\> $cmdName Run the command defaulting to the local computername. .Example PS C:\> Get-CimSession | $cmdName | Out-Gridview -title $cmdName Get all CIMSessions and pipe them to this command sending results to Out-Gridview. .Notes Version : 1.0 Author : $($env:userdomain)\$($env:username) Last Updated: $((Get-Date).ToShortDateString()) .Inputs String or CimSession .Outputs CIMObject or custom object .Link Get-CimInstance Get-CimSession #> [cmdletbinding(DefaultParameterSetName="Computer")] Param( [Parameter(Position=0,ValueFromPipelinebyPropertyName=`$True, ParameterSetName="Computer")] [ValidateNotNullorEmpty()] [Alias("CN","Host")] [string[]]`$Computername=`$env:Computername, [Parameter(Position=0,ValueFromPipeline=`$True, ParameterSetName="Session")] [string[]]`$CimSession ) Begin { Write-Verbose "Starting command `$(`$MyInvocation.Mycommand)" #create a hashtable of parameters to splat against Get-CimInstance `$cimParam=@{ Namespace = "$NS" ClassName = "$($Class.CimClassName) " ErrorAction = "Stop" } } #begin Process { if (`$computername) { `$cimParam.Computername=`$computername Write-Verbose "Processing `$Computername" } else { #must be a cimsession `$cimParam.CIMSession=`$CimSession Write-Verbose "Processing `$(`$CimSession.ComputerName)" } Try { $cmd } #try Catch { Write-Warning "Failed to retrieve information. `$(`$_.Exception.Message)" } #catch } #Process End { Write-Verbose "Ending command `$(`$MyInvocation.Mycommand)" } #end } #end function "@ $myScript | Out-ISETab #remove the cimsession $cimsess | Remove-CimSession } #end function |