WMI objektumok elérése PowerShell-ből

Nézzük meg a WMI-vel kapcsolatos PowerShell cmdleteket:

PS C:\> Get-Command -Noun wmi*

 

CommandType     Name                                               Version

-----------     ----                                               -------

Cmdlet          Get-WmiObject                                      3.1.0.0

Cmdlet          Invoke-WmiMethod                                   3.1.0.0

Cmdlet          Register-WmiEvent                                  3.1.0.0

Cmdlet          Remove-WmiObject                                   3.1.0.0

Cmdlet          Set-WmiInstance                                    3.1.0.0

A leggyakrabban használatos ezek közül a Get-WMIObject . Nézzük meg a lehetséges szintaxisokat:

Get-WmiObject [-Class] <String> [[-Property] [<String[]>]] [-Amended] [-AsJob]

 [-Authentication {Default | None | Connect | Call | Packet | PacketIntegrity

| PacketPrivacy | Unchanged}] [-Authority [<String>]] [-ComputerName [<String[

]>]] [-Credential [<PSCredential>]] [-DirectRead] [-EnableAllPrivileges] [-Fil

ter [<String>]] [-Impersonation {Default | Anonymous | Identify | Impersonate

| Delegate}] [-InformationAction {SilentlyContinue | Stop | Continue | Inquire

 | Ignore | Suspend}] [-InformationVariable [<System.String>]] [-Locale [<Stri

ng>]] [-Namespace [<String>]] [-ThrottleLimit [<Int32>]] [<CommonParameters>]

Get-WmiObject [-Amended] [-AsJob] [-Authentication {Default | None | Connect |

 Call | Packet | PacketIntegrity | PacketPrivacy | Unchanged}] [-Authority [<S

tring>]] [-ComputerName [<String[]>]] [-Credential [<PSCredential>]] [-EnableA

llPrivileges] [-Impersonation {Default | Anonymous | Identify | Impersonate |

Delegate}] [-InformationAction {SilentlyContinue | Stop | Continue | Inquire |

 Ignore | Suspend}] [-InformationVariable [<System.String>]] [-Locale [<String

>]] [-Namespace [<String>]] [-ThrottleLimit [<Int32>]] [<CommonParameters>]

Get-WmiObject [-Amended] [-AsJob] [-Authentication {Default | None | Connect |

 Call | Packet | PacketIntegrity | PacketPrivacy | Unchanged}] [-Authority [<S

tring>]] [-ComputerName [<String[]>]] [-Credential [<PSCredential>]] [-EnableA

llPrivileges] [-Impersonation {Default | Anonymous | Identify | Impersonate |

Delegate}] [-InformationAction {SilentlyContinue | Stop | Continue | Inquire |

 Ignore | Suspend}] [-InformationVariable [<System.String>]] [-Locale [<String

>]] [-Namespace [<String>]] [-ThrottleLimit [<Int32>]] [<CommonParameters>]

Get-WmiObject [[-Class] <String>] [-Amended] [-AsJob] [-Authentication {Defaul

t | None | Connect | Call | Packet | PacketIntegrity | PacketPrivacy | Unchang

ed}] [-Authority [<String>]] [-ComputerName [<String[]>]] [-Credential [<PSCre

dential>]] [-EnableAllPrivileges] [-Impersonation {Default | Anonymous | Ident

ify | Impersonate | Delegate}] [-InformationAction {SilentlyContinue | Stop |

Continue | Inquire | Ignore | Suspend}] [-InformationVariable [<System.String>

]] [-List] [-Locale [<String>]] [-Namespace [<String>]] [-Recurse] [-ThrottleL

imit [<Int32>]] [<CommonParameters>]

Get-WmiObject [-Amended] [-AsJob] [-Authentication {Default | None | Connect |

 Call | Packet | PacketIntegrity | PacketPrivacy | Unchanged}] [-Authority [<S

tring>]] [-ComputerName [<String[]>]] [-Credential [<PSCredential>]] [-DirectR

ead] [-EnableAllPrivileges] [-Impersonation {Default | Anonymous | Identify |

Impersonate | Delegate}] [-InformationAction {SilentlyContinue | Stop | Contin

ue | Inquire | Ignore | Suspend}] [-InformationVariable [<System.String>]] [-L

ocale [<String>]] [-Namespace [<String>]] [-ThrottleLimit [<Int32>]] -Query <S

tring> [<CommonParameters>]

Látszik, hogy öt különböző szintaxisa is van, bár ebből vannak nagyon egyformának tűnők. Az elsőként nézzük meg, hogy milyen WMI osztályok vannak. Ehhez fel kell deríteni a WMI névtereit is, amit a hierarchikus WMI adatbázis ROOT elemének segítségével tehetjük meg:

[11] PS C:\> get-wmiobject -namespace root -list

 

 

   NameSpace: ROOT

 

Name                                Methods              Properties

----                                -------              ----------

__SystemClass                       {}                   {}

__thisNAMESPACE                     {}                   {SECURITY_DESCRIPTOR}

__CacheControl                      {}                   {}

__EventConsumerProviderCacheControl {}                   {ClearAfter}

__EventProviderCacheControl         {}                   {ClearAfter}

__EventSinkCacheControl             {}                   {ClearAfter}

__ObjectProviderCacheControl        {}                   {ClearAfter}

__PropertyProviderCacheControl      {}                   {ClearAfter}

__NAMESPACE                         {}                   {Name}

__ArbitratorConfiguration           {}                   {OutstandingTasksP...

Ebben a listában látható a __NAMESPACE elem, ezt kell tüzetesebben lekérdeznünk:

[13] PS C:\> Get-WmiObject -Namespace root -Class __NAMESPACE | Format-Table na

me

 

name

----

subscription

DEFAULT

MicrosoftDfs

CIMV2

Cli

nap

MicrosoftActiveDirectory

SECURITY

RSOP

MicrosoftDNS

WMI

directory

Policy

Interop

Hardware

ServiceModel

Microsoft

aspnet

Az alábbi kifejezéssel összes névteret fel tudjuk deríteni:

PS C:\> Get-WmiObject -Namespace root -list -recurse -class __namespace -ErrorA

ction SilentlyContinue| format-table @{l="név";e={$_.__Namespace}} -AutoSize

 

név

---

ROOT

ROOT\subscription

ROOT\DEFAULT

ROOT\CIMV2

ROOT\msdtc

ROOT\Cli

ROOT\SECURITY

ROOT\SecurityCenter2

ROOT\RSOP

ROOT\PEH

ROOT\StandardCimv2

ROOT\WMI

ROOT\directory

ROOT\Policy

ROOT\Interop

ROOT\Hardware

ROOT\ServiceModel

ROOT\SecurityCenter

ROOT\Microsoft

ROOT\aspnet

ROOT\CIMV2\mdm

ROOT\CIMV2\Security

ROOT\CIMV2\power

ROOT\CIMV2\TerminalServices

ROOT\CIMV2\Applications

ROOT\RSOP\User

ROOT\RSOP\Computer

Ezután már egy konkrét névtér felderítése a következő kifejezéssel végezhető el:

[19] PS C:\> get-wmiobject -namespace "root\CIMV2" -list

 

 

   NameSpace: ROOT\CIMV2

 

Name                                Methods              Properties

----                                -------              ----------

__SystemClass                       {}                   {}

__thisNAMESPACE                     {}                   {SECURITY_DESCRIPTOR}

__NAMESPACE                         {}                   {Name}

__Provider                          {}                   {Name}

__Win32Provider                     {}                   {ClientLoadableCLS...

__ProviderRegistration              {}                   {provider}

__EventProviderRegistration         {}                   {EventQueryList, p...

__ObjectProviderRegistration        {}                   {InteractionType, ...

__ClassProviderRegistration         {}                   {CacheRefreshInter...

__InstanceProviderRegistration      {}                   {InteractionType, ...

__MethodProviderRegistration        {}                   {provider}

__PropertyProviderRegistration      {}                   {provider, Support...

__EventConsumerProviderRegistration {}                   {ConsumerClassName...

__IndicationRelated                 {}                   {}

__EventFilter                       {}                   {CreatorSID, Event...

__EventConsumer                     {}                   {CreatorSID, Machi...

__FilterToConsumerBinding           {}                   {Consumer, Creator...

__AggregateEvent                    {}                   {NumberOfEvents, R...

__TimerNextFiring                   {}                   {NextEvent64BitTim...

__Event                             {}                   {SECURITY_DESCRIPT...

__ExtrinsicEvent                    {}                   {SECURITY_DESCRIPT...

Win32_DeviceChangeEvent             {}                   {EventType, SECURI...

Win32_SystemConfigurationChangeE... {}                   {EventType, SECURI...

Itt fontos a –list kapcsoló használata, hiszen enélkül kérné a ‑class paramétert, amellyel egy konkrét WMI osztály elemeit térképezhetjük fel.

Ha már tudjuk, hogy milyen osztály objektumait keressük, akkor használhatjuk az első szintaxist. Például keressük az adott gép hálózati adaptereit:

[81] PS C:\> Get-WmiObject -Namespace root\cimv2 -Class win32_networkadapter |

Format-Table

 

ServiceName MACAddress  AdapterTyp DeviceID   Name       NetworkAdd Speed

                        e                                resses

----------- ----------  ---------- --------   ----       ---------- -----

RasSstp                            0          WAN Min...

RasAgileVpn                        1          WAN Min...

Rasl2tp                            2          WAN Min...

PptpMini...                        3          WAN Min...

RasPppoe                           4          WAN Min...

NdisWan                            5          WAN Min...

NdisWan                            6          WAN Min...

E1G60       08:00:27... Etherne... 7          Intel(R...            1000000000

tunnel                  Tunnel     8          Microso...            100000

NdisWan                            9          WAN Min...

tunnel                  Tunnel     10         Teredo ...            100000

AsyncMac    20:41:53... Wide Ar... 11         RAS Asy...

A fenti listában elég sok hálózati kártya látszik, de ezek közül „igazi” csak egy van. Ezt a következő szűrőfeltétel megadásával lehet kiszűrni:

[86] PS C:\> Get-WmiObject -Namespace root\cimv2 -Class win32_networkadapter -F

ilter "AdapterType = 'Ethernet 802.3'"

 

 

ServiceName      : E1G60

MACAddress       : 08:00:27:90:23:A2

AdapterType      : Ethernet 802.3

DeviceID         : 7

Name             : Intel(R) PRO/1000 MT Desktop Adapter

NetworkAddresses :

Speed            : 1000000000

Ennél jóval több információt hordoz egy ilyen objektum, ezt a Format-List * segítségével tehetjük láthatóvá:

[87] PS C:\> Get-WmiObject -Namespace root\cimv2 -Class win32_networkadapter -F

ilter "AdapterType = 'Ethernet 802.3'" | format-list *

 

 

Availability                : 3

Name                        : Intel(R) PRO/1000 MT Desktop Adapter

Status                      :

StatusInfo                  :

DeviceID                    : 7

__GENUS                     : 2

__CLASS                     : Win32_NetworkAdapter

__SUPERCLASS                : CIM_NetworkAdapter

__DYNASTY                   : CIM_ManagedSystemElement

__RELPATH                   : Win32_NetworkAdapter.DeviceID="7"

__PROPERTY_COUNT            : 40

__DERIVATION                : {CIM_NetworkAdapter, CIM_LogicalDevice, CIM_Logi

                              calElement, CIM_ManagedSystemElement}

__SERVER                    : DC

__NAMESPACE                 : root\cimv2

__PATH                      : \\DC\root\cimv2:Win32_NetworkAdapter.DeviceID="7

                              "

AdapterType                 : Ethernet 802.3

AdapterTypeId               : 0

AutoSense                   :

Caption                     : [00000007] Intel(R) PRO/1000 MT Desktop Adapter

ConfigManagerErrorCode      : 0

ConfigManagerUserConfig     : False

CreationClassName           : Win32_NetworkAdapter

Description                 : Intel(R) PRO/1000 MT Desktop Adapter

ErrorCleared                :

ErrorDescription            :

GUID                        : {FF327D73-8AE0-4949-98C2-BAD7DABFC3CB}

Index                       : 7

InstallDate                 :

Installed                   : True

InterfaceIndex              : 11

LastErrorCode               :

MACAddress                  : 08:00:27:90:23:A2

Manufacturer                : Intel

MaxNumberControlled         : 0

MaxSpeed                    :

NetConnectionID             : Local Area Connection

NetConnectionStatus         : 2

NetEnabled                  : True

Látható, hogy a Filter paraméternek egy WQL lekérdezés Where feltételét kell megadni, azaz itt nem PowerShell, hanem WQL szintaxis használandó. Ha valaki nagyon profi WQL lekérdezések megfogalmazásában, akkor a fenti szűrést mindenestül is megadhatja WQL formában:

[89] PS C:\> Get-WmiObject -Namespace root\cimv2 -Query "select * from win32_ne

tworkadapter where AdapterType = 'Ethernet 802.3'"

 

 

ServiceName      : E1G60

MACAddress       : 08:00:27:90:23:A2

AdapterType      : Ethernet 802.3

DeviceID         : 7

Name             : Intel(R) PRO/1000 MT Desktop Adapter

NetworkAddresses :

Speed            : 1000000000

Megjegyzés

Vigyázni kell az idézőjelezésre, hiszen a WQL kifejezést idézőjelezni kell, amin belül szintén idézőjel szerepel általában a where feltételnél. Ezt legegyszerűbben a kétfajta idézőjel használatával oldhatjuk meg, mint ahogy a fenti példában is tettem, és akkor nem kell sem az escape (` Alt Gr+7) karaktert használni, sem többszörözni az idézőjeleket.

A WMI-ben az még a nagyszerű, hogy távoli gépekre is kiadhatók lekérdezések. Az alábbi paranccsal két gép, a DC és a MEMBER nevű gép hálózati kártyáit kérdezhetjük le:

[5] PS C:\> Get-WmiObject -Namespace root\cimv2 -ComputerName dc,member -Class

Win32_NetworkAdapter -Filter "AdapterType = 'Ethernet 802.3'" | Format-Table sy

stemname, name, macaddress

 

systemname                 name                      macaddress

----------                 ----                      ----------

DC                         Intel(R) PRO/1000 MT D... 08:00:27:90:23:A2

MEMBER                     Intel(R) PRO/1000 MT D... 08:00:27:8D:0D:AE

A –credential paraméterrel még azt is megadhatjuk, hogy kinek a nevében akarunk csatlakozni a WMI felület eléréséhez. Természetesen a parancs sikeres futtatásához biztosítani kell a Windows tűzfalon a megfelelő portok megnyitását, hogy a kommunikáció sikeres legyen.

A WMI osztályok böngészésében, és az osztályok példányainak kilistázásához szükséges PowerShell parancs összeállításában segít a PowerShellScriptOMatic ingyenesen letölthető apró kis eszköz:

121 . ábra PowerShellScriptOMatic



Word To HTML Converter