Finding WMI Class Static Methods

Share |

Join PowerShell.com!
Subscribe to Feed

PowerShell eBook
Sign up for
Your PowerTip of the Day:

Award-winning PowerShellPlus


Admin Guide to PowerShell Remoting


Mastering PowerShell eBook

In a previous tip, we illustrated how to use Invoke-WmiMethod to create a network share locally and remotely. Today, you dive a bit deeper and find out which WMI classes actually provide methods, and what their arguments and argument orders are.

Note that WMI methods can be very powerful but are a low-level interface. This tip can only serve as a starter. Once you find an interesting class and method, you will probably have to do additional research until all works as expected. Also note that some WMI classes may not be implemented in all operating system versions.

To find all WMI classes that support static methods, try this:

$exclude = 'SetPowerState', 'Reset', 'Invoke'

Get-WmiObject -List -Class Win32_* | 
  Where-Object { $_.Methods } |
  ForEach-Object {
    $result = $_ | Select-Object -Property Name, Methods
    [Object[]]$result.Methods = $_.Methods | 
      Where-Object { ($_.Qualifiers | Select-Object -ExpandProperty Name) -contains 'Static' } |
      ForEach-Object { if($exclude -notcontains $_.Name) { $_.Name } }
    $result
  } |
  Where-Object { $_.Methods }  

The code lists all WMI classes that start with "Win32_" and have at least one method that is not listed in $exclude. The result looks something like this:

Name                              Methods                                                                        
----                              -------                                                                        
Win32_LogicalDisk                 {ScheduleAutoChk, ExcludeFromAutochk}                                          
Win32_Volume                      {ScheduleAutoChk, ExcludeFromAutoChk}                                          
Win32_Printer                     {AddPrinterConnection}                                                         
Win32_Process                     {Create}                                                                       
Win32_BaseService                 {Create}                                                                       
Win32_Service                     {Create}                                                                       
Win32_TerminalService             {Create}                                                                       
Win32_SystemDriver                {Create}                                                                       
Win32_PrinterDriver               {AddPrinterDriver}                                                             
Win32_ScheduledJob                {Create}                                                                       
Win32_DfsNode                     {Create}                                                                       
Win32_Share                       {Create}                                                                       
Win32_ClusterShare                {Create}                                                                       
Win32_ShadowCopy                  {Create}                                                                       
Win32_SecurityDescriptorHelper    {Win32SDToSDDL, Win32SDToBinarySD, SDDLToWin32SD, SDDLToBinarySD...}           
Win32_NetworkAdapterConfiguration {RenewDHCPLeaseAll, ReleaseDHCPLeaseAll, EnableDNS, SetDNSSuffixSearchOrder...}
Win32_ShadowStorage               {Create}                                                                       
Win32_ReliabilityStabilityMetrics {GetRecordCount}                                                               
Win32_ReliabilityRecords          {GetRecordCount}                                                               
Win32_OfflineFilesCache           {Enable, RenameItem, Synchronize, Pin...}                                      
Win32_Product                     {Install, Admin, Advertise}

If you wanted to try Win32_Share with its method Create(), you then need to know the correct order of arguments for the method:

$class = [wmiclass]'Win32_Share'
$methodname = 'Create'

$class.psbase.GetMethodParameters($methodname).Properties | 
  Select-Object -Property Name, Type |
  Format-Table -AutoSize   

The result looks something like this:

Name             Type
----             ----
Access         Object
Description    String
MaximumAllowed UInt32
Name           String
Password       String
Path           String
Type           UInt32

Next, you can create new shares locally and remotely like this:

$class = 'Win32_Share'
$methodname = 'Create'
$Access = $null
$Description = 'A new share'
$MaximumAllowed = 10
$Name = 'myNewShare'
$Password = $null
$Path = 'C:\windows'
$Type = 0
Invoke-WmiMethod -Path $class -Name $methodname -ArgumentList $Access, $Description, $MaximumAllowed, $Name, $Password, $Path, $Type 

To create the share remotely, add the parameter(s) -ComputerName and -Credential. Note that you will need local Administrator privileges to create a new share. Invoke-WmiMethod returns numeric return values. To decipher these and find out more about WMI methods, navigate to a search engine and enter the WMI class name (such as "Win32_Share"). Most WMI classes and their methods are well documented on MSDN.

Twitter This Tip! ReTweet this Tip!


Posted Feb 01 2013, 06:00 AM by ps1
Copyright 2012 PowerShell.com. All rights reserved.