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
- Control de acceso y objetos de seguridad WMI
- Objeto Win32_SecurityDescriptor
- DACL y SACL
- Win32_ACE, Win32_Trustee, Win32_SID
- Ejemplo: Comprobación de quién tiene acceso a impresoras
- Temas relacionados
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.
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.
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