Rozdział 7 — praca z usługą WMIChapter 7 - Working with WMI

Usługa WMI i model wspólnych informacjiWMI and CIM

Program PowerShell jest domyślnie dostarczany z poleceniami cmdlet do pracy z innymi technologiami, takimi jak Instrumentacja zarządzania Windows (WMI).PowerShell ships by default with cmdlets for working with other technologies such as Windows Management Instrumentation (WMI). Istnieje kilka natywnych poleceń cmdlet usługi WMI, które istnieją w programie PowerShell bez konieczności instalowania żadnego dodatkowego oprogramowania lub modułów.There are several native WMI cmdlets that exist in PowerShell without having to install any additional software or modules.

Program PowerShell ma polecenia cmdlet do pracy z usługą WMI od początku.PowerShell has had cmdlets for working with WMI since the beginning. Get-Commandmoże służyć do określenia, jakie polecenia cmdlet usługi WMI istnieją w programie PowerShell.Get-Command can be used to determine what WMI cmdlets exist in PowerShell. Poniżej znajdują się następujące wyniki z komputera ze środowiskiem laboratoryjnym systemu Windows 10, na którym działa program PowerShell w wersji 5,1.The following results are from my Windows 10 lab environment computer that is running PowerShell version 5.1. Wyniki mogą się różnić w zależności od używanej wersji programu PowerShell.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...

Polecenia cmdlet model wspólnych informacji (CIM) zostały wprowadzone w programie PowerShell w wersji 3,0.Common Information Model (CIM) cmdlets were introduced in PowerShell version 3.0. Polecenia cmdlet modelu wspólnych informacji są zaprojektowane tak, aby mogły być używane na komputerach z systemem Windows i innym niż Windows.The CIM cmdlets are designed so they can be used on both Windows and non-Windows machines. Polecenia cmdlet usługi WMI są przestarzałe, dlatego zalecamy korzystanie z poleceń cmdlet modelu wspólnych informacji zamiast starszych wersji usługi WMI.The WMI cmdlets are deprecated so my recommendation is to use the CIM cmdlets instead of the older WMI ones.

Polecenia cmdlet modelu wspólnych informacji są zawarte w module.The CIM cmdlets are all contained within a module. Aby uzyskać listę poleceń cmdlet modelu wspólnych informacji, użyj polecenia Get-Command z parametrem modułu , jak pokazano w poniższym przykładzie.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

Polecenia cmdlet modelu wspólnych informacji umożliwiają korzystanie z usługi WMI, dlatego nie należy mylić, gdy ktoś wykonuje instrukcję "podczas wysyłania zapytania do usługi WMI za pomocą poleceń cmdlet programu PowerShell..."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..."

Jak wcześniej wspomniano, usługa WMI jest oddzielną technologią od programu PowerShell i właśnie korzystasz z poleceń cmdlet modelu CIM do uzyskiwania dostępu do usługi WMI.As I previously mentioned, WMI is a separate technology from PowerShell and you're just using the CIM cmdlets for accessing WMI. Możesz znaleźć stary skrypt VBScript, który używa język zapytań usługi WMI (WQL) do wysyłania zapytań do usługi WMI, takich jak w poniższym przykładzie.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

Można wykonać zapytanie WQL z tego skryptu VBScript i użyć go z Get-CimInstance poleceniem cmdlet bez żadnych modyfikacji.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

Nie jest to zwykle Kwerenda WMI przy użyciu programu PowerShell.That's not how I typically query WMI with PowerShell. Jednak działa i pozwala łatwo migrować istniejące skrypty VBScript do programu PowerShell.But it does work and allows you to easily migrate existing VBScripts to PowerShell. Po rozpoczęciu pisania jednoliniowego w celu wykonania zapytania w usłudze WMI należy użyć następującej składni.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

Jeśli chcę tylko numer seryjny, mogę przekazać dane wyjściowe do Select-Object i określić tylko Właściwość numer seryjny .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

Domyślnie istnieje kilka właściwości, które są pobierane w tle, które nigdy nie są używane.By default, there are several properties that are retrieved behind the scenes that are never used. Wysyłanie zapytań do usługi WMI na komputerze lokalnym może nie mieć znaczenia.It may not matter much when querying WMI on the local computer. Jednak po uruchomieniu zapytania o komputery zdalne nie jest to dodatkowy czas przetwarzania, aby zwrócić te informacje, ale również dodatkowe informacje potrzebne do ściągnięcia przez sieć.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-CimInstancema parametr Właściwości , który ogranicza pobrane informacje.Get-CimInstance has a Property parameter that limits the information that's retrieved. To sprawia, że zapytanie jest wydajniejsze w usłudze WMI.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

Poprzednie wyniki zwróciły obiekt.The previous results returned an object. Aby zwrócić prosty ciąg, użyj parametru ExpandProperty .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

Do zwrócenia prostego ciągu można także użyć stylu składni kropkowanej.You could also use the dotted style of syntax to return a simple string. Eliminuje to potrzebę potoku 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

Wysyłanie zapytań do komputerów zdalnych za pomocą poleceń cmdlet modelu wspólnych informacjiQuery Remote Computers with the CIM cmdlets

Nadal uruchamiam program PowerShell jako administrator lokalny, który jest użytkownikiem domeny.I'm still running PowerShell as a local admin who is a domain user. Gdy próbuję zbadać informacje z komputera zdalnego za pomocą Get-CimInstance polecenia cmdlet, otrzymuję komunikat o błędzie odmowy dostępu.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

Wiele osób ma problemy związane z bezpieczeństwem, które są dostępne w programie PowerShell, ale prawdziwie ma dokładnie te same uprawnienia w programie PowerShell, jak w interfejsie użytkownika.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. Dopasowanie jest dokładne.No more and no less. W poprzednim przykładzie wystąpił problem polegający na tym, że użytkownik uruchamiający program PowerShell nie ma uprawnień do wykonywania zapytań dotyczących informacji WMI z serwera DC01.The problem in the previous example is that the user running PowerShell doesn't have rights to query WMI information from the DC01 server. Można ponownie uruchomić program PowerShell jako administrator domeny, ponieważ Get-CimInstance nie ma parametru Credential .I could relaunch PowerShell as a domain administrator since Get-CimInstance doesn't have a Credential parameter. Jednak Ufaj mi, który nie jest dobrym pomysłem, ponieważ wszystkie uruchomienia z programu PowerShell byłyby uruchomione jako administrator domeny. Może to być niebezpieczne z punktu widzenia zabezpieczeń w zależności od sytuacji.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.

Korzystając z zasady najniższych uprawnień, Podnieś poziom do konta administratora domeny dla poszczególnych poleceń przy użyciu parametru Credential , jeśli polecenie ma jeden z nich.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-CimInstancenie ma parametru Credential , dlatego rozwiązanie w tym scenariuszu ma najpierw utworzyć CimSession .Get-CimInstance doesn't have a Credential parameter so the solution in this scenario is to create a CimSession first. Następnie używam CimSession zamiast nazwy komputera do wysyłania zapytań do usługi WMI na komputerze zdalnym.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

Sesja CIM była przechowywana w zmiennej o nazwie $CimSession .The CIM session was stored in a variable named $CimSession. Należy zauważyć, że Get-Credential w nawiasach określono również polecenie cmdlet, tak aby było wykonywane jako pierwsze, Monituj mnie o poświadczenia alternatywne przed utworzeniem nowej sesji.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. Pokażę jeszcze inny sposób, aby określić alternatywne poświadczenia w dalszej części tego rozdziału, ale ważne jest, aby zrozumieć te podstawowe koncepcje przed bardziej skomplikowanym użyciem.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.

W poprzednim przykładzie można teraz używać sesji CIM, Get-CimInstance która umożliwia wykonywanie zapytań dotyczących informacji o systemie BIOS z usługi WMI na komputerze zdalnym.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

Istnieje kilka dodatkowych korzyści związanych z korzystaniem z sesji modelu wspólnych informacji zamiast określania nazwy komputera.There are several additional benefits to using CIM sessions instead of just specifying a computer name. W przypadku uruchamiania wielu zapytań na tym samym komputerze korzystanie z sesji modelu wspólnych informacji jest wydajniejsze niż używanie nazwy komputera dla każdego zapytania.When running multiple queries to the same computer, using a CIM session is more efficient than using the computer name for each query. Tworzenie sesji modelu wspólnych informacji powoduje tylko jednokrotne połączenie.Creating a CIM session only sets up the connection once. Następnie wiele zapytań używa tej samej sesji do pobierania informacji.Then, multiple queries use that same session to retrieve information. Użycie nazwy komputera wymaga, aby polecenia cmdlet zostały skonfigurowane i rozłączyć połączenie z każdym indywidualnym zapytaniem.Using the computer name requires the cmdlets to set up and tear down the connection with each individual query.

Get-CimInstancePolecenie cmdlet domyślnie używa protokołu WSMan, co oznacza, że komputer zdalny wymaga programu PowerShell w wersji 3,0 lub nowszej, aby można było nawiązać połączenie.The Get-CimInstance cmdlet uses the WSMan protocol by default, which means the remote computer needs PowerShell version 3.0 or higher to connect. W rzeczywistości nie jest to wersja programu PowerShell, która jest wersją stosu.It's actually not the PowerShell version that matters, it's the stack version. Wersję stosu można określić przy użyciu Test-WSMan polecenia cmdlet.The stack version can be determined using the Test-WSMan cmdlet. Musi być w wersji 3,0.It needs to be version 3.0. Jest to wersja znaleziona w programie PowerShell w wersji 3,0 lub nowszej.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

Starsze polecenia cmdlet usługi WMI używają protokołu DCOM, który jest zgodny ze starszymi wersjami systemu Windows.The older WMI cmdlets use the DCOM protocol, which is compatible with older versions of Windows. Jednak model DCOM jest zwykle blokowany przez zaporę w nowszych wersjach systemu Windows.But DCOM is typically blocked by the firewall on newer versions of Windows. New-CimSessionOptionPolecenie cmdlet umożliwia utworzenie połączenia protokołu DCOM do użytku z programem New-CimSession .The New-CimSessionOption cmdlet allows you to create a DCOM protocol connection for use with New-CimSession. Dzięki temu Get-CimInstance można użyć polecenia cmdlet do komunikowania się z wersjami systemu Windows jako starych jako Windows Server 2000.This allows the Get-CimInstance cmdlet to be used to communicate with versions of Windows as old as Windows Server 2000. Oznacza to również, że program PowerShell nie jest wymagany na komputerze zdalnym podczas korzystania Get-CimInstance z polecenia cmdlet z CimSession, który jest skonfigurowany do korzystania z protokołu DCOM.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.

Utwórz opcję protokołu DCOM przy użyciu New-CimSessionOption polecenia cmdlet i Zapisz ją w zmiennej.Create the DCOM protocol option using the New-CimSessionOption cmdlet and store it in a variable.

$DCOM = New-CimSessionOption -Protocol Dcom

W celu zapewnienia wydajności można przechowywać poświadczenia administratora domeny lub podwyższony poziom uprawnień w zmiennej, dzięki czemu nie trzeba stale wprowadzać ich dla każdego polecenia.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

Mam serwer o nazwie SQL03 z systemem Windows Server 2008 (nie R2).I have a server named SQL03 that runs Windows Server 2008 (non-R2). Jest to najnowszy system operacyjny Windows Server, w którym program PowerShell nie jest instalowany domyślnie.It's the newest Windows Server operating system that doesn't have PowerShell installed by default.

Utwórz CimSession do SQL03 przy użyciu protokołu DCOM.Create a CimSession to SQL03 using the DCOM protocol.

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

Zwróć uwagę w poprzednim poleceniu, tym razem, kiedy określono zmienną o nazwie $Cred jako wartość parametru Credential zamiast konieczności ręcznego wprowadzania ich ręcznie.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.

Dane wyjściowe zapytania są takie same, niezależnie od używanego protokołu źródłowego.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

Get-CimSessionPolecenie cmdlet służy do sprawdzenia, jakie CimSessions są obecnie połączone i jakich protokołów używa.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

Pobieranie i przechowywanie obu wcześniej utworzonych CimSessions w zmiennej o nazwie $CimSession .Retrieve and store both of the previously created CimSessions in a variable named $CimSession.

$CimSession = Get-CimSession

Wykonaj zapytanie dotyczące obu komputerów za pomocą jednego polecenia, jednego przy użyciu protokołu WSMan i drugiego z modelem DCOM.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

Zapisałem wiele artykułów blogów dotyczących usługi WMI i poleceń cmdlet modelu wspólnych informacji.I've written numerous blog articles about the WMI and CIM cmdlets. Jednym z najbardziej przydatnych jest funkcja, która została utworzona, aby automatycznie określać, czy należy użyć usługi WSMan lub DCOM, i skonfigurować ją automatycznie, bez konieczności podawania ręcznie.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. Ten artykuł w blogu jest zatytułowany Funkcja programu PowerShell do tworzenia CimSessions na komputerach zdalnych z alternatywą dla modelu DCOM.That blog article is titled PowerShell Function to Create CimSessions to Remote Computers with Fallback to Dcom.

Po zakończeniu pracy z sesjami CIM należy je usunąć za pomocą Remove-CimSession polecenia cmdlet.When you're finished with the CIM sessions, you should remove them with the Remove-CimSession cmdlet. Aby usunąć wszystkie sesje modelu wspólnych informacji, wystarczy potoku Get-CimSession do Remove-CimSession .To remove all CIM sessions, simply pipe Get-CimSession to Remove-CimSession.

Get-CimSession | Remove-CimSession

PodsumowanieSummary

W tym rozdziale zawarto informacje na temat używania programu PowerShell do pracy z usługą WMI na komputerach lokalnych i zdalnych.In this chapter, you've learned about using PowerShell to work with WMI on both local and remote computers. Wiesz również, jak używać poleceń cmdlet modelu CIM do pracy z komputerami zdalnymi przy użyciu protokołu WSMan lub DCOM.You've also learned how to use the CIM cmdlets to work with remote computers with both the WSMan or DCOM protocol.

PrzeglądReview

  1. Jaka jest różnica w poleceniach cmdlet usługi WMI i modelu wspólnych informacji?What is the difference in the WMI and CIM cmdlets?
  2. Domyślnie jakiego protokołu Get-CimInstance używa polecenie cmdlet?By default, what protocol does the Get-CimInstance cmdlet use?
  3. Jakie są zalety korzystania z sesji CIM zamiast określania nazwy komputera z Get-CimInstance ?What are some of the benefits of using a CIM session instead of specifying a computer name with Get-CimInstance?
  4. Jak określić alternatywny protokół inny niż domyślny, który ma być używany z Get-CimInstance ?How do you specify an alternate protocol other than the default one for use with Get-CimInstance?
  5. Jak zamknąć lub usunąć sesje modelu wspólnych informacji?How do you close or remove CIM sessions?