Objetos descriptores de seguridad de WMI

WMI tiene objetos y métodos que permiten leer y manipular descriptores de seguridad para determinar quién tiene acceso a objetos protegibles.

El rol de descriptores de seguridad

Los descriptores de seguridad definen los atributos de seguridad de objetos protegibles, como archivos, claves del Registro, espacios de nombres de WMI, impresoras, servicios o recursos compartidos. Un descriptor de seguridad contiene información sobre el propietario y el grupo principal de un objeto. Un proveedor puede comparar el descriptor de seguridad de recursos con la identidad de un usuario solicitante y determinar si el usuario tiene derecho a acceder al recurso que solicita un usuario o no. Para más información, vea Acceso a objetos protegibles de WMI.

Algunos métodos de WMI, como GetSD, devuelven un descriptor de seguridad en el formato de matriz de bytes binario. A partir de Windows Vista, use los métodos de la clase Win32_SecurityDescriptorHelper para convertir un descriptor de seguridad binario en una instancia de Win32_SecurityDescriptor, que se puede manipular más fácilmente. Para más información, vea Cambio de seguridad de acceso en objetos protegibles.

Control de acceso y objetos de seguridad WMI

A continuación se muestra una lista de objetos de seguridad de WMI:

En el diagrama siguiente se muestran las relaciones entre los objetos de seguridad de WMI.

relaciones entre objetos de seguridad wmi

Para más información sobre el rol de seguridad de acceso, consulte Procedimientos recomendados de seguridad, Mantenimiento de la seguridad de WMI y Control de acceso.

Objeto Win32_SecurityDescriptor

La siguiente tabla enumera las propiedades de la clase Win32_SecurityDescriptor.

Propiedad Descripción
ControlFlags Conjunto de bits de control que califican el significado de un SD o sus miembros individuales. Para más información sobre cómo establecer los valores de bits ControlFlags, vea Win32_SecurityDescriptor.
DACL Lista de control de acceso discrecional (ACL) de usuarios y grupos, y sus derechos de acceso a un objeto protegible. Esta propiedad contiene una matriz de instancias Win32_ACE que representan Entradas de Control de acceso. Para más información, consulte Creación de una DACL.
Grupo Grupo al que pertenece este objeto protegido. Esta propiedad contiene una instancia de Win32_Trustee que contiene el nombre, el dominio y el identificador de seguridad (SID) del grupo al que pertenece el propietario.
Propietario Propietario de este objeto protegido. Esta propiedad contiene una instancia de Win32_Trustee que contiene el nombre, el dominio y el identificador de seguridad (SID) del propietario.
SACL La Lista de control de acceso al sistema (ACL) contiene una matriz de instancias Win32_ACE que representan el tipo de intentos de acceso que generan registros de auditoría para usuarios o grupos. Para más información, vea SACL para un nuevo objeto.

DACL y SACL

Las matrices de objetos Win32_ACE en la lista de control de acceso discrecional (DACL) y la lista de control de acceso del sistema (SACL) crean un vínculo entre un usuario o grupo y sus derechos de acceso.

Cuando una propiedad DACL no contiene una entrada de control de acceso (ACE), no se conceden derechos de acceso y se deniega el acceso al objeto.

Nota

Una DACL NULL proporciona acceso total a todos los usuarios, lo que supone un riesgo de seguridad grave. Para más información, consulte Creación de una DACL.

Win32_ACE, Win32_Trustee, Win32_SID

Un objeto Win32_ACE contiene una instancia de la clase Win32_Trustee que identifica un usuario o grupo, y una propiedad AccessMask que es una máscara de bits, que especifica las acciones que puede realizar un usuario o grupo. Por ejemplo, a un usuario o grupo se le podría conceder el derecho de leer un archivo, pero no escribir en el archivo. Un objeto Win32_ACE también contiene una ACE que indica si es o no un permiso o un acceso denegado.

Nota

El orden de Win32_ACE en una DACL es importante porque en una DACL se permite tanto permitir como denegar la entrada de control de acceso (ACE). Para más información, consulte Orden de las entradas de control de acceso en una lista de control de acceso discrecional.

Cada cuenta de usuario o grupo representado por un Win32_Trustee tiene un identificador de seguridad (SID) que identifica de forma única una cuenta y especifica los privilegios de acceso de la cuenta. La forma en que se especifican los datos del SID depende del sistema operativo. Para más información, vea Cambio de seguridad de acceso en objetos protegibles.

En el diagrama siguiente se muestra el contenido de una instancia de Win32_ACE.

contenido de una instancia de win32-ace

Ejemplo: Comprobación de quién tiene acceso a impresoras

En el siguiente ejemplo de código VBScript se muestra cómo usar el descriptor de seguridad de la impresora. El script llama al método GetSecurityDescriptor de la clase Win32_Printer para obtener el descriptor y después determina si hay una Lista de control de acceso discrecional (DACL) presente en el descriptor de seguridad. Si existe una DACL, el script obtiene la lista de Entradas de control de acceso (ACE) de la DACL. Cada ACE se representa mediante una instancia de Win32_ACE. El script comprueba cada ACE para obtener el nombre del usuario y determinar si el usuario tiene acceso a la impresora. El usuario se representa en mediante una instancia de Win32_Trustee insertada en la instancia de Win32_ACE.

SE_DACL_PRESENT = &h4
ACCESS_ALLOWED_ACE_TYPE = &h0
ACCESS_DENIED_ACE_TYPE  = &h1

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

Set colInstalledPrinters =  objWMIService.ExecQuery _
    ("Select * from Win32_Printer")

For Each objPrinter in colInstalledPrinters
   Wscript.Echo "Name: " & objPrinter.Name 
' Get security descriptor for printer
    Return = objPrinter.GetSecurityDescriptor( objSD )
    If ( return <> 0 ) Then
 WScript.Echo "Could not get security descriptor: " & Return
 wscript.Quit Return
    End If
' Extract the security descriptor flags
    intControlFlags = objSD.ControlFlags
    If intControlFlags AND SE_DACL_PRESENT Then
' Get the ACE entries from security descriptor
        colACEs = objSD.DACL
    For Each objACE in colACEs
' Get all the trustees and determine which have access to printer
        WScript.Echo objACE.Trustee.Domain & "\" & objACE.Trustee.Name
        If objACE.AceType = ACCESS_ALLOWED_ACE_TYPE Then
            WScript.Echo vbTab & "User has access to printer"
        ElseIf objACE.AceType = ACCESS_DENIED_ACE_TYPE Then
            WScript.Echo vbTab & "User does not have access to the printer"
        End If
    Next
    Else
    WScript.Echo "No DACL found in security descriptor"
End If
Next

Cambio de la seguridad de acceso en objetos protegibles

Clase auxiliar del descriptor de seguridad

Procedimientos recomendados para la seguridad

Mantenimiento de la seguridad de WMI

Control de acceso

Acceso a espacios de nombres WMI