Sdílet prostřednictvím


Kapitola 7 – Práce s rozhraním WMI

WMI a CIM

Windows PowerShell se ve výchozím nastavení dodává s rutinami pro práci s jinými technologiemi, jako je windows Management Instrumentation (WMI). Rutiny rozhraní WMI jsou zastaralé a nejsou dostupné v PowerShellu 6 nebo novější, ale jsou zde popsané, protože se na ně můžete setkat ve starších skriptech spuštěných ve Windows PowerShellu. Pro nový vývoj použijte místo toho rutiny CIM.

V PowerShellu existuje několik nativních rutin rozhraní WMI, aniž byste museli instalovat jakýkoli jiný software nebo moduly. Get-Command lze použít k určení, které rutiny rozhraní WMI existují ve Windows PowerShellu. Následující výsledky pocházejí ze systému Windows 11 s PowerShellem verze 5.1. Výsledky se můžou lišit v závislosti na verzi PowerShellu, kterou používáte.

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

Rutiny CIM (Common Information Model) byly zavedeny ve verzi PowerShell 3.0 a jsou seskupeny ve vyhrazeném modulu. Pokud chcete zobrazit seznam všech dostupných rutin CIM, použijte rutinu Get-Command s parametrem Module , jak je znázorněno v následujícím příkladu.

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

Rutiny CIM PowerShell vám stále umožňují pracovat s rozhraním WMI, takže se nenechte zmást, když někdo uvádí: "Při dotazování rozhraní WMI pomocí rutin CIM PowerShellu".

Jak jsme už zmínili, rozhraní WMI je samostatná technologie od PowerShellu a právě používáte rutiny CIM pro přístup k rozhraní WMI. Můžete najít starý jazyk VBScript, který používá dotazovací jazyk WMI (WQL) k dotazování rozhraní WMI, například v následujícím příkladu.

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

Dotaz WQL můžete vzít z jazyka VBScript a použít ho s rutinou Get-CimInstance bez jakýchkoli úprav.

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

Předchozí příklad není způsob, jakým obvykle provádím dotazy na WMI pomocí PowerShellu. Funguje ale a umožňuje snadno migrovat existující skripty jazyka Visual Basic do PowerShellu. Při psaní jednořádkového příkazu pro dotazování WMI používám následující syntaxi.

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

Pokud chcete pouze sériové číslo, předejte výstup Select-Object a zadejte pouze SerialNumber vlastnost.

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

Ve výchozím nastavení se při dotazování rozhraní WMI na pozadí načítá několik vlastností, které se nikdy nepoužívají. Při provádění dotazů na rozhraní WMI na místním počítači to nemá velký význam. Jakmile ale začnete dotazovat vzdálené počítače, je to nejen delší doba na zpracování kvůli vracení těchto informací, ale také více nepotřebných informací, které se mají odesílat přes síť. Get-CimInstance má parametr vlastnosti , který omezuje načtené informace, aby byl dotaz rozhraní WMI efektivnější.

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

Předchozí výsledky vrátily objekt. K vrácení řetězce použijte parametr ExpandProperty.

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

Můžete také použít tečkovaný styl syntaxe k vrácení řetězce, což eliminuje nutnost převést na Select-Object.

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

Dotazování vzdálených počítačů pomocí rutin CIM

PowerShell byste měli pořád používat jako místního správce a uživatele domény. Při pokusu o dotazování na informace ze vzdáleného počítače pomocí Get-CimInstance rutiny se zobrazí chybová zpráva o odepření přístupu.

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

Mnoho lidí má obavy o zabezpečení PowerShellu, ale v PowerShellu máte stejná oprávnění jako v GUI. Nic víc a nic méně. Problémem v předchozím příkladu je, že uživatel, který používá PowerShell, nemá oprávnění dotazovat se na informace rozhraní WMI ze serveru DC01. PowerShell můžete znovu spustit jako správce domény, protože Get-CimInstance nemá parametr Credential . To ale není dobrý nápad, protože cokoli, co spouštíte z PowerShellu, by se spustilo jako správce domény. V závislosti na situaci může být tento scénář nebezpečný z hlediska zabezpečení.

Pomocí principu nejnižších oprávnění se přihlašte k účtu správce domény při každém příkazu pomocí parametru Credential, pokud to příkaz umožňuje. Get-CimInstance nemá parametr Credential , takže řešením v tomto scénáři je nejprve vytvoření CimSession . Potom použijte CimSession místo názvu počítače k dotazování rozhraní WMI na vzdáleném počítači.

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

Sezení CIM bylo uloženo v proměnné s názvem $CimSession. Všimněte si, že rutinu Get-Credential zadáte v závorkách, aby se spustila jako první, čímž vás nejprve vyzve k zadání alternativních přihlašovacích údajů, a teprve potom vytvoří novou relaci. Ukážu vám další efektivnější způsob, jak zadat alternativní přihlašovací údaje později v této kapitole, ale je důležité porozumět tomuto základnímu konceptu, než bude složitější.

Teď můžete použít relaci CIM vytvořenou v předchozím příkladu s rutinou Get-CimInstance k dotazování informací o systému BIOS ze služby WMI na vzdáleném počítači.

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

Použití relací CIM má několik dalších výhod místo pouhého zadání názvu počítače. Při spouštění více dotazů na stejný počítač je použití relace CIM efektivnější než použití názvu počítače pro každý dotaz. Vytvoření relace CIM nastaví připojení pouze jednou. Poté více dotazů použije stejnou relaci k získání informací. Použití názvu počítače vyžaduje, aby rutiny nastavily a rušily spojení s každým dotazem.

Rutina Get-CimInstance ve výchozím nastavení používá protokol WSMan, což znamená, že vzdálený počítač potřebuje k připojení PowerShell verze 3.0 nebo vyšší. Ve skutečnosti na verzi PowerShellu nezáleží, důležitá je verze stacku. Verzi zásobníku lze určit pomocí rutiny Test-WSMan. Musí to být verze 3.0, kterou najdete v PowerShellu verze 3.0 a vyšší.

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

Starší rutiny rozhraní WMI používají protokol DCOM, který je kompatibilní se staršími verzemi Windows. Brána firewall však obvykle blokuje objekt DCOM v novějších verzích Windows. Cmdlet New-CimSessionOption umožňuje vytvořit připojení protokolu DCOM pro použití s New-CimSession. Tato možnost umožňuje rutině Get-CimInstance komunikovat s verzemi Windows stejně starými jako Windows Server 2000. Tato schopnost také znamená, že PowerShell není na vzdáleném počítači vyžadován při použití Get-CimInstance rutiny s CimSession nakonfigurovaným tak, aby používal protokol DCOM.

Pomocí rutiny New-CimSessionOption vytvořte možnost protokolu DCOM a uložte ji do proměnné.

$DCOM = New-CimSessionOption -Protocol Dcom

Kvůli efektivitě můžete uložit správce domény nebo přihlašovací údaje se zvýšenými oprávněními do proměnné, abyste je nemuseli neustále zadávat pro každý příkaz.

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

Mám server s názvem SQL03, na kterém běží Windows Server 2008 (ne R2). Jedná se o nejnovější operační systém Windows Server, který ve výchozím nastavení nemá nainstalovaný PowerShell.

Vytvořte cimSession do SQL03 pomocí protokolu DCOM.

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

Všimněte si, že v předchozím příkazu zadáte proměnnou s názvem $Cred jako hodnotu parametru Credential místo ručního zadávání přihlašovacích údajů znovu.

Výstup dotazu je stejný bez ohledu na základní protokol.

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

Tato rutina Get-CimSession slouží k zobrazení aktuálně připojených cimsession a protokolů, které používají.

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

Načtěte a uložte dříve vytvořené cimSessions do proměnné s názvem $CimSession.

$CimSession = Get-CimSession

Zadejte dotaz na oba počítače pomocí jednoho příkazu, přičemž jeden použijte s protokolem WSMan a druhý s 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

Jeden z mých blogových článků o rutinách WMI a CIM obsahuje funkci PowerShellu, která automaticky rozpozná, jestli se má použít WSMan nebo DCOM, a pak nastaví příslušnou relaci CIM pro vás. Další informace najdete v tématu Funkce PowerShellu pro vytváření CimSessions pro vzdálené počítače s přechodem na Dcom.

Až skončíte s relacemi CIM, odeberte je pomocí rutiny Remove-CimSession . Pokud chcete odebrat všechny relace CIM, přesměrujte Get-CimSession do Remove-CimSession.

Get-CimSession | Remove-CimSession

Shrnutí

V této kapitole jste se dozvěděli, jak pomocí PowerShellu pracovat s rozhraním WMI na místních a vzdálených počítačích. Také jste zjistili, jak pomocí rutin CIM pracovat se vzdálenými počítači pomocí protokolů WSMan a DCOM.

Přezkoumání

  1. Jaký je rozdíl mezi rutinami WMI a CIM?
  2. Jaký protokol rutina Get-CimInstance ve výchozím nastavení používá?
  3. Jaké jsou některé výhody použití relace CIM místo zadání názvu počítače?Get-CimInstance
  4. Jak určíte jiný než výchozí protokol pro použití s Get-CimInstance?
  5. Jak zavřete nebo odeberete relace CIM?

Odkazy