This blog has moved to http://ThePowerShellGuy.com
Greetings /\/\o\/\/
Another update on the get-WmiMethodHelp function, to get help on WMI methods and to generate template scripts for calling them.
the last version is broken in Beta 3 of Monad.
Reason for this is the change of behavior of -EQ - NE on an array, in Beta 2 this would return $true or $false in beta 3 they will return the members of the array that
do match. e.g. :
MSH>1,2,3,4 -eq 2
2
MSH>1,2,3,4 -ne 2
1
3
4
so I replaced them on a couple of places by -contains statements.
I also had to redo some other constructions for this and the overloads for the $de object seem to have changed in .NET RTM, I fixed that also. And did some more small changes, e.g. use of the $mp (I first planned a compleet rewrite but I will leave at this for now) , so that everything works again and a little but more cleaning is done.
after playing with the generated scripts (see also the example about filling a generated template in the WMI links), it is also nice to look into the workings of the get-WmiMethodHelp function how you can use the GetMethodParameters to get information about what parameters to pass to the WMI method and generate the script.
and here the revisited script :
# GetWmiMethodInfo.MSH (V3)
# Gets Method Parameters with descriptions from WMI class
# it also Creates an Example script.
# /\/\o\/\/ 2006
# http://mow001.blogspot.com
Function get-WMIMethodHelp{
Param ([string] $WmiClass = "",[string] $WmiMethod = "")
if ($wmiClass -eq "") {"No WMIClass given";Return}
# Set Options
$opt = new-object management.ObjectGetOptions
$opt.UseAmendedQualifiers = $true
# Connect to Class
$MS = new-object management.ManagementScope
$MP = $MS.Path
$MC = $Null
& {
Trap {Continue}
$script:MC = new-object management.ManagementClass($MP,$WMIClass,$opt)
}
if (! $script:mc) {"WMI Class not found";Return}
# Check if Method does Exist
$M = $script:mc.Get_Methods() | foreach {$_.name}
if (!($M -contains $WMIMethod)) {"Method not found, Methods are :";$m;return}
# Make a stringBuilder to make a Template Script
$SB = new-Object text.stringbuilder
$SB = $SB.Append('$Class = "') ; $SB = $SB.AppendLine("$WMIClass`"")
$SB = $SB.Append('$Method = "') ; $SB = $SB.AppendLine("$WMIMethod`"")
# Check for Static Qualifier (If not present then Method Needs Instance)
$Qualifiers=@()
$script:mc.Get_Methods()[$wmiMethod].get_Qualifiers() | foreach {$qualifiers += $_.name}
$static = $Qualifiers -Contains "Static"
If ($static) {
$SB = $SB.AppendLine('$MP = new-object system.management.ManagementPath')
$SB = $SB.Append('$MP.Server = "') ; $SB = $SB.AppendLine("$($MP.Server)`"")
$SB = $SB.Append('$MP.NamespacePath = "') ; $SB = $SB.AppendLine("$($MP.NamespacePath)`"")
$SB = $SB.AppendLine('$MP.ClassName = $Class`n')
$SB = $SB.AppendLine('$MC = new-object system.management.ManagementClass($MP)')
}Else{
# IF not static We need to provide The Key Properties to get the instance.
$SB = $SB.AppendLine('$Computer = "."')
$SB = $SB.AppendLine("`n#$wmiClass Key Properties :")
$Filter = ""
$script:mc.get_Properties() | foreach {
$Q = @()
$_.get_Qualifiers() | foreach {$Q += $_.name}
$key = $Q -Contains "key"
If ($key) {
$CIMType = $_.get_Qualifiers()["Cimtype"].Value
$SB = $SB.AppendLine("`$$($_.Name) = [$CIMType]")
$Filter += "$($_.name) = `'`$$($_.name)`'"
}
}
$SB = $SB.Append('`n$filter = ');$SB = $SB.AppendLine("`"$filter`"")
$SB = $SB.AppendLine('$MC = get-WMIObject $class -computer $Computer -filter $filter`n')
}
$SB = $SB.AppendLine('$InParams = $mc.GetMethodParameters($Method)`n')
# output the Helptext
"$WMIClass : $WMIMethod :`n"
$q = $script:mc.Get_Methods()[$WMIMethod].get_Qualifiers() | foreach {$_.name}
if ($q -eq "Description") {$script:mc.Get_Methods()[$WMIMethod].get_Qualifiers()["Description"].Value}
"`n$WMIMethod Parameters :"
# get the Parameters
$inParam = $script:mc.Get_Methods()[$WMIMethod].get_InParameters()
$HasParams = $False
if ($true) {
trap{'[None]';continue}
$inParam.get_Properties() | foreach {
$HasParams = $true
$Q = $_.get_Qualifiers() | foreach {$_.name}
# if Optional Qualifier is not present then Parameter is Mandatory
$Optional = $q -contains "Optional"
$CIMType = $_.get_Qualifiers()["Cimtype"].Value
"`nName = $($_.Name) `nType = $CIMType `nOptional = $Optional"
# write Parameters to Example script
if ($Optional -eq $TRUE) {$SB = $SB.Append('# ')}
$SB = $SB.Append('$InParams["');$SB = $SB.Append("$($_.Name)`"] = ");$SB = $SB.AppendLine("[$CIMType]")
if ($q -eq "Description") {$_.get_Qualifiers()["Description"].Value}
}
}
# Call diferent Overload as Method has No Parameters
If ($HasParams -eq $True) {
$SB = $SB.AppendLine("`n`"Calling $WMIClass : $WMIMethod with Parameters :`"")
$SB = $SB.AppendLine('$inparams.get_properties() | select name,Value')
$SB = $SB.AppendLine('`n$R = $mc.InvokeMethod($Method, $inParams, $Null)')
}Else{
$SB = $SB.AppendLine("`n`"Calling $WMIClass : $WMIMethod `"")
$SB = $SB.AppendLine('`n$R = $mc.InvokeMethod($Method,$Null)')
}
$SB = $SB.AppendLine('`"Result : `"')
$SB = $SB.AppendLine('$R')
# Write the Sample Script :
"`nSample Script :`n"
"# $WMIclass $WMIMethod-Method Sample Script"
"# Created by Get-WmiMethodHelp (v3)"
"# /\/\o\/\/ 2006"
"# Fill InParams values before Executing"
"# InParams that are Remarked (#) are Optional`n"
$SB.ToString()
}
set-alias gwm get-WMIMethodHelp
(load the function "dotsourced" like this :
. .\get-WmiMethodhelp.msh
after that the function is loaded and you can use it on the Command prompt, see also examples in the former posts in the series, links are below)
you can past the generated script to notepad, edit it and then past it back to the console or save it a script, and then call it
for more info about using WMI from MSH :
The 3 part series About Discovering WMI in MSH and Getting Help from WMI :
"
Wmi-Help Part 1 " Getting All the WMI Classes and Descriptions in a HashTable (getWmiClasses.MSH)"
WMI help Part 2 ",Getting Help on WMI classes, ( get-WmiHelp (GWH) Function)"
WMI help Part 3 (Methods) ", Getting Help on Methods and generating Sample Scripts. (updated by the script posted now)
and :
WMI viewer script for MSH (GUI) (here you can also use this :
out-dataGrid function for Monad , that will output almost any MSH commands output to a datagrid, there you also can find another change in Beta 3, the $form.topmost = $true does not work anymore, I did find another workaround for this here.this would work for all GUI scripts.)
Lets Query WMI from MSH (WMI queries on more (related) classes)
Passing (not so) mandatory Parameters to WMI methods in MSH (example use of generated script-template)
Saving a WMI instance to a XML-file from MSH (save a WMI instance for later use)
greetings /\/\o\/\/
Tags : Monad mshPS if you do find more scripts that do not work (anymore) , please leave a comment.