A WMI objektumok is rendelkeznek metódusokkal. Ezek felderítésére használhatjuk a PowerShell get-member cmdletjét a –list kapcsolóval. Például nézzük az előbb lekérdezett hálózati kártyák WMI metódusait:
[8] PS C:\> Get-WmiObject -Namespace root\cimv2 -Class win32_networkadapter -li
st | Format-List *
Name : Win32_NetworkAdapter
__GENUS : 1
__CLASS : Win32_NetworkAdapter
__SUPERCLASS : CIM_NetworkAdapter
__DYNASTY : CIM_ManagedSystemElement
__RELPATH : Win32_NetworkAdapter
__PROPERTY_COUNT : 40
__DERIVATION : {CIM_NetworkAdapter, CIM_LogicalDevice, CIM_LogicalElement,
CIM_ManagedSystemElement}
__SERVER : DC
__NAMESPACE : ROOT\cimv2
__PATH : \\DC\ROOT\cimv2:Win32_NetworkAdapter
Path : \\DC\ROOT\cimv2:Win32_NetworkAdapter
Derivation : {CIM_NetworkAdapter, CIM_LogicalDevice, CIM_LogicalElement,
CIM_ManagedSystemElement}
Methods
: {SetPowerState, Reset, Enable, Disable}
Scope : System.Management.ManagementScope
Options : System.Management.ObjectGetOptions
ClassPath : \\DC\ROOT\cimv2:Win32_NetworkAdapter
Properties : {AdapterType, AdapterTypeId, AutoSense, Availability, Capti
on, ConfigManagerErrorCode, ConfigManagerUserConfig, Creati
onClassName, Description, DeviceID...}
SystemProperties : {__GENUS, __CLASS, __SUPERCLASS, __DYNASTY, __RELPATH, __PR
OPERTY_COUNT, __DERIVATION, __SERVER, __NAMESPACE, __PATH}
Qualifiers : {dynamic, Locale, provider, UUID}
Site :
Container :
Látható, hogy a Methods tulajdonság tartalmazza az adott WMI osztály objektumaira meghívható metódusok listáját. Nézzük meg ezeket kicsit részletesebben:
[9] PS C:\> (Get-WmiObject -Namespace root\cimv2 -Class win32_networkadapter -l
ist).methods
Name : SetPowerState
InParameters : System.Management.ManagementBaseObject
OutParameters : System.Management.ManagementBaseObject
Origin : CIM_LogicalDevice
Qualifiers : {}
Name : Reset
InParameters :
OutParameters : System.Management.ManagementBaseObject
Origin : CIM_LogicalDevice
Qualifiers : {}
Name : Enable
InParameters :
OutParameters : System.Management.ManagementBaseObject
Origin : Win32_NetworkAdapter
Qualifiers : {Implemented, MappingStrings}
Name : Disable
InParameters :
OutParameters : System.Management.ManagementBaseObject
Origin : Win32_NetworkAdapter
Qualifiers : {Implemented, MappingStrings}
Például rendelkezésünkre áll a Disable metódus, amellyel az adott hálózati kártyát tudjuk kikapcsolni. Ezt meghívni az Invoke-WMIMethod cmdlettel tudjuk legegyszerűbben:
[22] PS C:\> Get-WmiObject -Namespace root\cimv2 -Class Win32_NetworkAdapter -F
ilter "netconnectionid = 'Local Area Connection'" | Invoke-WmiMethod -Name Disa
ble
__GENUS : 2
__CLASS : __PARAMETERS
__SUPERCLASS :
__DYNASTY : __PARAMETERS
__RELPATH :
__PROPERTY_COUNT : 1
__DERIVATION : {}
__SERVER :
__NAMESPACE :
__PATH :
ReturnValue : 0
Látható, hogy én a csővezetéken keresztül töltöttem fel az Invoke-WMIMethod azon paraméterét, ami megmutatta számára, hogy melyik objektumon is kívánom ezt a metódust meghívni. Használhattam volna magának az Invoke-WMIMethod paraméterezését is erre, de szerintem ez a csövezéses módszer egyszerűbb.
Fontos nyomon követni, hogy milyen visszatérési értéket is ad a metódus a meghívása után. Jelen esetben a ReturnValue 0 volt, ez jelzi, hogy nem történt hiba. Egyéb esetben meg kellett volna vizsgálni, hogy mi a hiba oka.
Nem minden metódus meghívása lesz sikeres az Invoke-WMIMethod cmdlet segítségével, mert sok esetben a WMI nem a legmagasabb szintű jogosultsággal futtatja ezeket biztonsági megfontolásokból. Ha ilyen jellegű hibára gyanakszunk, akkor a cmdletnek adjunk még egy ‑EnableAllPrivileges kapcsolót is.
Az előző metódus egyszerű volt, hiszen nem igényelt paramétert. Nehezebb a helyzetünk, ha olyan WMI metódussal állunk szemben, amelyik paramétereket vár. Ilyen például a megosztások létrehozása. Nézzük meg, hogyan jutnánk el a megfelelő metódushoz:
[1] PS C:\> (Get-WmiObject -Namespace root\cimv2 -Class Win32_Share -List).meth
ods
Name : Create
InParameters : System.Management.ManagementBaseObject
OutParameters : System.Management.ManagementBaseObject
Origin : Win32_Share
Qualifiers : {Constructor, Implemented, MappingStrings, Static}
Name : SetShareInfo
InParameters : System.Management.ManagementBaseObject
OutParameters : System.Management.ManagementBaseObject
Origin : Win32_Share
Qualifiers : {Implemented, MappingStrings}
Name : GetAccessMask
InParameters :
OutParameters : System.Management.ManagementBaseObject
Origin : Win32_Share
Qualifiers : {Implemented, MappingStrings}
Name : Delete
InParameters :
OutParameters : System.Management.ManagementBaseObject
Origin : Win32_Share
Qualifiers : {Destructor, Implemented, MappingStrings}
Sajnos nem sok segítséget ad nekünk ez a lista a paraméterezésre vonatkozólag. Egy másik módszer a következő. Definiálok egy új Win32_Share WMIClass típusú objektumot és annak megnézem a tagjellemzőit:
[2] PS C:\> $wc = New-Object wmiclass Win32_Share
[3] PS C:\> $wc | gm
TypeName: System.Management.ManagementClass#ROOT\cimv2\Win32_Share
Name MemberType Definition
---- ---------- ----------
Name AliasProperty Name = __Class
Create Method System.Management.ManagementBaseObject Cr...
__CLASS Property System.String __CLASS {get;set;}
__DERIVATION Property System.String[] __DERIVATION {get;set;}
__DYNASTY Property System.String __DYNASTY {get;set;}
__GENUS Property System.Int32 __GENUS {get;set;}
__NAMESPACE Property System.String __NAMESPACE {get;set;}
__PATH Property System.String __PATH {get;set;}
__PROPERTY_COUNT Property System.Int32 __PROPERTY_COUNT {get;set;}
__RELPATH Property System.String __RELPATH {get;set;}
__SERVER Property System.String __SERVER {get;set;}
__SUPERCLASS Property System.String __SUPERCLASS {get;set;}
ConvertFromDateTime ScriptMethod System.Object ConvertFromDateTime();
ConvertToDateTime ScriptMethod System.Object ConvertToDateTime();
A fenti listában látható „Create” a Win32_Share WMI osztály statikus metódusának fogható fel. Az előzőekben látott négy metódus pedig a „normál”, azaz példány-metódusoknak felelnek meg. Ennek a statikus metódusnak a paraméterezését a következő módon tudjuk megnézni, a tényleges paraméterezés a Value mellett látható:
[9] PS C:\> $wc.create
MemberType : Method
OverloadDefinitions : {System.Management.ManagementBaseObject Create(System.St
ring Path, System.String Name, System.UInt32 Type, Syste
m.UInt32 MaximumAllowed, System.String Description, Syst
em.String Password, System.Management.ManagementObject#W
in32_SecurityDescriptor Access)}
TypeNameOfValue : System.Management.Automation.PSMethod
Value : System.Management.ManagementBaseObject Create(System.Str
ing Path, System.String Name, System.UInt32 Type, System
.UInt32 MaximumAllowed, System.String Description, Syste
m.String Password, System.Management.ManagementObject#Wi
n32_SecurityDescriptor Access)
Name : Create
IsInstance : True
Szerencsére nem minden paramétert kötelező kitölteni, így egy egyszerű megosztás a következő kifejezéssel is létrehozható:
[10] PS C:\> $wc.Create("c:\munka","MunkaShare",0)
__GENUS : 2
__CLASS : __PARAMETERS
__SUPERCLASS :
__DYNASTY : __PARAMETERS
__RELPATH :
__PROPERTY_COUNT : 1
__DERIVATION : {}
__SERVER :
__NAMESPACE :
__PATH :
ReturnValue : 0
Láthatjuk a 0-s visszatérési értékből, hogy a művelet sikeres volt, így kilistázhatjuk az aktuális megosztásokat, melyek között ott az új megosztásunk:
[11] PS C:\> Get-WmiObject win32_share
Name Path Description
---- ---- -----------
ADMIN$ C:\Windows Remote Admin
C$ C:\ Default share
IPC$ Remote IPC
MunkaShare c:\munka
NETLOGON C:\Windows\SYSVOL\sysv... Logon server share
SYSVOL C:\Windows\SYSVOL\sysvol Logon server share
A metódusok böngészésére is alkalmas másik eszköz a PowerShell WMI Browser, vagy más néven a WMIExplorer.ps1:
122 . ábra PowerShell WMI Browser
Ez az eszköz azért is érdekes, mert színtisztán PowerShellben van megírva! Érdemes belenézni a szkript forráskódjába, látható benne, hogy hogyan szólítja meg a .NET keretrendszer grafikus osztályait, melyek segítségével felépíti a fenti képen látható ablakot a sok vezérlőelemmel együtt. Persze a PowerShellt nem grafikus alkalmazások írására találták ki, így ilyeneket nem túl egyszerű létrehozni. A PowerShell WMI Browser alkotója, a „The PowerShell Guy” sem Notepad előtt ülve pötyögte be a programsorokat, hanem egy C#-ban megírt programot a forráskód alapján egy szkript segítségével alakított át színtiszta PowerShell szkriptté.