Compartilhar via


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

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

No caso mais simples, um script pode usar as configurações de autenticação e representação padrão. O WMI normalmente é 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, consulte Manutenção dode Segurança do WMI.

O script a seguir usa 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 para definir os valores padrão de um computador, consulte os seguintes tópicos:

Alterando as credenciais de autenticação padrão usando o 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 Conectar-se entre diferentes sistemas operacionais.

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

Nas conexões do moniker de script com o WMI, use o nome curto mostrado na coluna "Nome/descrição do 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.

Nome/valor Descrição
WbemAuthenticationLevelDefault
0
Moniker: Padrão
O WMI usa a configuração de autenticação padrã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: Nenhum
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 somente 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 de representação anteriores e criptografa o valor de 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 falha ao definir 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 Como proteger namespaces WMI.

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

Quando você faz chamadas para a API de Scripting para WMI, é recomendável que você use os padrões que o WMI fornece para o nível de impersonação. Chamadas remotas e alguns provedores com mais de um salto de rede requerem um nível de personificação maior 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 definindo 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 Conectar-se entre diferentes sistemas operacionais.

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.

Nome/valor Descrição
wbemImpersonationLevelAnonymous
1
Moniker: Anônimo
Oculta as credenciais do chamador. As chamadas para o WMI podem falhar com esse nível de impersonação.
wbemImpersonationLevelIdentify
2
Moniker: Identificar
Permite que os objetos consultem as credenciais do chamador. As chamadas para o WMI podem falhar com esse nível de representação.
wbemImpersonationLevelImpersonate
3
Moniker: Representar
Permite que os objetos usem as credenciais do chamador. Esse é o nível de representação recomendado para a API de Script para chamadas WMI.
wbemImpersonationLevelDelegate
4
Moniker: Delegado
Permite que os objetos permitam que outros objetos usem as credenciais do chamador. Esta imitação funciona com a API de script para 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 de 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 Criando um aplicativo ou script WMI.

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

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

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM\Scripting\Nível de representação padrão

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

Acessando o objeto SWbemSecurity no VBScript

Outra forma de definir o nível de representação é através 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 após fazer logon no WMI e realizar chamadas de API usando esse objeto ou objetos criados a partir dele, como objetos do tipo SWbemObject.

Conectando-se ao WMI em um computador remoto

Protegendo clientes de script