7. fejezet – a WMI használataChapter 7 - Working with WMI

WMI és CIMWMI and CIM

A PowerShell-hajók alapértelmezés szerint parancsmagokkal működnek más technológiák, például a Windows Management Instrumentation (WMI) használatához.PowerShell ships by default with cmdlets for working with other technologies such as Windows Management Instrumentation (WMI). Számos natív WMI-parancsmag létezik a PowerShellben anélkül, hogy további szoftvereket vagy modulokat kellene telepítenie.There are several native WMI cmdlets that exist in PowerShell without having to install any additional software or modules.

A PowerShell-parancsmagok a WMI-vel való együttműködéshez szükségesek.PowerShell has had cmdlets for working with WMI since the beginning. Get-Commanda használatával meghatározható, hogy milyen WMI-parancsmagok léteznek a PowerShellben.Get-Command can be used to determine what WMI cmdlets exist in PowerShell. A következő eredmények a Windows 10 Lab-környezetű, a PowerShell 5,1-es verzióját futtató számítógépről származnak.The following results are from my Windows 10 lab environment computer that is running PowerShell version 5.1. Az eredmények a futtatott PowerShell-verziótól függően eltérőek lehetnek.Your results may differ depending on what PowerShell version you're running.

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 CIM-(CIM-) parancsmagok a PowerShell 3,0-es verziójában lettek bevezetve.Common Information Model (CIM) cmdlets were introduced in PowerShell version 3.0. A CIM-parancsmagok úgy vannak kialakítva, hogy a Windows és a nem Windows rendszerű gépeken is használhatók legyenek.The CIM cmdlets are designed so they can be used on both Windows and non-Windows machines. A WMI-parancsmagok elavultak, ezért a régebbi WMI helyett a CIM-parancsmagok használatát javasoljuk.The WMI cmdlets are deprecated so my recommendation is to use the CIM cmdlets instead of the older WMI ones.

A CIM-parancsmagok egy modulon belül találhatók.The CIM cmdlets are all contained within a module. A CIM-parancsmagok listájának beszerzéséhez használja a Get-Command modul paraméterét az alábbi példában látható módon.To obtain a list of the CIM cmdlets, use Get-Command with the Module parameter as shown in the following example.

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évesztendő össze, ha valaki "Mikor kérdezi le a WMI-t a PowerShell CIM-parancsmagokkal..." utasítással.The CIM cmdlets still allow you to work with WMI so don't be confused when someone makes the statement "When I query WMI with the PowerShell CIM cmdlets..."

Ahogy korábban már említettük, a WMI a PowerShell egy különálló technológiája, és csak a CIM-parancsmagokat használja a WMI eléréséhez.As I previously mentioned, WMI is a separate technology from PowerShell and you're just using the CIM cmdlets for accessing WMI. Előfordulhat, hogy olyan régi VBScriptet talál, amely WMI Query Language (WQL) használatával kérdezi le a WMI-t, például az alábbi példában.You may find an old VBScript that uses WMI Query Language (WQL) to query WMI such as in the following example.

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 VBScript-ből végezheti el, és a Get-CimInstance parancsmag módosítás nélkül is használható.You can take the WQL query from that VBScript and use it with the Get-CimInstance cmdlet without any modifications.

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

Ez nem az, hogy általában hogyan kérdezem le a WMI-t a PowerShell használatával.That's not how I typically query WMI with PowerShell. Ez azonban nem működik, és lehetővé teszi a meglévő VBScript-fájlok a PowerShellbe való egyszerű áttelepíthetővé tételét.But it does work and allows you to easily migrate existing VBScripts to PowerShell. Amikor elkezdek egy egybéléses lekérdezést a WMI lekérdezéséhez, a következő szintaxist használjuk.When I start out writing a one-liner to query WMI, I use the following syntax.

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 használni, a kimenetet Átadhatom, Select-Object és csak a serialnumber tulajdonságot adhatja meg.If I only want the serial number, I can pipe the output to Select-Object and specify only the SerialNumber property.

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

Alapértelmezés szerint számos olyan tulajdonság van, amelyet a rendszer soha nem használt színfalak mögött olvas be.By default, there are several properties that are retrieved behind the scenes that are never used. Előfordulhat, hogy a WMI helyi számítógépen való lekérdezése nem számít nagy mértékben.It may not matter much when querying WMI on the local computer. A távoli számítógépek lekérdezésének megkezdése után azonban nem csak a további feldolgozási időt kell visszaadnia, hanem további szükségtelen információkat is meg kell adnia a hálózaton keresztül.But once you start querying remote computers, it's not only additional processing time to return that information, but also additional unnecessary information to have to pull across the network. Get-CimInstancerendelkezik egy tulajdonság -paraméterrel, amely korlátozza a beolvasott adatokat.Get-CimInstance has a Property parameter that limits the information that's retrieved. Így hatékonyabbá válik a lekérdezés a WMI-hez.This makes the query to WMI more efficient.

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 adtak vissza.The previous results returned an object. Egyszerű karakterlánc visszaadásához használja a ExpandProperty paramétert.To return a simple string, use the ExpandProperty parameter.

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

A szintaxis pontozott stílusa egy egyszerű karakterlánc visszaadására is használható.You could also use the dotted style of syntax to return a simple string. Így nincs szükség a csővezetékek elérésére Select-Object .This eliminates the need to pipe to 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 a CIM-parancsmagokkalQuery Remote Computers with the CIM cmdlets

Továbbra is a PowerShellt futtatom helyi rendszergazdaként, aki tartományi felhasználó.I'm still running PowerShell as a local admin who is a domain user. Amikor egy távoli számítógépről próbálok adatokat lekérdezni a Get-CimInstance parancsmag használatával, a rendszer hozzáférés-megtagadási hibaüzenetet kap.When I try to query information from a remote computer using the Get-CimInstance cmdlet, I receive an access denied error message.

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

Sokan rendelkeznek a PowerShell-lel kapcsolatos biztonsági kérdésekkel, de az igazság az, hogy pontosan ugyanazok a jogosultságai vannak a PowerShellben, mint a grafikus felhasználói felületen.Many people have security concerns when it comes to PowerShell, but the truth is you have exactly the same permissions in PowerShell as you do in the GUI. Annál nem több, és nem is kevesebb.No more and no less. Az előző példában szereplő probléma az, hogy a PowerShellt futtató felhasználónak nincs jogosultsága a WMI-információk lekérdezésére a DC01-kiszolgálóról.The problem in the previous example is that the user running PowerShell doesn't have rights to query WMI information from the DC01 server. Újra lehet indítani a PowerShellt tartományi rendszergazdaként, mert Get-CimInstance nem rendelkezik hitelesítő paraméterrel.I could relaunch PowerShell as a domain administrator since Get-CimInstance doesn't have a Credential parameter. Hidd el azonban, hogy nem jó ötlet, mert a PowerShellből futtatott bármit tartományi rendszergazdaként kellene futtatni. Ez a helyzettől függően biztonsági szempontból veszélyes lehet.But, trust me, that isn't a good idea because then anything that I run from PowerShell would be running as a domain admin. That could be dangerous from a security standpoint depending on the situation.

A minimális jogosultság elve alapján a tartományi rendszergazdai fiókot a hitelesítő adatok paraméter használatával emelem, ha egy parancs rendelkezik ilyennel.Using the principle of least privilege, I elevate to my domain admin account on a per command basis using the Credential parameter, if a command has one. Get-CimInstancenem rendelkezik hitelesítő adatokkal , így az ebben a forgatókönyvben szereplő megoldás egy CimSession létrehozása először.Get-CimInstance doesn't have a Credential parameter so the solution in this scenario is to create a CimSession first. Ezt követően a számítógép neve helyett a CimSession használja a WMI távoli számítógépen való lekérdezéséhez.Then I use the CimSession instead of a computer name to query WMI on the remote computer.

$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-munkamenetet egy nevű változó tárolja $CimSession .The CIM session was stored in a variable named $CimSession. Figyelje meg, hogy a Get-Credential parancsmagot zárójelek között is megadta, hogy először végrehajtsa az új munkamenet létrehozása előtt a másodlagos hitelesítő adatok megadását.Notice that I also specified the Get-Credential cmdlet in parentheses so that it executes first, prompting me for alternate credentials, before creating the new session. Megmutatom, hogy a jelen fejezet későbbi részében további hatékonyabban kell megadnia az alternatív hitelesítő adatokat, de ez az alapszintű koncepció ismerete még bonyolultabbá válik.I'll show you another more efficient way to specify alternate credentials later in this chapter, but it's important to understand this basic concept before making it more complicated.

Az előző példában létrehozott CIM-munkamenet mostantól használhatja a Get-CimInstance parancsmagot a BIOS-információk lekérdezéséhez a távoli számítógépen lévő WMI-adatokból.The CIM session created in the previous example can now be used with the Get-CimInstance cmdlet to query the BIOS information from WMI on the remote computer.

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ép nevének megadása helyett.There are several additional benefits to using CIM sessions instead of just specifying a computer name. Több lekérdezés ugyanarra a számítógépre való futtatásakor a CIM-munkamenet hatékonyabb, mint az egyes lekérdezésekhez tartozó számítógépnév használata.When running multiple queries to the same computer, using a CIM session is more efficient than using the computer name for each query. A CIM-munkamenetek létrehozása csak egyszer állítja be a kapcsolatot.Creating a CIM session only sets up the connection once. Ezután több lekérdezés ugyanazt a munkamenetet használja az információk lekéréséhez.Then, multiple queries use that same session to retrieve information. A számítógépnév használata megköveteli, hogy a parancsmagok a kapcsolat beállítását és lebontását használják az egyes lekérdezésekkel.Using the computer name requires the cmdlets to set up and tear down the connection with each individual query.

A Get-CimInstance parancsmag alapértelmezés szerint a WSMan protokollt használja, ami azt jelenti, hogy a távoli számítógépen a 3,0-es vagy újabb PowerShell-verzió szükséges a kapcsolódáshoz.The Get-CimInstance cmdlet uses the WSMan protocol by default, which means the remote computer needs PowerShell version 3.0 or higher to connect. Valójában nem a PowerShell verziószáma, hanem a verem verziója.It's actually not the PowerShell version that matters, it's the stack version. A verem verziója a parancsmag használatával határozható meg Test-WSMan .The stack version can be determined using the Test-WSMan cmdlet. Az 3,0-es verziónak kell lennie.It needs to be version 3.0. Ez a verzió a PowerShell 3,0-es és újabb verziójában található.That's the version you'll find with PowerShell version 3.0 and higher.

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.The older WMI cmdlets use the DCOM protocol, which is compatible with older versions of Windows. A Windows újabb verzióiban azonban általában a tűzfal blokkolja a DCOM-ot.But DCOM is typically blocked by the firewall on newer versions of Windows. A New-CimSessionOption parancsmaggal létrehozható egy DCOM protokoll-kapcsolat, amellyel a használható New-CimSession .The New-CimSessionOption cmdlet allows you to create a DCOM protocol connection for use with New-CimSession. Ez lehetővé teszi, hogy a parancsmag a Windows Get-CimInstance Server 2000-es verzióval való kommunikációra használható legyen.This allows the Get-CimInstance cmdlet to be used to communicate with versions of Windows as old as Windows Server 2000. Ez azt is jelenti, hogy a PowerShell nem szükséges a távoli számítógépen, ha a Get-CimInstance parancsmagot olyan CimSession használja, amely a DCOM protokoll használatára van konfigurálva.This also means that PowerShell is not required on the remote computer when using the Get-CimInstance cmdlet with a CimSession that's configured to use the DCOM protocol.

Hozza létre a DCOM protokoll lehetőséget a New-CimSessionOption parancsmag használatával, és tárolja egy változóban.Create the DCOM protocol option using the New-CimSessionOption cmdlet and store it in a variable.

$DCOM = New-CimSessionOption -Protocol Dcom

A hatékonyság érdekében egy változóban tárolhatja a tartományi rendszergazda vagy emelt szintű hitelesítő adatokat, így nem kell állandóan megadnia őket az egyes parancsokhoz.For efficiency, you can store your domain administrator or elevated credentials in a variable so you don't have to constantly enter them for each command.

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

Van egy SQL03 nevű kiszolgáló, amely a Windows Server 2008 (nem R2) rendszert futtatja.I have a server named SQL03 that runs Windows Server 2008 (non-R2). Ez a legújabb Windows Server operációs rendszer, amelyen alapértelmezés szerint nincs telepítve a PowerShell.It's the newest Windows Server operating system that doesn't have PowerShell installed by default.

Hozzon létre egy CimSession a SQL03 a DCOM protokoll használatával.Create a CimSession to SQL03 using the DCOM protocol.

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

Figyelje meg, hogy az előző parancsban ezúttal a $Cred hitelesítőadat -paraméter értékének megadását adta meg, ahelyett, hogy manuálisan kellene megadnia őket.Notice in the previous command, this time I specified the variable named $Cred as the value for the Credential parameter instead of having to enter them manually again.

A lekérdezés kimenete azonos az alapul szolgáló protokolltól függetlenül.The output of the query is the same regardless of the underlying protocol being used.

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 parancsmag segítségével megtekintheti, hogy az aktuálisan csatlakoztatott CimSessions és milyen protokollokat használnak.The Get-CimSession cmdlet is used to see what CimSessions are currently connected and what protocols they're using.

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 beolvasása és tárolása egy nevű változóban $CimSession .Retrieve and store both of the previously created CimSessions in a variable named $CimSession.

$CimSession = Get-CimSession

Mindkét számítógép lekérdezése egyetlen paranccsal, egyet a WSMan protokoll és a másik a DCOM használatával.Query both of the computers with one command, one using the WSMan protocol and the other one with DCOM.

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 blogbejegyzéset írt a WMI-és CIM-parancsmagokról.I've written numerous blog articles about the WMI and CIM cmdlets. Az egyik leghasznosabb egy olyan függvény, amelyet úgy hoztam létre, hogy automatikusan meghatározza, hogy a WSMan vagy a DCOM szolgáltatást kell-e használni, és a CIM-munkamenetet automatikusan kell beállítani, anélkül, hogy egy kézzel kellene kideríteni.One of the most useful ones is about a function that I created to automatically determine if WSMan or DCOM should be used and set up the CIM session automatically without having to figure out which one manually. Ez a blogbejegyzés a PowerShell- [függvényt ismerteti, hogy CimSessions hozzon létre a távoli számítógépekre, a DCOM tartalékával][].That blog article is titled PowerShell Function to Create CimSessions to Remote Computers with Fallback to Dcom.

Ha végzett a CIM-munkamenetekkel, távolítsa el őket a Remove-CimSession parancsmaggal.When you're finished with the CIM sessions, you should remove them with the Remove-CimSession cmdlet. Ha az összes CIM-munkamenetet el szeretné távolítani, egyszerűen Get-CimSession a pipe-ot Remove-CimSession .To remove all CIM sessions, simply pipe Get-CimSession to Remove-CimSession.

Get-CimSession | Remove-CimSession

ÖsszefoglalásSummary

Ebben a fejezetben megtanulta, hogyan használhatja a PowerShellt a WMI helyi és távoli számítógépeken való használatához.In this chapter, you've learned about using PowerShell to work with WMI on both local and remote computers. Azt is megtanulta, hogyan használhatja a CIM-parancsmagokat a távoli számítógépekkel való együttműködésre a WSMan vagy DCOM protokollal.You've also learned how to use the CIM cmdlets to work with remote computers with both the WSMan or DCOM protocol.

ÁttekintésReview

  1. Mi a különbség a WMI-és CIM-parancsmagokban?What is the difference in the WMI and CIM cmdlets?
  2. Alapértelmezés szerint milyen protokollt Get-CimInstance használ a parancsmag?By default, what protocol does the Get-CimInstance cmdlet use?
  3. Milyen előnyökkel jár a CIM-munkamenetek használata a számítógépnév megadása helyett Get-CimInstance ?What are some of the benefits of using a CIM session instead of specifying a computer name with Get-CimInstance?
  4. Hogyan adhat meg alternatív protokollt az alapértelmezetttől eltérőként a szolgáltatáshoz való használatra Get-CimInstance ?How do you specify an alternate protocol other than the default one for use with Get-CimInstance?
  5. Hogyan zárhatja be vagy távolítsa el a CIM-munkameneteket?How do you close or remove CIM sessions?