Calling WMI Methods with CIM Cmdlets

by Mar 7, 2013

It can be very useful to call WMI methods, for example to create new shares, but in PowerShell v2 you had to know the names and exact order of arguments to submit:

$rv = Invoke-WmiMethod -Path 'Win32_Share' -ComputerName $ComputerName -Name Create -ArgumentList $null, $Description, $MaximumAllowed, $Name, $null, $Path, $Type

In PowerShell v3, you can use Get-CimClass to discover methods and arguments, and use Invoke-CimMethod instead. It takes the arguments as a hash table, so order is no longer important:

PS> $class = Get-CimClass -ClassName Win32_Share
PS> $class.CimClassMethods

Name                               ReturnType Parameters            Qualifiers
----                               ---------- ----------            ----------
Create                                 UInt32 {Access, Descripti... {Constructor, Impl..
SetShareInfo                           UInt32 {Access, Descripti... {Implemented, Mapp..
GetAccessMask                          UInt32 {}                    {Implemented, Mapp..
Delete                                 UInt32 {}                    {Destructor, Imple..

PS> $class.CimClassMethods['Create']

Name                               ReturnType Parameters            Qualifiers
----                               ---------- ----------            ----------
Create                                 UInt32 {Access, Descripti... {Constructor, Impl..

PS> $class.CimClassMethods['Create'].Parameters

Name                                  CimType Qualifiers            ReferenceClassName
----                                  ------- ----------            ------------------
Access                               Instance {EmbeddedInstance,...
Description                            String {ID, In, MappingSt...
MaximumAllowed                         UInt32 {ID, In, MappingSt...
Name                                   String {ID, In, MappingSt...
Password                               String {ID, In, MappingSt...
Path                                   String {ID, In, MappingSt...
Type                                   UInt32 {ID, In, MappingSt...

# create new share
PS> Invoke-CimMethod -ClassName Win32_Share -MethodName Create -Arguments @{Name='Testshare' Path='c:\' MaximumAllowed=[UInt32]4 Type=[UInt32]0}

Twitter This Tip! ReTweet this Tip!