Sdílet prostřednictvím


Vytvoření skriptu rozhraní WMI

Pomocí skriptů můžete zobrazit nebo manipulovat s informacemi dostupnými prostřednictvím rozhraní WMI. Skripty lze psát v libovolném skriptovacím jazyce, který podporuje hostování skriptů Microsoft ActiveX, včetně jazyka Visual Basic Scripting Edition (VBScript), PowerShellu a Perl. Skripty rozhraní WMI mohou být hostovány ve Windows Script Host (WSH), na Active Server Pages a v Internet Exploreru.

Poznámka

Primární skriptovací jazyk, který rozhraní WMI aktuálně podporuje, je PowerShell. Rozhraní WMI však také zahrnuje rozsáhlou podporu skriptování pro VBScript a další jazyky, které přistupují k rozhraní API pro skriptování pro rozhraní WMI.

 

Skriptovací jazyky služby WMI

Mezi dva hlavní jazyky podporované rozhraním WMI patří PowerShell a VBScript (prostřednictvím služby Windows Script Host nebo WSH).

  • PowerShell byl navržen s důrazem na úzkou integraci s WMI. Proto je většina základních prvků rozhraní WMI integrovaná do rutin rozhraní WMI: Get-WmiObject, Set-WmiInstance, Invoke-WmiMethoda Remove-WmiObject. Následující tabulka popisuje obecné procesy používané pro přístup k informacím rozhraní WMI. Všimněte si, že zatímco většina z těchto příkladů používá Get-WMIObject, mnoho WMI cmdletů PowerShell má stejné parametry, například -Class nebo -Credentials. Mnoho z těchto procesů proto pracuje také pro jiné objekty. Podrobnější informace o PowerShellu a rozhraní WMI najdete v tématu Použití rutiny Get-WMiObject a Windows PowerShellu –připojení rozhraní WMI .

  • jazyka VBScript naproti tomu explicitně volá rozhraní API pro skriptování pro rozhraní WMI, jak je uvedeno výše. Jiné jazyky, například Perl, můžou také používat skriptovací rozhraní API pro rozhraní WMI. Pro účely této dokumentace však většina ukázek, které demonstrují skriptovací rozhraní API pro rozhraní WMI, bude používat VBScript. Je-li však programovací technika specifická pro VBScript, bude označena.

    VBScript má v podstatě dva samostatné způsoby přístupu k rozhraní WMI. První je použití objektu SWbemLocator pro připojení k rozhraní WMI. Alternativně můžete použít GetObject a přezdívku. Moniker je textový řetězec, který může popisovat různé prvky: vaše přihlašovací údaje, nastavení impersonace, počítač, ke kterému se chcete připojit, obor názvů služby WMI (tj. obecné umístění, kde WMI ukládá skupiny objektů), a konkrétní objekt WMI, který si přejete získat. Mnohé z níže uvedených příkladů popisují obě techniky. Další informace naleznete v tématu Konstrukce řetězce monikeru a Popisování umístění objektu WMI.

    Bez ohledu na to, jakou techniku používáte pro připojení k rozhraní WMI, pravděpodobně načtete jeden nebo více objektů ze skriptovacího rozhraní API. Nejběžnější je SWbemObject, který rozhraní WMI používá k popisu objektu WMI. Alternativně můžete použít objekt SWbemServices k popisu samotné služby WMI nebo objekt SWbemObjectPath k popisu umístění objektu WMI. Další informace naleznete v tématu Skriptování s objekty SWbemObject a Pomocné objekty skriptování.

Použití rozhraní WMI a skriptovacího jazyka: Jak na to?

... připojit se k rozhraní WMI?

Pro VBScript a skriptovací rozhraní API pro WMI načtěte objekt SWbemServices pomocí monikeru a volání GetObject. Alternativně se můžete připojit k serveru pomocí volání SWbemLocator.ConnectServer. Objekt pak můžete použít pro přístup ke specifickému oboru názvů rozhraní WMI nebo instanci třídy WMI.

V případě PowerShellu se připojení k rozhraní WMI obvykle provádí přímo ve volání rutiny; proto nejsou potřeba žádné další kroky.

Další informace naleznete v tématu Popis umístění objektu WMI, tvorba řetězce monikera Připojení k rozhraní WMI jazykem VBScriptu.

Set objLocator = CreateObject("WbemScripting.SWbemLocator")
Set objService = objLocator.ConnectServer(".", "root\cimv2")

' Second example: implicitly uses the local compuer (.) and default namespace ("root\cimv2")
Set objWMIService = GetObject("winmgmts:")

#Already has all the defaults set
get-WmiObject Win32_LogicalDisk

#Or, to be explicit,
get-WmiObject -class Win32_LogicalDisk -Computer "." -Namespace "root\cimv2" -Impersonation Impersonate

... získává informace ze služby WMI?

Pro VBScript a rozhraní API pro skriptování WMI použijte funkci načítání, jako je například WbemServices.Get nebo WbemServices.InstancesOf. Můžete také umístit název třídy objektu, který se má načíst, do označení, což může být efektivnější.

V PowerShellu použijte parametr -Class. Všimněte si, že -Class je výchozí parametr; nemusíte ho explicitně uvést.

Další informace naleznete v tématu Načítání dat třídy WMI nebo dat instance.

Set objLocator = CreateObject("WbemScripting.SWbemLocator")
Set objService = objLocator.ConnectServer(".", "root\cimv2")
Set colScheduledJobs = objService.InstancesOf("Win32_ScheduledJob")

' Second example
SSet Service = GetObject("WinMgmts:{impersonationLevel=impersonate}!Win32_Service=""ALERTER""")

#default - you don't actually need to use the -Class parameter
Get-WMIObject Win32_WmiSetting

#but you can if you want to
Get-WMIObject -Class Win32_WmiSetting

... chcete vytvořit dotaz rozhraní WMI?

Pro VBScript a skriptovací rozhraní API pro rozhraní WMI použijte metodu SWbemServices.ExecQuery.

V PowerShellu použijte parametr -Query. Můžete také filtrovat pomocí parametru -Filter.

Další informace najdete v Dotazování rozhraní WMI.

strComputer = "."
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colScheduledJobs = objWMIService.ExecQuery("Select * from Win32_ScheduledJob")
For Each objJob in colScheduledJobs
    Wscript.Echo "Job ID: " & objJob.JobId & "Command: " & objJob.Command & VBNewLine

Get-WmiObject -query "SELECT * FROM Win32_logicalDisk WHERE DeviceID = 'C:'"

#or

get-wmiObject -Class Win32_LogicalDisk -Filter "DeviceID = 'C:'"

... vytvářet výčet objektů rozhraní WMI?

Pro VBScript a skriptovací rozhraní API pro rozhraní WMI použijte SWbemObjectSet kontejnerový objekt, který je zpracováván ve skriptu jako kolekce, kterou lze projít (enumerovat). Můžete načíst SWbemObjectSet z volání z SWbemServices.InstancesOf nebo SWbemServices.ExecQuery.

PowerShell dokáže načíst a zpracovat výčty stejně jako jakýkoli jiný objekt; není nic zvlášť jedinečného pro rozhraní WMI.

Další informace naleznete v tématu Přístup k kolekci.

For Each Disk In GetObject("winmgmts:").InstancesOf ("CIM_LogicalDevice")

$logicalDevices = Get-WmiObject CIM_LogicalDevice
foreach ($device in $logicalDevices)
{
    $device.name
}

#or, to be more compact

Get-WmiObject cim_logicalDevice | ForEach-Object { $_.name }

... získat přístup k jinému názvovému prostoru rozhraní WMI?

Pro VBScript a skriptovací rozhraní WMI API uveďte obor názvů v rámci výrazu monikeru, nebo alternativně explicitně uveďte obor názvů ve volání SwbemLocator.ConnectServer.

V PowerShellu použijte parametr -Namespace. Výchozí obor názvů je root\cimV2; Mnoho starších tříd je však uloženo v root\default.

Pokud chcete najít umístění dané třídy služby WMI, podívejte se na referenční stránku. Případně můžete ručně prozkoumat obor názvů pomocí get-WmiObject.

Set objLocator = CreateObject("WbemScripting.SWbemLocator")
Set objService = objLocator.ConnectServer(".", "root\cimv2")

' Second example
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & "." & "\root\cimv2")

Get-WmiObject -list * -Namespace root\default

#or, to retrieve all namespaces,
Get-WmiObject -Namespace root -Class __Namespace

... načíst všechny podřízené instance třídy?

Pro jazyky, které přímo používají skriptovací rozhraní API pro rozhraní WMI a PowerShell, podporuje rozhraní WMI načítání podřízených tříd základní třídy. Proto, abyste mohli načíst podřízené instance, musíte vyhledat pouze nadřazenou třídu. Následující příklad vyhledá CIM_LogicalDisk, což je předinstalovaná třída služby WMI, která představuje logické disky v počítači se systémem Windows. Vyhledávání této nadřazené třídy také vrací instance Win32_LogicalDisk, což je to, co systém Windows používá k popisu pevných disků. Další informace najdete v části běžného informačního modelu. Rozhraní WMI poskytuje celé schéma takových předinstalovaných tříd, které umožňují přístup ke spravovaným objektům a jejich řízení. Další informace naleznete v tématu třídy Win32 a třídy rozhraní WMI..

For Each Disk In GetObject("winmgmts:").InstancesOf ("CIM_LogicalDisk")
  WScript.Echo "Instance:", Disk.Name
Get-WmiObject CIM_LogicalDisk | ForEach-Object { "Instance: " + $_.Name  }

… jak najít objekt rozhraní WMI?

Pro skriptovací API pro WMI i PowerShell používá WMI kombinaci oboru názvů, názvu třídy a klíčových vlastností k jedinečné identifikaci dané instance WMI. Společně se to označuje jako cesta objektu WMI. V jazyce VBScript vlastnost SWbemObject.Path_ popisuje cestu pro libovolný daný objekt vrácený skriptovacím rozhraním API. Pro PowerShell bude mít každý objekt WMI vlastnost __PATH. Další informace najdete v tématu Popis umístění objektu WMI

Kromě oboru názvů a názvu třídy bude mít objekt WMI také klíčovou vlastnost, která jedinečně identifikuje danou instanci v porovnání s jinými instancemi na vašem počítači. Například vlastnost DeviceID je klíčovou vlastností třídy Win32_LogicalDisk. Další informace najdete v Formátu spravovaného objektu (MOF).

Nakonec je relativní cesta jednoduše zkrácenou formou cesty a zahrnuje název třídy a hodnotu klíče. V následujících příkladech může být cesta \\computerName\root\cimv2:Win32_LogicalDisk.DeviceID="D:", zatímco relativní cesta by byla ""Win32LogicalDisk.DeviceID="D"".

For Each Disk In GetObject("winmgmts:").InstancesOf ("CIM_LogicalDisk")
  WScript.Echo "Instance:", Disk.Path_.Relpath

'or to get the path
For Each Disk In GetObject("winmgmts:").InstancesOf ("CIM_LogicalDisk")
  WScript.Echo "Instance:", Disk.Path_
#retrieving the path
Get-WmiObject CIM_LogicalDisk | ForEach-Object { "Instance: " + $_.__PATH  }

#retrieving the relative path
Get-WmiObject CIM_LogicalDisk | ForEach-Object { "Instance: " + $_.__RELPATH  }

... nastavit informace ve službě WMI?

Pro VBScript a skriptovací API pro WMI použijte metodu SWbemObject.Put_.

V PowerShellu můžete použít buď metodu Put, nebo Set-WmiInstance.

Další informace naleznete v tématu Úprava vlastnosti instance.

wbemCimtypeString = 8
Set objSWbemService = GetObject("Winmgmts:root\default")
Set objClass = objSWbemService.Get()
objClass.Path_.Class = "NewClass"

' Add a property
' String property
objClass.Properties_.add "PropertyName", wbemCimtypeString  
' Make the property a key property 
objClass.Properties_("PropertyName").Qualifiers_.add "key", true

' Write the new class to the root\default namespace in the repository
Set objClassPath = objClass.Put_
WScript.Echo objClassPath.Path

'Create an instance of the new class using SWbemObject.SpawnInstance
Set objNewInst = GetObject("Winmgmts:root\default:NewClass").Spawninstance_

objNewInst.PropertyName = "My Instance"

' Write the instance into the repository
Set objInstancePath = objNewInst.Put_
WScript.Echo objInstancePath.Path

$mySettings = get-WMIObject Win32_WmiSetting
$mySettings.LoggingLevel = 1
$mySettings.Put()

#or

Set-WMIInstance -class Win32_WMISetting -argument @{LoggingLevel=1}

... použít jiné přihlašovací údaje?

Pro VBScript a skriptovací rozhraní API pro rozhraní WMI použijte parametry UserName a Password v metodě SWbemLocator.Connect Server.

V PowerShellu použijte parametr -Credential.

Mějte na paměti, že ve vzdáleném systému můžete použít pouze alternativní přihlašovací údaje. Další informace naleznete v Zabezpečení skriptovacích klientů.

strComputer = "remoteComputerName" 
strDomain = "DOMAIN" 
Wscript.StdOut.Write "Please enter your user name:"
strUser = Wscript.StdIn.ReadLine 
Set objPassword = CreateObject("ScriptPW.Password")
Wscript.StdOut.Write "Please enter your password:"
strPassword = objPassword.GetPassword()
 
Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServices = objSWbemLocator.ConnectServer(strComputer, _
                                                     "Root\CIMv2", _
                                                     strUser, _
                                                     strPassword, _
                                                     "MS_409", _
                                                     "ntlmdomain:" + strDomain)
Set colSwbemObjectSet = objSWbemServices.ExecQuery("Select * From Win32_Process")
For Each objProcess in colSWbemObjectSet
    Wscript.Echo "Process Name: " & objProcess.Name 
Next

$Computer = "atl-dc-01"

Get-WmiObject -Namespace "root\cimv2" -Class Win32_Process -Credential FABRIKAM\administrator  `
-ComputerName $Computer

... získat přístup ke vzdálenému počítači?

Pro VBScript a skriptovací rozhraní API pro rozhraní WMI explicitně uveďte název počítače v monikeru nebo jinak ve volání SWbemLocator.ConnectServer. Další informace najdete v tématu Připojení k rozhraní WMI vzdáleně pomocíjazyka VBScript .

Pro PowerShell použijte parametr -ComputerName. Další informace najdete v tématu Připojení k rozhraní WMI vzdáleně pomocíPowerShellu .

Set objLocator = CreateObject("WbemScripting.SWbemLocator")
Set objService = objLocator.ConnectServer("myRemoteServerName", "root\cimv2")
Set colScheduledJobs = objService.ExecQuery("SELECT * FROM Win32_ScheduledJob")
For Each objJob in colScheduledJobs
    Wscript.Echo "Job ID: " & objJob.JobId & "Command: " & objJob.Command & VBNewLine

'example 2

strComputer = "myRemoteServerName"
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colScheduledJobs = objWMIService.ExecQuery("Select * from Win32_ScheduledJob")
For Each objJob in colScheduledJobs
    Wscript.Echo "Job ID: " & objJob.JobId & "Command: " & objJob.Command & VBNewLine

$Computer = "atl-dc-01"

Get-WmiObject -Namespace "root\cimv2" -Class Win32_logicalDisk -ComputerName $Computer

... nastavte úrovně ověřování a napodobení?

Pro jazyk VBScript a skriptovací rozhraní API pro rozhraní WMI použijte vlastnost SWbemServices.Security_ vráceného objektu serveru nebo nastavte příslušné hodnoty v monikeru.

V PowerShellu použijte parametry -Authentication a -Impersonation. Další informace naleznete v tématu Zabezpečení skriptovacích klientů.

Další informace naleznete v Zabezpečení skriptovacích klientů.

' First example
Set Service = GetObject("WinMgmts:{impersonationLevel=impersonate}!Win32_Service=""ALERTER""")

' Second example
Set Locator = CreateObject("WbemScripting.SWbemLocator")
Set Service = Locator.ConnectServer       
service.Security_.ImpersonationLevel = wbemImpersonationLevelImpersonate  
Set objinstance = Service.Get("Win32_Service=""ALERTER""")

$Computer = "atl-dc-01"

Get-WmiObject -Namespace "root\cimv2" -Class Win32_Process -Impersonation Impersonate `
 -Authentication PacketIntegrity -Credential FABRIKAM\administrator -ComputerName $Computer

...jak řešit chyby ve službě WMI?

Pro skriptovací API pro rozhraní WMI může poskytovatel dodat objekt SWbemLastError k poskytnutí dalších informací o chybě.

V jazyce VBScript se zejména podporuje zpracování chyb pomocí nativního objektu Err. Můžete také přistupovat k objektu SWbemLastError, jak je popsáno výše. Další informace naleznete v tématu Načtení kódu chyby.

Pro PowerShell můžete použít standardní techniky zpracování chyb PowerShellu. Další informace najdete v tématu Úvod do zpracování chyb v PowerShellu.

'using Err
On Error Resume Next
Set objProcess = GetObject("winmgmts:root\cimv2:Win32_Process.Handle='one'")
Wscript.Echo Err.Number

'using SWbemLastError

On Error Resume Next
Set obj = GetObject("winmgmts:root\cimv2:Win32_Process.Handle='one'")
Set LastError = createobject("wbemscripting.swbemlasterror")
Wscript.Echo "Operation = " & LastError.operation & VBCRLF & "ParameterInfo = " _
            & LastError.ParameterInfo & VBCRLF & "ProviderName = " & LastError.ProviderName