WMI objektumok metódusainak meghívása (Invoke-WMIMethod)

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é.



Word To HTML Converter