Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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í
- Jaký je rozdíl mezi rutinami WMI a CIM?
- Jaký protokol rutina
Get-CimInstanceve 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?