Definir o nível de segurança do processo padrão com VBScript

Um script pode usar as configurações padrão de autenticação e representação do WMI. No entanto, o script pode precisar de uma conexão com mais segurança ou pode se conectar a um namespace que exige uma conexão criptografada. Para obter mais informações, consulte Definir descritores de segurança de namepace e Exigir uma conexão criptografada com um namespace.

No caso mais simples, um script pode usar as configurações padrão de autenticação e representação. Normalmente, o WMI é executado em um host de serviço compartilhado e compartilha a mesma autenticação que outros processos no host. Se você quiser executar o processo WMI com um nível diferente de autenticação, execute o WMI com o comando winmgmt com a opção /standalonehost e defina o nível de autenticação para WMI em geral. Para obter mais informações, confira Manutenção da segurança do WMI.

O script a seguir usa as configurações padrão para níveis de representação e autenticação.

strComputer = "." 
Set objServices = GetObject("winmgmts:\\" _
    & strComputer & "\root\CIMV2") 
set objProcessSet = objServices.ExecQuery _
     ("SELECT Name FROM Win32_Process",,48)
For Each Process in objProcessSet
    WScript.Echo Process.Name
Next

Você também pode usar um moniker em uma chamada para GetObject e definir as configurações de segurança padrão, como no exemplo a seguir.

strComputer = "." 
Set objServices = GetObject( _
    "winmgmts:{impersonationLevel=impersonate," _
    & "authenticationLevel=pktPrivacy}!root/cimv2")
set objProcessSet = objServices.ExecQuery _
     ("SELECT Name FROM Win32_Process",,48)
For Each Process in objProcessSet
    WScript.Echo Process.Name
Next

Para obter mais informações sobre como definir diferentes níveis de representação ou autenticação em um script ou definir os valores padrão de um computador, consulte os seguintes tópicos:

Alterar as credenciais de autenticação padrão usando VBScript

Você pode alterar o nível de autenticação em um script usando uma cadeia de caracteres moniker e os objetos SWbemLocator e SWbemSecurity.

O nível de autenticação deve ser definido de acordo com os requisitos do sistema operacional de destino ao qual você está se conectando. Para obter mais informações, consulte Conexão entre sistemas operacionais diferentes.

O exemplo de código VBScript a seguir mostra como alterar o nível de autenticação em um script que obtém os dados de espaço livre de um computador remoto chamado "Server1".

strComputer = "Server1"
Set objWMIService = GetObject("winmgmts:{authenticationLevel=Pkt}!\\" _
    & strComputer & "\root\cimv2")
Set colDisks = objWMIService.ExecQuery ("Select * from Win32_LogicalDisk")
For each objDisk in colDisks
    Wscript.Echo "DeviceID: " & vbTab & objDisk.DeviceID & vbNewLine & _
        "FreeSpace: " & vbTab & objDisk.FreeSpace 
    NextstrComputer = "." 
    Set objServices = GetObject( "winmgmts:{impersonationLevel=impersonate," _
                               & "authenticationLevel=pktPrivacy}!root/cimv2")
    Set objProcessSet = objServices.ExecQuery("SELECT Name FROM Win32_Process",,48)
    For Each Process in objProcessSet
        WScript.Echo Process.Name
    Next
Next

Em conexões moniker de script com o WMI, use o nome curto mostrado na coluna "Nome/descrição de moniker" da tabela abaixo. Por exemplo, no script a seguir, o nível de autenticação é definido como WbemAuthenticationLevelPktIntegrity.

SetobjWMIService = GetObject( _
    "winmgmts:{authenticationLevel=pktPrivacy}!root\cimv2")

A tabela a seguir lista os níveis de autenticação que você pode definir. Esses níveis são definidos em Wbemdisp.tlb na enumeração WbemAuthenticationLevelEnum.

Name/value Descrição
WbemAuthenticationLevelDefault
0
Moniker: Default
O WMI usa a configuração padrão da autenticação do Windows. Essa é a configuração recomendada que permite que o WMI negocie para o nível exigido pelo servidor que retorna dados. No entanto, se o namespace exigir criptografia, use WbemAuthenticationLevelPktPrivacy.
WbemAuthenticationLevelNone
1
Moniker: None
Não usa autenticação.
WbemAuthenticationLevelConnect
2
Moniker: Connect
Autentica as credenciais do cliente somente quando o cliente estabelece uma relação com o servidor.
WbemAuthenticationLevelCall
3
Chamar
Autentica apenas no início de cada chamada quando o servidor recebe a solicitação.
WbemAuthenticationLevelPkt
4
Moniker: Pkt
Autentica que todos os dados recebidos são do cliente esperado.
WbemAuthenticationLevelPktIntegrity
5
Moniker: PktIntegrity
Autentica e verifica se nenhum dos dados transferidos entre o cliente e o servidor foi modificado.
WbemAuthenticationLevelPktPrivacy
6
Moniker: PktPrivacy
Autentica todos os níveis anteriores de representação e criptografa o valor do argumento de cada chamada de procedimento remoto. Use essa configuração se o namespace ao qual você está se conectando exigir uma conexão criptografada.

Para determinar uma chamada bem-sucedida, verifique o valor retornado depois de alterar o nível de autenticação.

Por exemplo, como as conexões locais sempre têm um nível de autenticação de wbemAuthenticationLevelPktPrivacy, o exemplo a seguir não define o nível de autenticação porque ele se conecta ao computador local.

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate," _
    & "authenticationLevel=pktPrivacy}!" _
    & "\\" & strComputer & "\root\cimv2")

Um provedor pode definir a segurança em um namespace para que nenhum dado seja retornado, a menos que você use a privacidade de pacotes (PktPrivacy) em sua conexão com esse namespace. Isso garante que os dados sejam criptografados à medida que cruzam a rede. Se você tentar definir um nível de autenticação mais baixo, receberá uma mensagem de acesso negado. Para obter mais informações, consulte Proteger namespaces do WMI.

Alterar os níveis de representação padrão usando VBScript

Quando você faz chamadas para a API de Script do WMI, é recomendável usar os padrões que o WMI fornece para o nível de representação. Chamadas remotas e alguns provedores com mais de um salto de rede exigem um nível de representação mais alto do que o WMI usa. Se o nível de representação não for suficiente, um provedor poderá recusar uma solicitação ou fornecer informações incompletas.

Se você não definir o nível de representação em um moniker ou definir SWbemSecurity.ImpersonationLevel em um objeto protegível, defina o nível de representação DCOM padrão para o sistema operacional. O nível de representação deve ser definido de acordo com os requisitos do sistema operacional de destino ao qual você está se conectando. Para obter mais informações, consulte Conexão entre sistemas operacionais diferentes.

O exemplo de código VBScript a seguir mostra a alteração do nível de representação no mesmo script mostrado acima.

strComputer = "Server1"
Set objWMIService = GetObject("winmgmts:{impersonationLevel=Impersonate}!\\" _
                              & strComputer & "\root\cimv2")
Set colDisks = objWMIService.ExecQuery("Select * from Win32_LogicalDisk")
For each objDisk in colDisks
Wscript.Echo "DeviceID: " & vbTab & objDisk.DeviceID & vbNewLine & _
             "FreeSpace: " & vbTab & objDisk.FreeSpace 
Next

A tabela a seguir lista os níveis de autenticação em WbemImpersonationLevelEnum que usam.

Name/value Descrição
wbemImpersonationLevelAnonymous
1
Moniker: Anonymous
Oculta as credenciais do autor da chamada. Chamadas ao WMI podem falhar com esse nível de representação.
wbemImpersonationLevelIdentify
2
Moniker: Identify
Permite que os objetos consultem as credenciais do autor da chamada. Chamadas ao WMI podem falhar com esse nível de representação.
wbemImpersonationLevelImpersonate
3
Moniker: Impersonate
Permite que os objetos utilizem as credenciais do autor da chamada. Esse é o nível de representação recomendado para API de Script de chamadas WMI.
wbemImpersonationLevelDelegate
4
Moniker: Delegate
Autoriza que os objetos permitam que outros objetos utilizem as credenciais do autor da chamada. Essa representação funcionará com a API de Script de chamadas WMI, mas pode constituir um risco de segurança desnecessário.

O exemplo a seguir mostra como definir a representação em uma cadeia de caracteres moniker ao obter uma instância específica de Win32_Process.

Set object = GetObject("winmgmts:{impersonationLevel=impersonate}!root\cimv2:Win32_Process.Handle='0'")

Para obter mais informações, consulte Criar um aplicativo ou script WMI.

Definir o nível de representação padrão usando o Registro

Se você tiver acesso ao Registro, também poderá definir a chave do Registro no nível de representação padrão. Essa chave especifica qual nível de representação a API de Script do WMI usa, a menos que especificado de outra forma. O caminho a seguir identifica o caminho do Registro.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM\Scripting\Default Impersonation Level

Por padrão, a chave do Registro é definida como 3, especificando o nível de representação. Alguns provedores podem exigir um nível mais alto de representação.

Acessar o objeto SWbemSecurity no VBScript

A outra maneira de definir o nível de representação é a partir do objeto de segurança SWbemSecurity, que aparece como a propriedade Security_ dos objetos SWbemServices, SWbemObject, SWbemObjectSet, SWbemEventSource, SWbemObjectPath e SwbemLocator.

O WMI passa a configuração de segurança de um objeto pai para os descendentes do objeto original. Portanto, você pode definir o nível de representação de um objeto SWbemServices depois de fazer logon no WMI e em camadas API usando esse objeto ou objetos criados a partir dele, como objetos do tipo SWbemObject.

Conexão ao WMI em um computador remoto

Proteger clientes de script