Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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ához használható parancsmagokkal szállít. 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 bármilyen más szoftvert vagy modult 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 11 rendszerből származnak. Az eredmények a futtatott PowerShell-verziótól függően eltérhetnek.
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 Common Information Model (CIM) parancsmagok a PowerShell 3.0-ban lettek bevezetve, és egy dedikált modulba vannak csoportosítva. Az összes elérhető CIM-parancsmag listázásához használja a Get-Command parancsmagot a Modul paraméterrel, ahogyan az az alábbi példában látható.
Get-Command -Module CimCmdlets
CommandType Name Version
----------- ---- -------
Cmdlet Export-BinaryMiLog 1.0.0.0
Cmdlet Get-CimAssociatedInstance 1.0.0.0
Cmdlet Get-CimClass 1.0.0.0
Cmdlet Get-CimInstance 1.0.0.0
Cmdlet Get-CimSession 1.0.0.0
Cmdlet Import-BinaryMiLog 1.0.0.0
Cmdlet Invoke-CimMethod 1.0.0.0
Cmdlet New-CimInstance 1.0.0.0
Cmdlet New-CimSession 1.0.0.0
Cmdlet New-CimSessionOption 1.0.0.0
Cmdlet Register-CimIndicationEvent 1.0.0.0
Cmdlet Remove-CimInstance 1.0.0.0
Cmdlet Remove-CimSession 1.0.0.0
Cmdlet Set-CimInstance 1.0.0.0
A CIM-parancsmagok továbbra is lehetővé teszik a WMI használatát, ezért ne tévesszen meg senkit, ha valaki a következőt állítja: "Amikor lekérdezem a WMI-t a PowerShell CIM-parancsmagokkal".
Ahogy korábban említettük, a WMI egy külön technológia a PowerShelltől, és csak a CIM-parancsmagokat használja a WMI eléréséhez. Előfordulhat, hogy egy régi VBScriptet talál, 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 a 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
Az előző példa nem az, ahogyan általában lekérdezem a WMI-t a PowerShell-lel. De működik, és lehetővé teszi a meglévő Visual Basic-szkriptek egyszerű migrálását a PowerShellbe. A WMI lekérdezéséhez egysoros parancs írásakor 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é megkapni, irányítsa a kimenetet a Select-Object-re, és adja meg csak a SerialNumber tulajdonságot.
Get-CimInstance -ClassName Win32_BIOS |
Select-Object -Property SerialNumber
SerialNumber
------------
3810-1995-1654-4615-2295-2755-89
Alapértelmezés szerint a WMI lekérdezése során a rendszer a színfalak mögött lekéri a soha nem használt tulajdonságokat. Nem számít sokat a helyi számítógépen végzett WMI-lekérdezés. A távoli számítógépek lekérdezésének megkezdése után azonban nem csak további feldolgozási idő szükséges az információk visszaadásához, hanem a hálózaton keresztüli küldéshez szükséges felesleges információk is.
Get-CimInstance
Tulajdonságparaméterrel rendelkezik, amely korlátozza a lekért információkat, így a WMI-lekérdezés hatékonyabbá válik.
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. 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
Pontozott szintaxis stílust is használhat, hogy egy karakterláncot adjon vissza, ezzel kiküszöbölve annak szükségességét, hogy a kimenetet Select-Object-ra irányítsa.
(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
A PowerShellt továbbra is helyi rendszergazdaként és tartományi felhasználóként kell futtatnia. Amikor egy távoli számítógépről próbál 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:Stri
ng) [Get-CimInstance], CimException
+ FullyQualifiedErrorId : HRESULT 0x80070005,Microsoft.Management.Infra
structure.CimCmdlets.GetCimInstanceCommand
+ PSComputerName : dc01
Sokaknak vannak biztonsági aggályai a PowerShell-lel kapcsolatban, de ön ugyanazokkal az engedélyekkel rendelkezik a PowerShellben, mint a grafikus felhasználói felületen. Annál nem több, és nem is 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. A PowerShellt tartományi rendszergazdaként is újraindíthatja, mivel Get-CimInstance nem rendelkezik hitelesítőadat-paraméterrel . Ez azonban nem jó ötlet, mert a PowerShellből futtatott bármi tartományadminisztrátorként futna. A helyzettől függően ez a forgatókönyv biztonsági szempontból veszélyes lehet.
A minimális jogosultság elvét használva emelje ki a tartománya rendszergazdai fiókját parancsonként a Hitelesítő 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 használja a CimSessiont 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 a Get-Credential parancsmagot zárójelben is meg kell adnia, hogy először végrehajtsa azt, és alternatív hitelesítő adatokat kér az új munkamenet létrehozása előtt. A fejezet későbbi részében egy másik hatékonyabb módszert mutatok be alternatív hitelesítő adatok megadására, de fontos megérteni ezt az alapfogalmat, mielőtt még bonyolultabbá tenném.
Most már használhatja az előző példában létrehozott CIM-munkamenetet a parancsmaggal, Get-CimInstance hogy lekérdezhesse a BIOS-adatokat a WMI-ből 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 egyéb előnye is van a számítógép nevének 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ép nevének használatához a parancsmagoknak be kell állítaniuk és fel kell bontaniuk a kapcsolatot minden egyes lekérdezéssel.
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 veremverzió. A verem verziója a Test-WSMan parancsmaggal határozható meg.
Ennek a 3.0-s verziónak kell lennie, 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/wsmanidentit
y.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 tűzfal azonban általában letiltja a DCOM-t a Windows újabb verzióiban. A New-CimSessionOption parancsmag lehetővé teszi, hogy létrehozz egy DCOM protokollkapcsolatot, amely New-CimSession-val való használatra alkalmas. Ez a beállítás lehetővé teszi, hogy a Get-CimInstance parancsmag a Windows Server 2000-zel megegyező régi Windows-verziókkal kommunikáljon. Ez a képesség azt is jelenti, hogy nincs szükség a PowerShellre a távoli számítógépen, 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 a $Cred paraméter értékeként elnevezett változót adja meg ahelyett, hogy ismét manuálisan adja meg a hitelesítő adatokat.
A lekérdezés kimenete a mögöttes protokolltól függetlenül ugyanaz.
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 láthatja, 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érése és tárolása egy nevesített $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
A WMI-ről és a CIM-parancsmagokról szóló egyik blogbejegyzésem tartalmaz egy PowerShell-függvényt, amely automatikusan észleli, hogy a WSMant vagy a DCOM-t használja-e, majd beállítja önnek a megfelelő CIM-munkamenetet. További információ: PowerShell-függvény CimSessionök létrehozásához távoli számítógépekre DCOM-ra történő visszaeséssel.
Amikor befejezi a CIM-munkameneteket, távolítsa el őket a Remove-CimSession parancsmaggal. Az összes CIM-munkamenet eltávolításához irányítson Get-CimSession a Remove-CimSession-be.
Get-CimSession | Remove-CimSession
Összefoglalá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 távoli számítógépeken a WSMan és a DCOM protokollok használatával.
Felülvizsgálat
- Mi a különbség a WMI- és CIM-parancsmagokban?
- Alapértelmezés szerint milyen protokollt használ a
Get-CimInstanceparancsmag? - Milyen előnyökkel jár a CIM-munkamenet használata a számítógépnév
Get-CimInstancemegadása helyett? - Hogyan adhat meg egy másik protokollt az alapértelmezett helyett a
Get-CimInstancehasználatához? - Hogyan zárhatja be vagy távolíthatja el a CIM-munkameneteket?