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-CimInstance
Tulajdonsá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-CimInstance
nem 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 $CimSession
lett 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-CimSession
való 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ű $CimSession
vá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
- Mi a különbség a WMI- és CIM-parancsmagokban?
- Alapértelmezés szerint milyen protokollt használ a
Get-CimInstance
parancsmag? - Milyen előnyökkel jár a CIM-munkamenet használata a számítógépnév
Get-CimInstance
megadása helyett? - Hogyan adhat meg alternatív protokollt az alapértelmezett protokolltól eltérően a használathoz
Get-CimInstance
? - Hogyan zárhatja be vagy távolíthatja el a CIM-munkameneteket?
Ajánlott forrásanyag
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: