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