Get-WMIInfo.ps1
# =====================================================================================
#
# Microsoft PowerShell Source File -- Created with SAPIEN Technologies PrimalScript 2009
#
# NAME: Get-WMIInfo.ps1
#
# AUTHOR: Jeffery Hicks , SAPIEN Technologies
# DATE : 6/11/2009
#
# COMMENT: Discover information about a given WMI class such as
# a help description, its methods and properties.
#
# The script will write a custom object with WMI information
# to the pipeline, or you can use -report to display an expanded
# view of the class' methods and properties.
# This script cannot use alternate credentials to connect to remote
# computers. You must run it under an account that has admin
# privileges on the remote computer.
# DISCLAIMER AND WARNING:
# THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
# KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.
# TEST THOROUGHLY IN A NON-PRODUCTION ENVIRONMENT. IF YOU DON'T KNOW WHAT THIS
# SCRIPT WILL DO...DO NOT RUN IT!
#
# ====================================================================================
Param([string]$Class="Win32_OperatingSystem",
[string]$computername=$env:computername,
[string]$namespace="ROOT\CIMV2",
[switch]$report
)
#turn off the error pipeline
$errorActionPreference="SilentlyContinue"
Trap [System.Management.Automation.PSInvalidCastException] {
#this traps errors attempting to retrieve the WMI class
Write-Warning ("There was an error trying to get the {0}`
class from the {1} namespace on {2}.`
{3}" -f $Class.ToUpper(),$namespace.ToUpper(),`
$computername.ToUpper(),$($_.exception.message))
Return
}
Trap {
#this will trap all other errors and let the script continue
Continue
}
[WMICLASS]$wmi="\\{0}\{1}:{2}" -f $computername,$namespace,$Class
#set object to use amended qualifiers
$wmi.psbase.options.UseAmendedQualifiers=$true
#define an array for property names
$properties=@()
$wmi.psbase.properties | foreach {
#add each property name to $properties
$properties+=$_.name
}
#define an array for method names
$methods=@()
$wmi.psbase.methods | foreach {
#add each method name to $methods
$methods+=$_.name
}
#if no methods found set a new value
if ($methods.count -eq 0) {
$methods="None"
}
#get class description
$description=$wmi.psbase.GetQualifierValue("description")
#if no description then define a new value
if (!$description) {
$description= "No Description Found"
}
#create an empty custom object
$obj=New-Object PSObject
#assign properties
$obj | Add-Member -MemberType Noteproperty -name "Computername"
-value $computername.ToUpper()
$obj | Add-Member -MemberType Noteproperty -name "Path" -value $wmi.path.path.ToUpper()
$obj | Add-Member -MemberType Noteproperty -name "Namespace" -value $namespace.ToUpper()
$obj | Add-Member -MemberType Noteproperty -name "WMIClass" -value $class.ToUpper()
$obj | Add-Member -MemberType Noteproperty -name "Description" -value $description
$obj | Add-Member -MemberType Noteproperty -name "Properties" -value $properties
$obj | Add-Member -MemberType Noteproperty -name "Methods" -value $methods
#if -report was specified display a formatted report
if ($report) {
$obj | Format-List Path,WMIClass,Description,`
@{label="Properties";Expression={$_.properties | Out-String}},`
@{label="Methods";Expression={$_.Methods | Out-String}}
}
else {
#otherwise, just write the object
write $obj
}
#end of script