Compartir a través de


Sondear los cambios mediante USNChanged

El control DirSync es eficaz y eficaz, pero tiene dos limitaciones importantes:

  • Solo para aplicaciones con privilegios elevados: para usar el control DirSync, una aplicación debe ejecutarse en una cuenta que tenga el privilegio SE_SYNC_AGENT_NAME en el controlador de dominio. Pocas cuentas tienen tanto privilegios, por lo que los usuarios normales no pueden ejecutar un control DirSync que use el control DirSync.
  • Sin ámbito de subárbol: el control DirSync devuelve todos los cambios que se producen dentro de un contexto de nomenclatura. Una aplicación interesada solo en los cambios que se producen en un subárbol pequeño de un contexto de nomenclatura debe desplazarse a través de muchos cambios irrelevantes, lo que es ineficaz tanto para la aplicación como para el controlador de dominio.

Los cambios de Active Directory también se pueden obtener consultando el atributo uSNChanged , lo que evita las limitaciones del control DirSync. Esta alternativa no es mejor que el control DirSync en todos los aspectos porque implica transmitir todos los atributos cuando cambia cualquier atributo y requiere más trabajo del desarrollador de aplicaciones para controlar determinados escenarios de error correctamente. Actualmente, es la mejor manera de escribir determinadas aplicaciones de seguimiento de cambios.

Cuando un controlador de dominio modifica un objeto, establece el atributo uSNChanged de ese objeto en un valor mayor que el valor anterior del atributo uSNChanged para ese objeto y mayor que el valor actual del atributo uSNChanged para todos los demás objetos contenidos en ese controlador de dominio. Como consecuencia, una aplicación puede encontrar el objeto cambiado más recientemente en un controlador de dominio mediante la búsqueda del objeto con el valor uSNChanged más grande. El segundo objeto cambiado más recientemente en un controlador de dominio tendrá el segundo valor uSNChanged más grande, etc.

El atributo uSNChanged no se replica, por lo tanto, leer el atributo uSNChanged de un objeto en dos controladores de dominio diferentes normalmente proporcionará valores diferentes.

Por ejemplo, el atributo uSNChanged se puede usar para realizar un seguimiento de los cambios en un subárbol S. En primer lugar, realice una "sincronización completa" del subárbol S. Suponga que el valor uSNChanged más grande de cualquier objeto de S es U. Consulta periódicamente para todos los objetos del subárbol S cuyo valor uSNChanged es mayor que U. La consulta devolverá todos los objetos que han cambiado desde la sincronización completa. Establézcalo en el uSNChanged más grande entre estos objetos modificados y esté listo para sondear de nuevo.

Las sutilezas de la implementación de una aplicación de sincronización uSNChanged incluyen:

  • Use el atributo highestCommittedUSN de rootDSE para enlazar los filtros uSNChanged . Es decir, antes de iniciar una sincronización completa, lea el valor de highestCommittedUSN del controlador de dominio afiliado. A continuación, realice una consulta de sincronización completa (mediante resultados paginados) para inicializar la base de datos. Cuando se complete, almacene el valor más altoCommittedUSN leído antes de la consulta de sincronización completa; para usar como límites inferiores del atributo uSNChanged para la siguiente sincronización. Más adelante, para realizar una sincronización incremental, vuelva a leer el atributo rootDSE highestCommittedUSN . A continuación, consulte los objetos pertinentes mediante resultados paginados, cuyo uSNChanged sea mayor que los límites inferiores del valor del atributo uSNChanged guardados de la sincronización anterior. Actualice la base de datos con esta información. Cuando haya finalizado, actualice los límites inferiores del atributo uSNChanged del valor highestCommittedUSN leído antes de la consulta de sincronización incremental. Almacene siempre los límites inferiores del valor del atributo uSNChanged en el mismo almacenamiento que la aplicación está sincronizando con el contenido del controlador de dominio.

    Siguiendo este procedimiento, en lugar de eso, en función de los valores uSNChanged de los objetos recuperados, evita volver a examinar los objetos actualizados del servidor que se encuentran fuera del conjunto que se aplica a la aplicación.

  • Dado que uSNChanged es un atributo no replicado, la aplicación debe enlazarse al mismo controlador de dominio cada vez que se ejecuta. Si no puede enlazar a ese controlador de dominio, debe esperar hasta que pueda hacerlo, o asociarse con algún nuevo controlador de dominio y realizar una sincronización completa con ese controlador de dominio. Cuando la aplicación se asocia con un controlador de dominio, registra el nombre DNS de ese controlador de dominio en almacenamiento estable, que es el mismo almacenamiento que mantiene coherente con el contenido del controlador de dominio. A continuación, usa el nombre DNS almacenado para enlazar al mismo controlador de dominio para las sincronizaciones posteriores.

  • La aplicación debe detectar cuándo el controlador de dominio con el que está asociado actualmente se ha restaurado a partir de la copia de seguridad, ya que esto puede provocar incoherencia. Cuando la aplicación se asocia con un controlador de dominio, almacena en caché el "identificador de invocación" de ese controlador de dominio en almacenamiento estable, es decir, el mismo almacenamiento que mantiene coherente con el contenido del controlador de dominio. El identificador de invocación de un controlador de dominio es un GUID almacenado en el atributo invocationID del objeto de servicio del controlador de dominio. Para obtener el nombre distintivo del objeto de servicio de un controlador de dominio, lea el atributo dsServiceName del rootDSE.

    Tenga en cuenta que cuando el almacenamiento estable de la aplicación se restaura a partir de la copia de seguridad no hay problemas de coherencia porque el nombre del controlador de dominio, el identificador de invocación y los límites inferiores del valor del atributo uSNChanged se almacenan con los datos sincronizados con el contenido del controlador de dominio.

  • Use la paginación al consultar el servidor, tanto las sincronizaciones completas como incrementales, para evitar la posibilidad de recuperar conjuntos de resultados grandes simultáneamente. Para obtener más información, vea Especificar otras opciones de búsqueda.

  • Realice consultas basadas en índices para evitar forzar al servidor a almacenar resultados intermedios de gran tamaño al usar resultados paginados. Para obtener más información, vea Atributos indexados.

  • En general, no use la ordenación del lado servidor de los resultados de búsqueda, lo que puede forzar al servidor a almacenar y ordenar resultados intermedios de gran tamaño. Esto se aplica a las sincronizaciones completas e incrementales. Para obtener más información, vea Especificar otras opciones de búsqueda.

  • No controle las condiciones primarias correctamente. La aplicación puede reconocer un objeto antes de que haya reconocido su elemento primario. Dependiendo de la aplicación, esto puede o no ser un problema. La aplicación siempre puede leer el estado actual del elemento primario del directorio.

  • Para controlar objetos movidos o eliminados, almacene el atributo objectGUID de cada objeto de seguimiento. El atributo objectGUID de un objeto permanece sin cambios independientemente de dónde se mueva a lo largo del bosque.

  • Para controlar los objetos movidos, realice sincronizaciones completas periódicas o aumente el ámbito de búsqueda y filtre los cambios sin interés en el extremo del cliente.

  • Para controlar los objetos eliminados, realice sincronizaciones completas periódicas o realice una búsqueda independiente de objetos eliminados al realizar una sincronización incremental. Cuando se consultan objetos eliminados, recupere el objectGUID de los objetos eliminados para determinar los objetos que se van a eliminar de la base de datos. Para obtener más información, vea Recuperar objetos eliminados.

  • Tenga en cuenta que los resultados de la búsqueda incluyen solo los objetos y atributos que el autor de la llamada tiene permiso para leer (en función de los descriptores de seguridad y las DACL en los distintos objetos). Para obtener más información, vea Efectos de seguridad en consultas.

Para obtener más información y un ejemplo de código que muestra los conceptos básicos de una aplicación de sincronización USNChanged, vea Código de ejemplo para recuperar cambios mediante USNChanged.