Establecer el nivel de seguridad de proceso predeterminado con VBScript

Un script puede usar la configuración predeterminada de suplantación y autenticación de WMI. Sin embargo, puede que el script necesite una conexión más segura o que se conecte a un espacio de nombres que requiera una conexión cifrada. Para obtener más información, consulte Establecer descriptores de seguridad del espacio de nombres y Requerir una conexión cifrada a un espacio de nombres.

En el caso más sencillo, un script puede usar la configuración predeterminada de suplantación y autenticación. WMI se ejecuta normalmente en un host de servicio compartido y comparte la misma autenticación con otros procesos del host. Si quiere ejecutar el proceso WMI con un nivel de autenticación diferente, ejecute WMI con el comando winmgmt y el modificador /standalonehost y establezca el nivel de autenticación para WMI en general. Para obtener más información, consulte Mantener la seguridad de WMI.

El script siguiente usa la configuración predeterminada para los niveles de suplantación y autenticación.

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

También puede usar un elemento moniker en una llamada a GetObject y establecer la configuración de seguridad predeterminada, como en el ejemplo siguiente.

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 obtener más información sobre cómo establecer distintos niveles de suplantación o autenticación en un script, o para establecer los valores predeterminados en un equipo, consulte los temas siguientes:

Cambio de las credenciales de autenticación predeterminadas mediante VBScript

Para cambiar el nivel de autenticación en un script, use una cadena de moniker y los objetos SWbemLocator y SWbemSecurity.

El nivel de autenticación debe establecerse de acuerdo con los requisitos del sistema operativo de destino al que se va a conectar. Para obtener más información, consulte Conexión entre diferentes sistemas operativos.

En el ejemplo de código VBScript siguiente se muestra cómo cambiar el nivel de autenticación en un script que obtiene los datos de espacio libre de un equipo remoto llamado "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

En las conexiones de moniker de script a WMI, use el nombre corto que se muestra en la columna de nombre o descripción del moniker de la tabla siguiente. Por ejemplo, en el script siguiente, el nivel de autenticación está establecido en WbemAuthenticationLevelPktIntegrity.

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

En la tabla siguiente se muestran los niveles de autenticación que puede establecer. Estos niveles se definen en Wbemdisp.tlb en la enumeración WbemAuthenticationLevelEnum.

Nombre o valor Descripción
WbemAuthenticationLevelDefault
0
Moniker: Valor predeterminado
WMI usa la configuración de autenticación de Windows predeterminada. Esta es la configuración recomendada que permite a WMI negociar el nivel requerido por el servidor que devuelve los datos. Sin embargo, si el espacio de nombres requiere cifrado, use WbemAuthenticationLevelPktPrivacy.
WbemAuthenticationLevelNone
1
Moniker: Ninguno
No usa autenticación.
WbemAuthenticationLevelConnect
2
Moniker: Connect
Autentica las credenciales del cliente solo cuando este establece una relación con el servidor.
WbemAuthenticationLevelCall
3
Call
Autentica solo al principio de cada llamada, cuando el servidor recibe la solicitud.
WbemAuthenticationLevelPkt
4
Moniker: Pkt
Autentica que todos los datos recibidos sean del cliente esperado.
WbemAuthenticationLevelPktIntegrity
5
Moniker: PktIntegrity
Autentica los datos transferidos entre el cliente y el servidor y comprueba que no se hayan modificado.
WbemAuthenticationLevelPktPrivacy
6
Moniker: PktPrivacy
Autentica todos los niveles de suplantación anteriores y cifra el valor del argumento de cada llamada a procedimiento remoto. Use esta configuración si el espacio de nombres al que se va a conectar requiere una conexión cifrada.

Para determinar si una llamada es correcta, compruebe el valor devuelto después de cambiar el nivel de autenticación.

Por ejemplo, como las conexiones locales siempre tienen un nivel de autenticación de wbemAuthenticationLevelPktPrivacy, el ejemplo siguiente no puede establecer el nivel de autenticación porque se conecta al equipo local.

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

Un proveedor puede establecer la seguridad en un espacio de nombres para que no se devuelva ningún dato a menos que use la privacidad de paquete (PktPrivacy) en la conexión a ese espacio de nombres. Esto garantiza que los datos se cifren a medida que cruzan la red. Si intenta establecer un nivel de autenticación inferior, recibirá un mensaje de acceso denegado. Para obtener más información, consulte Protección de espacios de nombres WMI.

Cambio de los niveles de suplantación predeterminados mediante VBScript

Al realizar llamadas a la API de scripting para WMI, se recomienda usar los valores predeterminados que WMI proporciona para el nivel de suplantación. Las llamadas remotas y algunos proveedores con más de un salto de red requieren un nivel de suplantación mayor que el que usa WMI. Si el nivel de suplantación no es suficiente, un proveedor puede rechazar una solicitud o proporcionar información incompleta.

Si no establece el nivel de suplantación en un moniker ni mediante el establecimiento de SWbemSecurity.ImpersonationLevel en un objeto protegible, establezca el nivel de suplantación de DCOM predeterminado para el sistema operativo. El nivel de suplantación debe establecerse de acuerdo con los requisitos del sistema operativo de destino al que se va a conectar. Para obtener más información, consulte Conexión entre diferentes sistemas operativos.

En el ejemplo de código VBScript siguiente se muestra cómo cambiar el nivel de suplantación en el mismo script mostrado anteriormente.

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

En la tabla siguiente se enumeran los niveles de autenticación que se usan en WbemImpersonationLevelEnum.

Nombre o valor Descripción
wbemImpersonationLevelAnonymous
1
Moniker: Anónimo
Oculta las credenciales de la persona que llama. Las llamadas a WMI pueden dar error con este nivel de suplantación.
wbemImpersonationLevelIdentify
2
Moniker: Identificar
Permite que los objetos consulten las credenciales de la persona que llama. Las llamadas a WMI pueden dar error con este nivel de suplantación.
wbemImpersonationLevelImpersonate
3
Moniker: Suplantar
permite que los objetos usen las credenciales de la persona que llama. Este es el nivel de suplantación recomendado para las llamadas API de scripting para WMI.
wbemImpersonationLevelDelegate
4
Moniker: Delegar
Permite que los objetos dejen que otros objetos usen las credenciales de la persona que llama. Esta suplantación funcionará con la API de scripting para la llamadas WMI, pero puede constituir un riesgo innecesario para la seguridad.

En el ejemplo siguiente se muestra cómo establecer la suplantación en una cadena de moniker al obtener una instancia específica de Win32_Process.

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

Para obtener más información, consulte Crear una aplicación WMI o un script.

Establecimiento del nivel de suplantación predeterminado mediante el Registro

Si tiene acceso al Registro, también puede establecer la clave del Registro del nivel de suplantación predeterminado. Esta clave especifica qué nivel de suplantación usa la API de scripting para WMI, a menos que se especifique otra cosa. La ruta de acceso siguiente identifica la ruta de acceso del Registro.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM\Scripting\Nivel de suplantación predeterminado

De forma predeterminada, la clave del Registro está establecida en 3, lo que especifica el nivel de suplantación Suplantar. Puede que algunos proveedores requieran un nivel de suplantación superior.

Acceso al objeto SWbemSecurity en VBScript

La otra forma de establecer el nivel de suplantación es desde el objeto de seguridad SWbemSecurity, que aparece como propiedad Security_ de los objetos SWbemServices, SWbemObject, SWbemObjectSet, SWbemEventSource, SWbemObjectPath y SwbemLocator.

WMI pasa la configuración de seguridad de un objeto primario a los descendientes del objeto original. Por lo tanto, puede establecer el nivel de suplantación de un objeto SWbemServices después de iniciar sesión en WMI y las llamadas API mediante estos objetos creados a partir de él, como objetos de tipo SWbemObject.

Conexión a WMI en un equipo remoto

Protección de clientes de scripting