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