Kapitola 7 – Práce s rozhraním WMI
Rozhraní WMI a CIM
Windows PowerShell se ve výchozím nastavení dodává s rutinami pro práci s jinými technologiemi, jako je WMI (Windows Management Instrumentation). 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 další software nebo moduly. Get-Command
lze použít k určení, které rutiny rozhraní WMI existují ve Windows PowerShellu. Následující výsledky jsou z počítače s testovacím prostředím Windows 10, na kterém běží PowerShell verze 5.1. Výsledky se můžou lišit v závislosti na tom, jakou verzi PowerShellu používáte.
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...
Rutiny MODELU CIM (Common Information Model) byly zavedeny v PowerShellu verze 3.0. Rutiny CIM jsou navržené tak, aby je bylo možné používat na počítačích s Windows i bez Windows.
Všechny rutiny CIM jsou obsaženy v modulu. Pokud chcete získat seznam rutin CIM, použijte Get-Command
s parametrem Module , jak je znázorněno v následujícím příkladu.
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
Rutiny CIM vám stále umožňují pracovat s rozhraním WMI, takže se nezaměňujte, když někdo provede příkaz "Při dotazování rozhraní WMI pomocí rutin CIM PowerShellu..."
Jak jsme už zmínili, 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
To není způsob, jakým se obvykle dotazuji na rozhraní WMI pomocí PowerShellu. Funguje to ale a umožňuje snadno migrovat existující skripty VBScript do PowerShellu. Když začnu psát jednosložku pro dotazování rozhraní 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 chci pouze sériové číslo, lze výstup převést do Select-Object
a zadat 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í existuje několik vlastností, které se načítají na pozadí, které se nikdy nepoužívají.
Při dotazování rozhraní WMI na místním počítači nemusí být důležité. Jakmile ale začnete dotazovat vzdálené počítače, je to nejen další doba zpracování, která tyto informace vrací, ale také další nepotřebné informace, které je potřeba stáhnout přes síť. Get-CimInstance
má parametr Vlastnosti, který omezuje načtené informace. Díky tomu bude dotaz na 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í jednoduchého řetězce použijte parametr ExpandProperty .
Get-CimInstance -ClassName Win32_BIOS -Property SerialNumber |
Select-Object -ExpandProperty SerialNumber
3810-1995-1654-4615-2295-2755-89
K vrácení jednoduchého řetězce můžete použít také tečkovaný styl syntaxe. To eliminuje potřebu potrubí do 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
Stále používám PowerShell jako místní správce, který je uživatelem 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:String) [Get-CimI
nstance], CimException
+ FullyQualifiedErrorId : HRESULT 0x80070005,Microsoft.Management.Infrastructure.Cim
Cmdlets.GetCimInstanceCommand
+ PSComputerName : dc01
Mnoho lidí má obavy o zabezpečení, pokud jde o PowerShell, ale pravda je, že v PowerShellu máte přesně stejná oprávnění jako v grafickém uživatelském rozhraní. 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 je možné znovu spustit jako správce domény, protože Get-CimInstance
nemá parametr Credential . Ale věřte mi, že to není dobrý nápad, protože všechno, co spouštím z PowerShellu, by běželo jako správce domény. To může být nebezpečné z hlediska zabezpečení v závislosti na situaci.
Pomocí principu nejnižších oprávnění zvýším úroveň na účet správce domény na základě příkazu pomocí parametru Credential , pokud má nějaký příkaz. Get-CimInstance
nemá parametr Credential , takže řešením v tomto scénáři je nejprve vytvoření CimSession . Potom používám 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
Relace CIM byla uložena v proměnné s názvem $CimSession
. Všimněte si, že jsem také zadal(a) rutinu Get-Credential
v závorkách, aby se nejprve spustila a před vytvořením nové relace mě vyzve k zadání alternativních přihlašovacích údajů. 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é pochopit tento základní koncept před tím, než bude složitější.
Relaci CIM vytvořenou v předchozím příkladu teď můžete použít 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. Pak k načtení informací používá více dotazů stejnou relaci. Použití názvu počítače vyžaduje, aby rutiny nastavily a odbouraly připojení ke každému jednotlivému dotazu.
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 to není verze PowerShellu, která je důležitá, je to verze zásobníku. Verzi zásobníku je možné určit pomocí rutiny Test-WSMan
.
Musí mít verzi 3.0. To je verze, kterou najdete v PowerShellu verze 3.0 a vyšší.
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
Starší rutiny rozhraní WMI používají protokol DCOM, který je kompatibilní se staršími verzemi Windows. Ale DCOM je obvykle blokován bránou firewall v novějších verzích Windows. Rutina New-CimSessionOption
umožňuje vytvořit připojení protokolu DCOM pro použití s New-CimSession
. To umožňuje, aby rutina Get-CimInstance
komunikuje s verzemi Windows stejně starými jako Windows Server 2000. To také znamená, že PowerShell není na vzdáleném počítači vyžadován při použití Get-CimInstance
rutiny s CimSession, která je nakonfigurovaná tak, aby používala 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 v předchozím příkazu, tentokrát jsem zadal proměnnou pojmenovanou $Cred
jako hodnotu parametru Credential , a nemusíte je zadávat ručně znovu.
Výstup dotazu je stejný bez ohledu na použitý 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 Get-CimSession
rutina 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číst a uložit obě dříve vytvořené CimSessions v proměnné s názvem $CimSession
.
$CimSession = Get-CimSession
Dotazujte oba počítače jedním příkazem, jeden pomocí protokolu WSMan a druhého počítače 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
Napsal jsem mnoho blogových článků o rutinách WMI a CIM. Jednou z nejužitečnějších je funkce, kterou jsem vytvořil k automatickému určení, jestli se má použít WSMan nebo DCOM, a nastavit relaci CIM automaticky, aniž byste museli zjistit, kterou relaci ručně. Tento blogový článek má název Funkce PowerShellu pro vytváření cimsession pro vzdálené počítače s náhradní verzí do Dcomu.
Až skončíte s relacemi CIM, měli byste je pomocí rutiny Remove-CimSession
odebrat. Pokud chcete odebrat všechny relace CIM, jednoduše ho nasuňte .Get-CimSession
Remove-CimSession
Get-CimSession | Remove-CimSession
Shrnutí
V této kapitole jste se seznámili s používáním PowerShellu k práci s rozhraním WMI na místních i vzdálených počítačích. Dozvěděli jste se také, jak pomocí rutin CIM pracovat se vzdálenými počítači s protokolem WSMan nebo DCOM.
Přehled
- Jaký je rozdíl v rutinách WMI a CIM?
- Jaký protokol rutina
Get-CimInstance
ve výchozím nastavení používá? - Jaké jsou některé výhody použití relace CIM místo zadání názvu počítače?
Get-CimInstance
- Jak určíte jiný než výchozí protokol pro použití s
Get-CimInstance
? - Jak zavřete nebo odeberete relace CIM?