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.
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.
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.
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-CimInstancemá parametr Vlastnosti, který omezuje načtené informace. Díky tomu bude dotaz na rozhraní WMI efektivnější.
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.
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.
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.
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šší.
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.
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.
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-CimSessionRemove-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?
Zdroj tohoto obsahu najdete na GitHubu, kde můžete také vytvářet a kontrolovat problémy a žádosti o přijetí změn. Další informace najdete v našem průvodci pro přispěvatele.
Zpětná vazba k produktu PowerShell
PowerShell je open source projekt. Vyberte odkaz pro poskytnutí zpětné vazby:
Tento modul se zabývá technologiemi CIM a WMI pro připojení k běžnému úložišti informací, které obsahuje informace o správě, které můžete dotazovat a manipulovat s nimi. Úložiště obsahuje všechny druhy informací o počítačovém systému nebo zařízení, včetně hardwaru, softwaru, ovladačů hardwaru, komponent, rolí, služeb, uživatelských nastavení a jen o každé konfigurovatelné položce a aktuálním stavu této položky. Znalost architektury a syntaxe CIM a rozhraní WMI vám pomůže znát a řídit téměř všechny aspekty p
As a Windows Server hybrid administrator, you integrate Windows Server environments with Azure services and manage Windows Server in on-premises networks.