Создание скрипта WMI

Вы можете просматривать и управлять любой информацией, доступной через WMI, с помощью скриптов. Скрипты могут быть написаны на любом языке сценариев, поддерживающем размещение сценариев Microsoft ActiveX, включая Visual Basic Scripting Edition (VBScript), PowerShell и Perl. Узел сценариев Windows (WSH), страницы активных серверов и интернет-Обозреватель могут размещать сценарии WMI.

Примечание

Основным языком сценариев, поддерживаемым инструментарием WMI, является PowerShell. Однако WMI также содержит надежную поддержку скриптов для VBScript и других языков, которые обращаются к API скриптов для WMI.

 

Языки сценариев WMI

Два языка main, поддерживаемые WMI, — это PowerShell и VBScript (через узел сценариев Windows или WSH).

  • PowerShell был разработан с учетом тесной интеграции с инструментарием WMI. Таким образом, большинство базовых элементов WMI встроены в командлеты WMI: Get-WmiObject, Set-WmiInstance, Invoke-WmiMethod и Remove-WmiObject. В следующей таблице описаны общие процессы, используемые для доступа к сведениям WMI. Обратите внимание, что в большинстве этих примеров используется Get-WMIObject, но многие командлеты WMI PowerShell имеют те же параметры, например -Class или -Credentials. Поэтому многие из этих процессов также работают и для других объектов. Более подробное описание PowerShell и WMI см. в разделах Использование командлета Get-WMiObject и Windows PowerShell — WMI-подключение.

  • VBScript, напротив, явно выполняет вызовы API скриптов для WMI, как упоминалось выше. Другие языки, такие как Perl, также могут использовать API сценариев для WMI. Однако для целей этой документации в большинстве примеров, демонстрирующих API скриптов для WMI, будет использоваться VBScript. Однако если метод программирования специфичен для VBScript, он будет вызываться.

    VBScript имеет два разных способа доступа к инструментарию WMI. Во-первых, для подключения к WMI используется объект SWbemLocator . Кроме того, можно использовать GetObject и моникер. Моникер — это строка, которая может описать ряд элементов: учетные данные, параметры олицетворения, компьютер, к которому требуется подключиться, пространство имен WMI (т. е. общее расположение, где WMI хранит группы объектов) и какой объект WMI требуется извлечь. Во многих приведенных ниже примерах описаны оба метода. Дополнительные сведения см. в разделах Создание строки моникера и Описание расположения объекта WMI.

    Независимо от того, какой метод используется для подключения к WMI, вы, скорее всего, получите один или несколько объектов из API скриптов. Наиболее распространенным является SWbemObject, который WMI использует для описания объекта WMI. Кроме того, можно использовать объект SWbemServices для описания самой службы WMI или объект SWbemObjectPath для описания расположения объекта WMI. Дополнительные сведения см. в разделах Создание скриптов с помощью SWbemObject и Создание скриптов вспомогательных объектов.

Использование инструментария WMI и языка сценариев, как это сделать...

... подключиться к WMI?

Для VBScript и API скриптов для WMI получите объект SWbemServices с моникером и вызовом GetObject. Кроме того, можно подключиться к серверу с помощью вызова SWbemLocator.ConnectServer. Затем можно использовать объект для доступа к определенному пространству имен WMI или экземпляру класса WMI.

Для PowerShell подключение к WMI обычно выполняется непосредственно в вызове командлета; поэтому никаких дополнительных действий не требуется.

Дополнительные сведения см. в разделах Описание расположения объекта WMI, Создание строки моникера и Подключение к WMI с помощью VBScript.

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

... получить сведения из инструментария WMI?

Для VBScript и API скриптов для WMI используйте функцию извлечения, например WbemServices.Get или WbemServices.InstancesOf. Вы также можете поместить имя класса объекта для извлечения в моникер, что может быть более эффективным.

Для PowerShell используйте параметр -Class . Обратите внимание, что параметром по умолчанию является -Class; Таким образом, вам не нужно явно указать его.

Дополнительные сведения см. в разделе Получение данных класса или экземпляра WMI.

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

... создать запрос WMI?

Для VBScript и API скриптов для WMI используйте метод SWbemServices.ExecQuery .

Для PowerShell используйте параметр -Query . Вы также можете выполнить фильтрацию с помощью параметра -Filter .

Дополнительные сведения см. в разделе Запрос 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:'"

... перечислить через список объектов WMI?

Для VBScript и API скриптов для WMI используйте объект контейнера SWbemObjectSet , который рассматривается в скрипте как коллекция, которую можно перечислить. SWbemObjectSet можно получить из вызова из SWbemServices.InstancesOf или SWbemServices.ExecQuery.

PowerShell может получать и обрабатывать перечисления так же, как и любой другой объект; нет ничего особенно уникального для WMI.

Дополнительные сведения см. в разделе Доступ к коллекции.

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 }

... получить доступ к другому пространству имен WMI?

Для VBScript и API скриптов для WMI укажите пространство имен в моникере или вы можете явно указать пространство имен в вызове SwbemLocator.ConnectServer.

Для PowerShell используйте параметр -Namespace . Пространство имен по умолчанию — "root\cimV2"; однако многие старые классы хранятся в "root\default".

Чтобы найти расположение заданного класса WMI, просмотрите страницу справки. Кроме того, можно вручную изучить пространство имен с помощью 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

... получить все дочерние экземпляры класса?

Для языков, которые напрямую используют API скриптов для WMI и PowerShell, WMI поддерживает получение дочерних классов базового класса. Таким образом, чтобы получить дочерние экземпляры, необходимо искать только родительский класс. В следующем примере выполняется поиск CIM_LogicalDisk, который представляет собой предустановленный класс WMI, представляющий логические диски в системе компьютера под управлением Windows. Таким образом, поиск этого родительского класса также возвращает экземпляры Win32_LogicalDisk, которые Windows использует для описания жестких дисков. Дополнительные сведения см. в разделе Common Information Model. WMI предоставляет всю схему таких предустановленных классов, которые позволяют получать доступ к управляемым объектам и управлять ими. Дополнительные сведения см. в разделе Классы Win32 и классы WMI.

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

... найти объект WMI?

Для API скриптов для WMI и PowerShell WMI использует сочетание пространства имен, имени класса и ключевых свойств для уникальной идентификации данного экземпляра WMI. Вместе это называется путем к объекту WMI. Для VBScript свойство SWbemObject.Path_ описывает путь к любому объекту, возвращаемому API скриптов. Для PowerShell каждый объект WMI будет иметь свойство __PATH. Дополнительные сведения см. в разделе Описание расположения объекта WMI.

Помимо пространства имен и имени класса, объект WMI также будет иметь свойство key, которое однозначно идентифицирует этот экземпляр по сравнению с другими экземплярами на компьютере. Например, свойство DeviceID является ключевым свойством класса Win32_LogicalDisk . Дополнительные сведения см. в разделе Формат управляемого объекта (MOF).

Наконец, относительный путь является просто сокращенной формой пути и включает имя класса и значение ключа. В приведенных ниже примерах путь может быть "\\имя_компьютера\root\cimv2:Win32_LogicalDisk.DeviceID="D:"", а относительный путь — ""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  }

... задать сведения в инструментарии WMI?

Для VBScript и API скриптов для WMI используйте метод SWbemObject.Put_ .

Для PowerShell можно использовать метод Put или Set-WmiInstance.

Дополнительные сведения см. в разделе Изменение свойства экземпляра.

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}

... использовать разные учетные данные?

Для VBScript и API скриптов для WMI используйте параметры UserName и Password в методе SWbemLocator.ConnectServer .

Для PowerShell используйте параметр -Credential .

Обратите внимание, что в удаленной системе можно использовать только альтернативные учетные данные. Дополнительные сведения см. в разделе Защита клиентов сценариев.

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

... получить доступ к удаленному компьютеру?

Для VBScript и API скриптов для WMI явно укажите имя компьютера в моникере или в вызове SWbemLocator.ConnectServer. Дополнительные сведения см. в статье Удаленное подключение к WMI с помощью VBScript.

Для PowerShell используйте параметр -ComputerName . Дополнительные сведения см. в статье Удаленное подключение к WMI с помощью PowerShell.

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

... задать уровни проверки подлинности и олицетворения?

Для VBScript и API скриптов для WMI используйте свойство SWbemServices.Security_ возвращенного объекта сервера или задайте соответствующие значения в моникере.

Для PowerShell используйте параметры -Authentication и -Impersonation соответственно. Дополнительные сведения см. в разделе Защита клиентов сценариев.

Дополнительные сведения см. в разделе Защита клиентов сценариев.

' 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

... обрабатывать ошибки в инструментарии WMI?

Для API скриптов для WMI поставщик может предоставить объект SWbemLastError , чтобы предоставить дополнительные сведения об ошибке.

В частности, в VBScript обработка ошибок также поддерживается с помощью собственного объекта Err . Вы также можете получить доступ к объекту SWbemLastError, как описано выше. Дополнительные сведения см. в разделе Извлечение кода ошибки.

Для PowerShell можно использовать стандартные методы обработки ошибок PowerShell. Дополнительные сведения см. в статье Введение в обработку ошибок в PowerShell.

'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