Partilhar via


Criando um script WMI

Você pode visualizar ou manipular qualquer informação disponibilizada através do WMI usando scripts. Os scripts podem ser escritos em qualquer linguagem de script que ofereça suporte à hospedagem de scripts Microsoft ActiveX, incluindo Visual Basic Scripting Edition (VBScript), PowerShell e Perl. O WSH (Windows Script Host), o Ative Server Pages e o Internet Explorer podem hospedar scripts WMI.

Observação

A principal linguagem de script atualmente suportada pelo WMI é o PowerShell. No entanto, o WMI também contém um corpo robusto de suporte a scripts para VBScript e outras linguagens que acessam a API de script para WMI.

 

Linguagens de script WMI

As duas principais linguagens suportadas pelo WMI são PowerShell e VBScript (através do Windows Script Host ou WSH).

  • PowerShell foi projetado com integração total com o WMI em mente. Como tal, muitos dos elementos subjacentes do WMI são incorporados nos cmdlets WMI: Get-WmiObject, Set-WmiInstance, Invoke-WmiMethode Remove-WmiObject. A tabela a seguir descreve os processos gerais usados para acessar informações WMI. Observe que, embora a maioria desses exemplos use Get-WMIObject, muitos dos cmdlets WMI do PowerShell têm os mesmos parâmetros, como -Class ou -Credentials. Portanto, muitos desses processos também funcionam para outros objetos. Para obter uma discussão mais aprofundada sobre o PowerShell e o WMI, consulte Usando o de cmdlet Get-WMiObject e Windows PowerShell - ode Conexão WMI .

  • VBScript, por outro lado, faz chamadas explicitamente para a API de script para WMI, como mencionado acima. Outras linguagens, como Perl, também podem usar a API de script para WMI. No entanto, para os fins desta documentação, a maioria dos exemplos que demonstram a API de script para WMI usará VBScript. Quando uma técnica de programação é específica para VBScript, no entanto, será destacada.

    O VBScript tem essencialmente duas maneiras separadas de acessar o WMI. O primeiro é utilizar o objeto SWbemLocator para se conectar ao WMI. Como alternativa, você pode usar GetObject e um moniker. Um moniker é uma cadeia de caracteres que pode descrever vários elementos: suas credenciais, configurações de representação, a qual computador você deseja se conectar, o namespace WMI (ou seja, o local geral onde o WMI armazena grupos de objetos) e qual objeto WMI você deseja recuperar. Muitos dos exemplos abaixo descrevem ambas as técnicas. Para obter mais informações, consulte Construir uma String de Moniker e Descrever a Localização de um Objeto WMI.

    Independentemente da técnica usada para se conectar ao WMI, você provavelmente recuperará um ou mais objetos da API de script. O mais comum é SWbemObject, que o WMI usa para descrever um objeto WMI. Como alternativa, você pode usar um objeto SWbemServices para descrever o próprio serviço WMI ou um objeto SWbemObjectPathpara descrever o local de um objeto WMI. Para obter mais informações, consulte 'Scripting with SWbemObject' e 'Scripting Helper Objects'.

Usando WMI e uma linguagem de script, como faço...?

... conectar-se ao WMI?

Para VBScript e a API de script para WMI, recupere um objeto SWbemServicescom um moniker e uma chamada para GetObject. Como alternativa, você pode se conectar ao servidor com uma chamada para SWbemLocator.ConnectServer. Em seguida, você pode usar o objeto para acessar um namespace WMI específico ou uma instância de classe WMI.

Para o PowerShell, a conexão ao WMI geralmente é feita diretamente na chamada do cmdlet; como tal, não são necessárias medidas adicionais.

Para obter mais informações, consulte Descrever a localização de um objeto WMI, Construir uma cadeia de caracteres monikere Ligar-se ao WMI com 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

... recuperar informações do WMI?

Para VBScript e a API de script para WMI, use uma função de recuperação, como WbemServices.Get ou WbemServices.InstancesOf. Você também pode colocar o nome da classe do objeto a ser recuperado em um moniker, que pode ser mais eficiente.

Para PowerShell, use o parâmetro -Class. Observe que -Class é o parâmetro padrão; Como tal, você não precisa declará-lo explicitamente.

Para obter mais informações, consulte Recuperando dados de classe ou instância 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

... criar uma consulta WMI?

Para VBScript e a API de script para WMI, use o SWbemServices.ExecQuery método.

Para PowerShell, use o parâmetro -Query. Você também pode filtrar usando o parâmetro -Filter.

Para obter mais informações, consulte Consultando o 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:'"

... enumerar através de uma lista de objetos WMI?

Para VBScript e a API de script para WMI, use o SWbemObjectSet objeto de contêiner, que é tratado no script como uma coleção que pode ser enumerada. Você pode recuperar um SWbemObjectSet de uma chamada de SWbemServices.InstancesOf ou SWbemServices.ExecQuery.

O PowerShell é capaz de recuperar e manipular enumerações como faria com qualquer outro objeto; não há nada particularmente exclusivo do WMI.

Para obter mais informações, consulte acessando uma coleção.

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 }

... aceder a um namespace WMI diferente?

Para VBScript e a API de script para WMI, indique o namespace no moniker, ou então você pode declarar explicitamente o namespace na chamada para SwbemLocator.ConnectServer.

Para PowerShell, use o parâmetro -Namespace. O namespace padrão é "root\cimV2"; no entanto, muitas classes mais antigas são armazenadas em "root\default".

Para encontrar a localização de uma determinada classe WMI, consulte a página de referência. Como alternativa, você pode explorar manualmente um namespace usando 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

... recuperar todas as instâncias filho de uma classe?

Para linguagens que usam diretamente a API de Scripting para WMI e PowerShell, o WMI oferece suporte à recuperação das subclasses de uma classe base. Como tal, para recuperar as instâncias filhas, você só precisa procurar a classe pai. O exemplo a seguir procura CIM_LogicalDisk, que é uma classe WMI pré-instalada que representa discos lógicos em um sistema de computador baseado no Windows. Como tal, pesquisar essa classe pai também retorna instâncias de Win32_LogicalDisk, que é aquilo que o Windows utiliza para descrever discos rígidos. Para obter mais informações, consulte Common Information Model. O WMI fornece um esquema completo dessas classes pré-instaladas que permitem acessar e controlar objetos gerenciados. Para mais informações, consulte as Classes Win32 e as Classes WMI .

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

... localizar um objeto WMI?

Para a API de Script para WMI e PowerShell, o WMI usa uma combinação de namespace, nome de classe e propriedades de chave para identificar exclusivamente uma determinada instância WMI. Juntos, isso é conhecido como o caminho do objeto WMI. Para VBScript, a propriedade SWbemObject.Path_ descreve o caminho para qualquer objeto retornado pela API de script. Para o PowerShell, cada objeto WMI terá uma propriedade __PATH. Para obter mais informações, consulte descrevendo o local de um objeto WMI

Além do namespace e do nome da classe, um objeto WMI também terá uma propriedade key, que identifica exclusivamente essa instância em comparação com outras instâncias em sua máquina. Por exemplo, a propriedade DeviceID é a propriedade chave para a classe Win32_LogicalDisk. Para obter mais informações, consulte Managed Object Format (MOF).

Finalmente, o caminho relativo é simplesmente uma forma abreviada do caminho e inclui o nome da classe e o valor da chave. Nos exemplos abaixo, o caminho pode ser "\\computerName\root\cimv2:Win32_LogicalDisk.DeviceID="D:"", enquanto o caminho relativo seria ""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  }

... configurar informações no WMI?

Para VBScript e a API de script para WMI, use o método SWbemObject.Put_.

Para o PowerShell, você pode usar o método Put ou Set-WmiInstance.

Para obter mais informações, consulte Modificando uma Propriedade de Instância.

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}

... usar credenciais diferentes?

Para VBScript e a API de script para WMI, use os parâmetros UserName e Password no métodoSWbemLocator.ConnectServer.

Para PowerShell, use o parâmetro -Credential.

Observe que você só pode usar credenciais alternativas em um sistema remoto. Para obter mais informações, consulte Protegendo clientes de script.

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

... aceder a um computador remoto?

Para VBScript e a API de script para WMI, indique explicitamente o nome do computador, seja no identificador ou na chamada para SWbemLocator.ConnectServer. Para obter mais informações, consulte Conectando-se ao WMI remotamente com VBScript.

Para PowerShell, use o parâmetro -ComputerName. Para obter mais informações, consulte Conectando-se ao WMI remotamente com o 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

... definir os níveis de Autenticação e Representação?

Para VBScript e a API de script para WMI, use a propriedade SWbemServices.Security_ no objeto de servidor retornado ou defina os valores relevantes no moniker.

Para o PowerShell, use os parâmetros -Authentication e -Impersonation, respectivamente. Para obter mais informações, consulte Protegendo clientes de script.

Para obter mais informações, consulte Protegendo clientes de script.

' 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

... lidar com erros no WMI?

Para a API de script para WMI, o provedor pode fornecer um objeto SWbemLastError para fornecer mais informações sobre um erro.

No VBScript em particular, a manipulação de erros também é suportada usando o objeto nativo Err. Você também pode acessar o objeto SWbemLastError, conforme descrito acima. Para obter mais informações, consulte Recuperando um código de erro.

Para o PowerShell, você pode usar as técnicas padrão de tratamento de erros do PowerShell. Para obter mais informações, consulte An Introduction to Error Handling in 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