7. fejezet – A WMI használata

WMI és CIM

A Windows PowerShell alapértelmezés szerint más technológiák, például a Windows Management Instrumentation (WMI) használatát szolgáló parancsmagokkal együtt szállítja. A WMI-parancsmagok elavultak, és nem érhetők el a PowerShell 6+-ban, de itt találhatók, mivel a Windows PowerShellen futó régebbi szkriptekben találkozhat velük. Új fejlesztéshez használja inkább a CIM-parancsmagokat.

Számos natív WMI-parancsmag létezik a PowerShellben anélkül, hogy további szoftvereket vagy modulokat kellene telepítenie. Get-Command segítségével meghatározhatja, hogy milyen WMI-parancsmagok léteznek a Windows PowerShellben. Az alábbi eredmények a PowerShell 5.1-es verzióját futtató Windows 10 tesztkörnyezeti számítógépről származnak. Az eredmények eltérhetnek attól függően, hogy milyen PowerShell-verziót futtat.

Get-Command -Noun WMI*
CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Cmdlet          Get-WmiObject                                      3.1.0.0    Microsof...
Cmdlet          Invoke-WmiMethod                                   3.1.0.0    Microsof...
Cmdlet          Register-WmiEvent                                  3.1.0.0    Microsof...
Cmdlet          Remove-WmiObject                                   3.1.0.0    Microsof...
Cmdlet          Set-WmiInstance                                    3.1.0.0    Microsof...

A Common Information Model (CIM) parancsmagok a PowerShell 3.0-s verziójában lettek bevezetve. A CIM-parancsmagok úgy lettek kialakítva, hogy windowsos és nem Windows rendszerű gépeken is használhatók legyenek.

A CIM-parancsmagok mindegyike egy modulban található. A CIM-parancsmagok listájának beszerzéséhez használja Get-Command a Modul paramétert az alábbi példában látható módon.

Get-Command -Module CimCmdlets
CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Cmdlet          Export-BinaryMiLog                                 1.0.0.0    CimCmdlets
Cmdlet          Get-CimAssociatedInstance                          1.0.0.0    CimCmdlets
Cmdlet          Get-CimClass                                       1.0.0.0    CimCmdlets
Cmdlet          Get-CimInstance                                    1.0.0.0    CimCmdlets
Cmdlet          Get-CimSession                                     1.0.0.0    CimCmdlets
Cmdlet          Import-BinaryMiLog                                 1.0.0.0    CimCmdlets
Cmdlet          Invoke-CimMethod                                   1.0.0.0    CimCmdlets
Cmdlet          New-CimInstance                                    1.0.0.0    CimCmdlets
Cmdlet          New-CimSession                                     1.0.0.0    CimCmdlets
Cmdlet          New-CimSessionOption                               1.0.0.0    CimCmdlets
Cmdlet          Register-CimIndicationEvent                        1.0.0.0    CimCmdlets
Cmdlet          Remove-CimInstance                                 1.0.0.0    CimCmdlets
Cmdlet          Remove-CimSession                                  1.0.0.0    CimCmdlets
Cmdlet          Set-CimInstance                                    1.0.0.0    CimCmdlets

A CIM-parancsmagok továbbra is lehetővé teszik a WMI használatát, ezért ne tévesszen meg senkit, amikor valaki "Amikor lekérdezem a WMI-t a PowerShell CIM-parancsmagokkal..."

Ahogy korábban említettem, a WMI egy külön technológia a PowerShell-től, és csak a CIM-parancsmagokat használja a WMI eléréséhez. Találhat egy régi VBScriptet, amely WMI-lekérdezési nyelvet (WQL) használ a WMI lekérdezéséhez, például az alábbi példában.

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colBIOS = objWMIService.ExecQuery _
    ("Select * from Win32_BIOS")

For each objBIOS in colBIOS
    Wscript.Echo "Manufacturer: " & objBIOS.Manufacturer
    Wscript.Echo "Name: " & objBIOS.Name
    Wscript.Echo "Serial Number: " & objBIOS.SerialNumber
    Wscript.Echo "SMBIOS Version: " & objBIOS.SMBIOSBIOSVersion
    Wscript.Echo "Version: " & objBIOS.Version
Next

A WQL-lekérdezést az adott VBScriptből is elvégezheti, és módosítás nélkül használhatja a Get-CimInstance parancsmaggal.

Get-CimInstance -Query 'Select * from Win32_BIOS'
SMBIOSBIOSVersion : 090006
Manufacturer      : American Megatrends Inc.
Name              : Intel(R) Xeon(R) CPU E3-1505M v5 @ 2.80GHz
SerialNumber      : 3810-1995-1654-4615-2295-2755-89
Version           : VRTUAL - 4001628

Általában nem így kérdezem le a WMI-t a PowerShell-lel. Ez azonban működik, és lehetővé teszi a meglévő VBScriptek egyszerű migrálását a PowerShellbe. Amikor elkezdek írni egy egyvonalas vonalat a WMI lekérdezéséhez, az alábbi szintaxist használom.

Get-CimInstance -ClassName Win32_BIOS
SMBIOSBIOSVersion : 090006
Manufacturer      : American Megatrends Inc.
Name              : Intel(R) Xeon(R) CPU E3-1505M v5 @ 2.80GHz
SerialNumber      : 3810-1995-1654-4615-2295-2755-89
Version           : VRTUAL - 4001628

Ha csak a sorozatszámot szeretném, akkor a kimenetet csak a SerialNumber tulajdonságra tudom beszúrni Select-Object és megadni.

Get-CimInstance -ClassName Win32_BIOS | Select-Object -Property SerialNumber
SerialNumber
------------
3810-1995-1654-4615-2295-2755-89

Alapértelmezés szerint több tulajdonság is lekérhető a színfalak mögött, amelyeket soha nem használnak. A WMI helyi számítógépen való lekérdezése nem feltétlenül számít sokat. A távoli számítógépek lekérdezésének megkezdése után azonban nem csak további feldolgozási idő áll rendelkezésre az adatok visszaadására, hanem további szükségtelen információkra is szükség van a hálózaton keresztüli lekéréshez. Get-CimInstanceTulajdonságparaméterrel rendelkezik, amely korlátozza a lekért információkat. Ez hatékonyabbá teszi a WMI-lekérdezést.

Get-CimInstance -ClassName Win32_BIOS -Property SerialNumber |
Select-Object -Property SerialNumber
SerialNumber
------------
3810-1995-1654-4615-2295-2755-89

Az előző eredmények egy objektumot adnak vissza. Egyszerű sztring visszaadásához használja az ExpandProperty paramétert .

Get-CimInstance -ClassName Win32_BIOS -Property SerialNumber |
Select-Object -ExpandProperty SerialNumber
3810-1995-1654-4615-2295-2755-89

A pontozott szintaxisstílussal is visszaadhat egy egyszerű sztringet. Ez szükségtelenné teszi a cső.Select-Object

(Get-CimInstance -ClassName Win32_BIOS -Property SerialNumber).SerialNumber
3810-1995-1654-4615-2295-2755-89

Távoli számítógépek lekérdezése CIM-parancsmagokkal

Továbbra is helyi rendszergazdaként futtatom a PowerShellt, aki tartományi felhasználó. Amikor egy távoli számítógépről próbálok adatokat lekérdezni a Get-CimInstance parancsmaggal, a hozzáférés megtagadása hibaüzenet jelenik meg.

Get-CimInstance -ComputerName dc01 -ClassName Win32_BIOS
Get-CimInstance : Access is denied.
At line:1 char:1
+ Get-CimInstance -ComputerName dc01 -ClassName Win32_BIOS
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (root\cimv2:Win32_BIOS:String) [Get-CimI
   nstance], CimException
    + FullyQualifiedErrorId : HRESULT 0x80070005,Microsoft.Management.Infrastructure.Cim
   Cmdlets.GetCimInstanceCommand
    + PSComputerName        : dc01

Sokaknak vannak biztonsági aggályai a PowerShell-lel kapcsolatban, de az igazság az, hogy pontosan ugyanazokkal az engedélyekkel rendelkezik a PowerShellben, mint a grafikus felhasználói felületen. Nem több és nem kevesebb. Az előző példában az a probléma, hogy a PowerShellt futtató felhasználónak nincs jogosultsága WMI-adatok lekérdezésére a DC01-kiszolgálóról. Újraindíthatom a PowerShellt tartományi rendszergazdaként, mivel Get-CimInstance nem rendelkezik hitelesítőadat-paraméterrel . De hidd el, ez nem jó ötlet, mert akkor bármi, amit a PowerShellből futtatok, tartományadminisztrátorként futna. Ez biztonsági szempontból veszélyes lehet a helyzettől függően.

A minimális jogosultság elvét használva parancsonként emelem ki a tartományadminisztrátori fiókomat a Hitelesítőadat paraméter használatával, ha egy parancs rendelkezik ilyenrel. Get-CimInstancenem rendelkezik hitelesítő paraméterrel, ezért ebben a forgatókönyvben a megoldás egy CimSession létrehozása. Ezután a CimSessiont használom számítógépnév helyett a WMI távoli számítógépen való lekérdezéséhez.

$CimSession = New-CimSession -ComputerName dc01 -Credential (Get-Credential)
cmdlet Get-Credential at command pipeline position 1
Supply values for the following parameters:
Credential

A CIM-munkamenet egy nevű változóban $CimSessionlett tárolva. Figyelje meg, hogy zárójelben is megadottam a Get-Credential parancsmagot, hogy először végrehajtsa azt, és másodlagos hitelesítő adatokat kérve, mielőtt létrehoznám az új munkamenetet. A fejezet későbbi részében bemutatom a másodlagos hitelesítő adatok megadásának egy másik hatékonyabb módját, de fontos, hogy tisztában legyen ezzel az alapfogalmaval, mielőtt még bonyolultabbá tenné.

Az előző példában létrehozott CIM-munkamenet mostantól a Get-CimInstance parancsmaggal is lekérdezhető a WMI-ből származó BIOS-információk a távoli számítógépen.

Get-CimInstance -CimSession $CimSession -ClassName Win32_BIOS
SMBIOSBIOSVersion : 090006
Manufacturer      : American Megatrends Inc.
Name              : Intel(R) Xeon(R) CPU E3-1505M v5 @ 2.80GHz
SerialNumber      : 0986-6980-3916-0512-6608-8243-13
Version           : VRTUAL - 4001628
PSComputerName    : dc01

A CIM-munkamenetek használatának számos további előnye van a számítógépnév megadása helyett. Ha több lekérdezést futtat ugyanazon a számítógépen, a CIM-munkamenet használata hatékonyabb, mint az egyes lekérdezések számítógépnevének használata. A CIM-munkamenet létrehozása csak egyszer állítja be a kapcsolatot. Ezután több lekérdezés is ugyanazt a munkamenetet használja az információk lekéréséhez. A számítógépnév használatához a parancsmagoknak be kell állítaniuk és fel kell bontania a kapcsolatot az egyes lekérdezésekkel.

A Get-CimInstance parancsmag alapértelmezés szerint a WSMan protokollt használja, ami azt jelenti, hogy a távoli számítógépnek a PowerShell 3.0-s vagy újabb verziójára van szüksége a csatlakozáshoz. Valójában nem a PowerShell-verzió számít, hanem a verem verziója. A verem verziója a Test-WSMan parancsmaggal határozható meg. Ennek a 3.0-s verziónak kell lennie. Ez az a verzió, amelyet a PowerShell 3.0-s és újabb verziójával talál.

Test-WSMan -ComputerName dc01
wsmid           : http://schemas.dmtf.org/wbem/wsman/identity/1/wsmanidentity.xsd
ProtocolVersion : http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd
ProductVendor   : Microsoft Corporation
ProductVersion  : OS: 0.0.0 SP: 0.0 Stack: 3.0

A régebbi WMI-parancsmagok a DCOM protokollt használják, amely kompatibilis a Windows régebbi verzióival. A DCOM-t azonban általában letiltja a tűzfal a Windows újabb verzióiban. A New-CimSessionOption parancsmag lehetővé teszi egy DCOM protokollkapcsolat létrehozását a következővel New-CimSessionvaló használatra: . Ez lehetővé teszi, hogy a Get-CimInstance parancsmag a Windows 2000-hez hasonlóan a Windows server 2000-zel megegyező verziókkal kommunikáljon. Ez azt is jelenti, hogy a Távoli számítógépen nincs szükség PowerShellre, ha a Get-CimInstance parancsmagot a DCOM protokoll használatára konfigurált CimSession használatával használja.

Hozza létre a DCOM protokollbeállítást a New-CimSessionOption parancsmag használatával, és tárolja egy változóban.

$DCOM = New-CimSessionOption -Protocol Dcom

A hatékonyság érdekében a tartományadminisztrátort vagy az emelt szintű hitelesítő adatokat egy változóban tárolhatja, így nem kell folyamatosan megadnia őket az egyes parancsokhoz.

$Cred = Get-Credential
cmdlet Get-Credential at command pipeline position 1
Supply values for the following parameters:
Credential

Van egy SQL03 nevű kiszolgálóm, amely Windows Server 2008-at futtat (nem R2). Ez a legújabb Windows Server operációs rendszer, amely alapértelmezés szerint nem rendelkezik PowerShell-lel.

Hozzon létre egy CimSession-t az SQL03-hoz a DCOM protokoll használatával.

$CimSession = New-CimSession -ComputerName sql03 -SessionOption $DCOM -Credential $Cred

Figyelje meg az előző parancsban, hogy ezúttal a Credential paraméter értékeként megadottam a változót $Cred ahelyett, hogy manuálisan kellett volna újra megadni őket.

A lekérdezés kimenete ugyanaz, függetlenül attól, hogy milyen protokollt használ.

Get-CimInstance -CimSession $CimSession -ClassName Win32_BIOS
SMBIOSBIOSVersion : 090006
Manufacturer      : American Megatrends Inc.
Name              : Intel(R) Xeon(R) CPU E3-1505M v5 @ 2.80GHz
SerialNumber      : 7237-7483-8873-8926-7271-5004-86
Version           : VRTUAL - 4001628
PSComputerName    : sql03

A Get-CimSession parancsmaggal megtekintheti, hogy milyen CimSessions csatlakozik jelenleg, és milyen protokollokat használnak.

Get-CimSession
Id           : 1
Name         : CimSession1
InstanceId   : 80742787-e38e-41b1-a7d7-fa1369cf1402
ComputerName : dc01
Protocol     : WSMAN

Id           : 2
Name         : CimSession2
InstanceId   : 8fcabd81-43cf-4682-bd53-ccce1e24aecb
ComputerName : sql03
Protocol     : DCOM

A korábban létrehozott CimSessions lekérdezése és tárolása egy nevű $CimSessionváltozóban.

$CimSession = Get-CimSession

Mindkét számítógépet lekérdezheti egy paranccsal, az egyik a WSMan protokollt, a másikat a DCOM protokollal.

Get-CimInstance -CimSession $CimSession -ClassName Win32_BIOS
SMBIOSBIOSVersion : 090006
Manufacturer      : American Megatrends Inc.
Name              : Intel(R) Xeon(R) CPU E3-1505M v5 @ 2.80GHz
SerialNumber      : 0986-6980-3916-0512-6608-8243-13
Version           : VRTUAL - 4001628
PSComputerName    : dc01

SMBIOSBIOSVersion : 090006
Manufacturer      : American Megatrends Inc.
Name              : Intel(R) Xeon(R) CPU E3-1505M v5 @ 2.80GHz
SerialNumber      : 7237-7483-8873-8926-7271-5004-86
Version           : VRTUAL - 4001628
PSComputerName    : sql03

Számos blogcikket írtam a WMI-ről és a CIM-parancsmagokról. Az egyik leghasznosabb egy olyan függvényről szól, amelyet azért hoztam létre, hogy automatikusan megállapítsam, hogy a WSMan vagy a DCOM használható-e, és automatikusan állítsa be a CIM-munkamenetet anélkül, hogy manuálisan kellene kitalálnia, melyiket. Ez a blogcikk a CimSessions to Remote Computers to Fallback to Dcom használatával történő létrehozásához használható PowerShell-függvény címet tartalmazza.

Ha végzett a CIM-munkamenetekkel, távolítsa el őket a Remove-CimSession parancsmaggal. Az összes CIM-munkamenet eltávolításához egyszerűen pipáljon Get-CimSession ide Remove-CimSession.

Get-CimSession | Remove-CimSession

Összegzés

Ebben a fejezetben megismerkedett azzal, hogyan használhatja a PowerShellt a WMI helyi és távoli számítógépeken való használatához. Azt is megtanulta, hogyan használhatja a CIM-parancsmagokat a távoli számítógépek WSMan vagy DCOM protokollal való használatához.

Áttekintés

  1. Mi a különbség a WMI- és CIM-parancsmagokban?
  2. Alapértelmezés szerint milyen protokollt használ a Get-CimInstance parancsmag?
  3. Milyen előnyökkel jár a CIM-munkamenet használata a számítógépnév Get-CimInstancemegadása helyett?
  4. Hogyan adhat meg alternatív protokollt az alapértelmezett protokolltól eltérően a használathoz Get-CimInstance?
  5. Hogyan zárhatja be vagy távolíthatja el a CIM-munkameneteket?