Cómo utilizar Visual Basic y ADsSecurity.dll para ordenar correctamente las ACE en una ACL

Seleccione idioma Seleccione idioma
Id. de artículo: 269159 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

En este artículo muestra cómo utilizar ADsSecurity.dll para obtener un descriptor de seguridad (SD) de un archivo, el objeto de Active Directory o la clave del registro. En este artículo se demuestra cómo, una vez obtenido un SD, para recuperar la lista de control de acceso discrecional (ACL) de ese SD y, a continuación, agregue una entrada de control de acceso (ACE) en la ubicación correcta. El artículo proporciona un sencillo algoritmo junto con un ejemplo de código de Microsoft Visual Basic que ilustran cómo, a continuación correctamente una ACL de pedido, la ACL volver a escribir la SD. en

Más información

El método de IADsAccessControlList::AddAce agrega la ACE en la parte superior de la ACL. En algunos casos, agregar una ACE en la parte superior creará acceso de seguridad no deseados. La caché de propiedad de interfaces de servicio de Active Directory (ADSI) en Microsoft Windows Server 2003 y en Microsoft Windows XP ordenará correctamente la DACL antes de escribir de nuevo en el objeto. En Microsoft Windows 2000 sólo es necesario volver a ordenar. El orden correcto de ACE de una ACL es:
ACE de acceso denegado que se aplican al propio objeto
ACE de acceso denegado que aplican a una secundaria del objeto, como un conjunto de propiedades o propiedad
ACE permite el acceso que se aplican al propio objeto
ACE permite el acceso que aplican a una secundaria del objeto, como un conjunto de propiedades o propiedad
En los productos enumerados en este artículo, la interfaz IADsAccessControlList no admite un método que ordena correctamente una ACL. Las ACE deben ordenarse en estos cinco grupos:
Acceso denegado en el objeto
Acceso denegado en un secundario o propiedad
Acceso permitido en el objeto
-Permite el acceso en un secundario o propiedad
Todos heredan ACE
No se debe modificar el orden de las ACE heredadas. Todas las ACE heredadas se agregan por el sistema operativo y se ordenan correctamente. Un programador puede especificar que una ACE debe heredarse y Windows 2000 o Windows NT se ocupará de propagación de ACE a objetos secundarios.

Hay una excepción las reglas de propagación. Las ACE que agrega a ACL un objeto no obtener aplicará automáticamente a los objetos existentes en el árbol. Es responsabilidad del programador para recorrer el árbol y propagar la ACE agregando la ACE a los objetos existentes. En objetos nuevos en el subárbol se propagará la ACE.

Algoritmo para ordenar las ACE de una ACL

  1. Obtener la ACL discrecional (DACL) desde el descriptor de seguridad.
  2. Compruebe el IADsAccessControlEntry::AceFlags para ver si la ACE se hereda (comprobación de la ADS_ACEFLAG_INHERITED_ACE bit).
  3. Compruebe el IADsAccessControlEntry::AceType para ver qué tipo de la ACE concede el acceso y lo que se concede el acceso a (el propio objeto o propiedades del objeto). En la lista siguiente se describe los valores de tipo ACE y su significado:
    ADS_ACETYPE_ACCESS_ALLOWED - concede acceso permitido a todo el objeto
    ADS_ACETYPE_ACCESS_ALLOWED_OBJECT - indica se permite el acceso a una propiedad o conjunto de propiedades
    ADS_ACETYPE_ACCESS_DENIED - deniega el acceso a todo el objeto
    ADS_ACETYPE_ACCESS_DENIED_OBJECT - deniega el acceso a una propiedad o conjunto de propiedades.
  4. Coloque la ACE en la DACL temporal apropiada según el valor de IADsAccessControlListEntry::AceType.
  5. Reconstruir la ACL de las ACL independientes en el orden siguiente:
    Tipos de ACE ADS_ACETYPE_ACCESS_DENIED
    Tipos de ACE ADS_ACETYPE_ACCESS_DENIED_OBJECT
    Tipos de ACE ADS_ACETYPE_ACCESS_ALLOWED
    Tipos de ACE ADS_ACETYPE_ACCESS_ALLOWED_OBJECT
    Las ACE con ADS_ACEFLAG_INHERITED_ACE indicador establecen en el IADsAccessControlListEntry::AceFlags
  6. Establecer nueva ACL en el mismo nivel de revisión como la ACL anterior.
  7. Reemplazar la ACL en el descriptor de seguridad.

Pasos para utilizar el código de Visual Basic que se proporciona en este artículo

  1. Registrar ADsSecurity.dll.

    ADsSecurity.dll es parte del Kit de recursos interfaces de servicio de Active Directory (ADSI) 2.5. Para descargar el kit de recursos de ADSI 2.5, visite el siguiente sitio Web de Microsoft:
    http://www.microsoft.com/technet/archive/winntas/downloads/adsi25.mspx?mfr=true
    Utilice Regsvr32 para registrar ADsSecurity.dll. Si este archivo DLL no se registra correctamente, esto indica que ADSI no está instalado. Si está ejecutando el código en un equipo basado en Microsoft Windows NT o en un equipo basado en Microsoft Windows 98, instalar la extensión de cliente de Active Directory adecuado. Para obtener más información acerca de cómo obtener a estos clientes, consulte la sección "Referencias".
  2. Inicie Visual Basic. A continuación, cree un proyecto EXE estándar.
  3. Ver las referencias del proyecto. Asegúrese de que está seleccionado el seguimiento:
    • Biblioteca de DS tipo activo
    • Biblioteca de tipos de ADsSecurity 2.5
  4. Realice un botón de comando en el formulario.
  5. Haga doble clic en el botón de comando. A continuación, pegue el código siguiente en el controlador de comandos Command1_Click .

Código de ejemplo de Visual Basic muestra cómo implementar el algoritmo de ordenación

Dim sec As New ADsSecurity
Dim sd As IADsSecurityDescriptor
Dim dacl As IADsAccessControlList
Dim ace As IADsAccessControlEntry
Dim newAce As New AccessControlEntry
'
' Declare temporary ACLs for sorting the original
' ACL
'
Dim newdacl As New AccessControlList
Dim ImpDenyDacl As New AccessControlList
Dim ImpDenyObjectDacl As New AccessControlList
Dim InheritedDacl As New AccessControlList
Dim ImpAllowDacl As New AccessControlList
Dim impAllowObjectDacl As New AccessControlList

Private Sub Command1_Click()
'
' Be sure to register ADsSecurity.Dll using RegSvr32 and
' adding the ADsSecurity2.5 Type Library to you references for
' the project.
'
' Using the ADsSecurity object, retrieve a SD for an object.  Just
' Replace the LDAP:// path with the path of an object that contains a
' SD.  For additional details on valid path strings, review
' the information stored in the Platform SDK ADSI samples starting with
' "<Platform SDK Root>\Samples\NetDs\ADSI\rtk.htm"
'
Set sec = CreateObject("ADsSecurity")<BR/>
' TODO :  replace the servername and DN of the object you want to modify.
Set sd = sec.GetSecurityDescriptor("LDAP://MyDCname/cn=MyUser,cn=Users,dc=MyDom,dc=com")

'Displaying the ACE in the DACL --- it's the same way you display ACEs for File, File Share, Registry, Exchange, and Active Directory's ACL.

Set dacl = sd.DiscretionaryAcl
Debug.Print Date & Time & "Initial Values of DACL"
For Each ace In dacl
   Debug.Print ace.Trustee
   Debug.Print Hex(ace.AccessMask)
   Debug.Print Hex(ace.AceType)
   Debug.Print Hex(ace.AceFlags)
   Debug.Print Hex(ace.Flags)
Next

Debug.Print dacl.AceCount

'
' Initialize all of the new ACLs
'
' If you are doing this in VBSscript you will need to use
' The following methods of creating the ACL bins instead of
' using the Dim As New statements above. 
'
'Set newAce = CreateObject("AccessControlEntry")
'Set newdacl = CreateObject("AccessControlList")
'Set InheritedDacl = CreateObject("AccessControlList")
'Set ImpAllowDacl = CreateObject("AccessControlList")
'Set InhAllowDacl = CreateObject("AccessControlList")
'Set ImpDenyObjectDacl = CreateObject("AccessControlList")
'Set ImpAllowObjectDacl = CreateObject("AccessControlList")
'
'
' Create a new ace, this one
' sets an extended right on the user object that allows the
' trustee to read and write the userAccountControl property of an
' user object.
'
' TODO : Replace the trustee with an appropriate trustee on the domain
' in question.
'
newAce.Trustee = "MyDomain\Myuser"
newAce.Flags = ADS_FLAG_OBJECT_TYPE_PRESENT
newAce.ObjectType = "{BF967A68-0DE6-11D0-A285-00AA003049E2}"
newAce.AccessMask = ADS_RIGHT_DS_READ_PROP Or ADS_RIGHT_DS_WRITE_PROP
newAce.AceType = ADS_ACETYPE_ACCESS_ALLOWED_OBJECT
newAce.AceFlags = ADS_ACEFLAG_INHERIT_ACE
'
' Place the new ace in the DACL
'
dacl.AddAce newAce
'
' Sift the DACL into 5 bins:
' Inherited Aces
' Implicit Deny Aces
' Implicit Deny Object Aces
' Implicit Allow Aces
' Implicit Allow object aces
'
For Each ace In dacl
  '
  ' Sort the original ACEs into their appropriate
  ' ACLs
  '
  Debug.Print ace.Trustee
  If ((ace.AceFlags And ADS_ACEFLAG_INHERITED_ACE) = ADS_ACEFLAG_INHERITED_ACE) Then
     '
     ' Do not really care about the order of inherited aces. Since we are
     ' adding them to the top of a new list, when they are added back
     ' to the Dacl for the object, they will be in the same order as
     ' they were originally. Just a positive side effect of adding items
     ' of a LIFO (Last In First Out) type list.
     '
     InheritedDacl.AddAce ace
  Else
     '
     ' We have an Implicit ACE, let's put it the proper pool
     '
     Select Case ace.AceType
     Case ADS_ACETYPE_ACCESS_ALLOWED
        '
        ' We have an implicit allow ace
        '
        ImpAllowDacl.AddAce ace
     Case ADS_ACETYPE_ACCESS_DENIED
        '
        ' We have an implicit Deny ACE
        '
        ImpDenyDacl.AddAce ace
     Case ADS_ACETYPE_ACCESS_ALLOWED_OBJECT
        '
        ' We have an object allowed ace
        ' Does it apply to a property? or an Object?
        '
        impAllowObjectDacl.AddAce ace
     Case ADS_ACETYPE_ACCESS_DENIED_OBJECT
        '
        ' We have an object Deny ace
        '
        ImpDenyObjectDacl.AddAce ace
     Case Else
        '
        ' Missed a bin?
        '
        Debug.Print "Bad ace...." & Hex(ace.AceType)
     End Select
  End If
Next
'
' Combine the ACEs in the proper order
' Implicit Deny
' Implicit Deny Object
' Implicit Allow
' Implicit Allow Object
' Inherited aces
'
' Implicit Deny
'
For Each ace In ImpDenyDacl
  newdacl.AddAce ace
Next
'
' Implicit Deny Object
'
For Each ace In ImpDenyObjectDacl
  newdacl.AddAce ace
Next
'
' Implicit Allow
'
For Each ace In ImpAllowDacl
  newdacl.AddAce ace
Next
'
' Implicit Allow Object
'
For Each ace In impAllowObjectDacl
  newdacl.AddAce ace
Next
'
' Inherited Aces
'
For Each ace In InheritedDacl
  newdacl.AddAce ace
Next

sd.DiscretionaryAcl = newdacl
Debug.Print Date
For Each ace In newdacl
   Debug.Print ace.Trustee
   Debug.Print "Ace Mask: " & Hex(ace.AccessMask)
   Debug.Print "Ace Type: " & Hex(ace.AceType)
   Debug.Print "Ace Flags: " & Hex(ace.AceFlags)
   Debug.Print "Object Type value: " & Hex(ace.Flags)
   Debug.Print "Object Guid : " & ace.ObjectType
Next
'
' Set the appropriate revision level
' for the DACL
'
newdacl.AclRevision = dacl.AclRevision
'
' Replace the Security Descriptor
'
sec.SetSecurityDescriptor sd
' If this generates the error -214023559 or 80070539 check your TODO
' strings.  This error is most likely a problem with DNS name resolution.
				

Referencias

Para obtener información adicional, haga clic en los números de artículo siguientes para verlos en Microsoft Knowledge Base:
269175Cómo utilizar C++ para ordenar correctamente ACE en una ACL
279682Cómo utilizar ADsSecurity.dll para agregar una entrada de control de acceso a una carpeta NTFS
Para obtener información adicional acerca de cómo instalar Active Directory Client Extension, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
288358Cómo instalar Active Directory Client Extension

Propiedades

Id. de artículo: 269159 - Última revisión: lunes, 15 de enero de 2007 - Versión: 7.1
La información de este artículo se refiere a:
  • Microsoft Active Directory Service Interfaces 2.5
  • Microsoft Active Directory Service Interfaces 2.5
  • Microsoft Windows Scripting Host 2.5
Palabras clave: 
kbmt kbdswadsi2003swept kbhowto KB269159 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 269159
Renuncia a responsabilidad de los contenidos de la KB sobre productos a los que ya no se ofrece asistencia alguna
El presente artículo se escribió para productos para los que Microsoft ya no ofrece soporte técnico. Por tanto, el presente artículo se ofrece "tal cual" y no será actualizado.

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com