Conexão remota ao WMI com o VBScript

Você pode criar uma conexão remota ao WMI com o VBScript criando um objeto de conexão. Esse objeto contém o nome do computador, o namespace do WMI ao qual você deseja se conectar, bem como quaisquer credenciais relevantes e níveis de autenticação.

Para se conectar a um sistema remoto usando o VBScript

  1. Especifique as informações de conexão, como o nome do computador remoto, as credenciais e o nível de autenticação da conexão.

    Se estiver se conectando a um computador remoto usando as mesmas credenciais (domínio e nome de usuário) com as quais está conectado, você poderá especificar as informações de conexão em uma conexão monikerGetObject, conforme descrito no exemplo de código a seguir.

    strComputer = "Computer_B"
    Set objWMIService = GetObject("winmgmts:{impersonationLevel=Impersonate}!\\" & strComputer & "\Root\CIMv2")
    

    Em geral, você deve especificar o namespace do WMI ao qual se conectar no computador remoto. Isso ocorre porque é possível que o namespace padrão não seja o mesmo em computadores diferentes. Especificar o namespace garante que você se conecte ao mesmo namespace em todos os computadores.

    Para obter mais informações sobre constantes do VBScript e cadeias de caracteres de script para usar a conexão moniker, consulte Definir o nível de segurança do processo padrão usando VBScript.

  2. Se você se conectar a um computador remoto em um domínio diferente ou usando um nome de usuário e senha diferentes, será necessário usar o método SWbemLocator.ConnectServer.

    Assim como acontece com um moniker, você usa ConnectServer para especificar as credenciais, o nível de autenticação e o namespace para a conexão remota. O exemplo de código a seguir descreve como usar ConnectServer para acessar um computador remoto usando uma conta de administrador e uma senha.

    strComputer = "Computer_B"
    Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
    Set objSWbemServices = objSWbemLocator.ConnectServer(strComputer, _
                                                         "Root\CIMv2", _
                                                         "fabrikam\administrator", _
                                                         "password")
    
  3. Ao usar a função ConnectServer para conexões remotas, defina representação e autenticação no objeto de segurança obtido por uma chamada para SWbemServices.Security. Você pode usar a enumeração WbemImpersonationLevelEnum para especificar o nível de representação.

    O exemplo de código a seguir define o nível de representação para o exemplo de código VBScript anterior.

    objSWbemServices.Security_.ImpersonationLevel = 3
    

    Observe que algumas conexões exigem um nível de autenticação específico. Para obter mais informações, consulte Configurar a segurança do processo do aplicativo cliente e Proteger clientes de script.

    Em particular, você deve definir o nível de autenticação como RPC_C_AUTHN_LEVEL_PKT_PRIVACY ou 6 se o namespace ao qual você está se conectando no computador remoto exigir uma conexão criptografada antes que ele retorne dados. Você também pode usar esse nível de autenticação, mesmo que o namespace não o exija. Isso garante que os dados sejam criptografados à medida que cruzam a rede. Se você tentar definir um nível de autenticação menor do que o permitido, uma mensagem de acesso negado será retornada. Para obter mais informações, consulte Exigir uma conexão criptografada a um namespace.

Depois de fazer sua conexão, você pode continuar a acessar dados do WMI. Para obter mais informações, consulte Tarefas do WMI para scripts e aplicativos.

Exemplos

Para obter um exemplo maior de VBScript, consulte a seção Exemplos na página de referência SWbemLocator.ConnectServer.

O exemplo de código VBScript a seguir se conecta a um grupo de computadores remotos no mesmo domínio criando uma matriz de nomes de computador remoto e exibindo nomes dos dispositivos Plug and Play – instâncias de Win32_PnPEntity – em cada computador. Para executar o script abaixo, você deve ser um administrador nos computadores remotos. Observe que o "\\" necessário antes do nome do computador remoto é adicionado pelo script após a configuração de nível de representação. Para obter mais informações sobre os caminhos do WMI, consulte Descrever o local de um objeto do WMI.

On Error Resume Next 
arrComputers = Array("Computer1","Computer2","Computer3")
For Each strComputer In arrComputers
    WScript.Echo
    WScript.Echo "===================================="
    WScript.Echo "Computer: "& strComputer
    WScript.Echo "===================================="

    Set objWMIService = GetObject("winmgmts:\\" & strComputer& "\Root\CIMv2") 
    Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_PnPEntity",,48) 
    For Each objItem in colItems 
        Wscript.Echo "-----------------------------------"
        Wscript.Echo "Win32_PnPEntity instance"
        Wscript.Echo "-----------------------------------"
        Wscript.Echo "Name: "& objItem.Name
        Wscript.Echo "Status: "& objItem.Status
    Next
Next

O exemplo de código VBScript a seguir permite que você se conecte a um computador remoto usando credenciais diferentes. Por exemplo, um computador remoto em um domínio diferente ou uma conexão a um computador remoto que exige um nome de usuário e senha diferentes. Nesse caso, use a conexão SWbemServices.ConnectServer.

' Full Computer Name
' can be found by right-clicking My Computer,
' then click Properties, then click the Computer Name tab)
' or use the computer's IP address
strComputer = "FullComputerName" 
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

Conexão ao WMI em um computador remoto