Condividi tramite


Polling delle modifiche tramite USNChanged

Il controllo DirSync è potente ed efficiente, ma presenta due limitazioni significative:

  • Solo per le applicazioni con privilegi elevati: per usare il controllo DirSync, un'applicazione deve essere eseguita con un account con privilegi edizione Standard_SYNC_AGENT_NAME nel controller di dominio. Pochi account sono così con privilegi elevati, quindi un'applicazione che usa il controllo DirSync non può essere eseguita dagli utenti normali.
  • Nessun ambito del sottoalbero: il controllo DirSync restituisce tutte le modifiche che si verificano all'interno di un contesto di denominazione. Un'applicazione interessata solo alle modifiche che si verificano in un piccolo sottoalbero di un contesto di denominazione deve superare molte modifiche irrilevanti, inefficienti sia per l'applicazione che per il controller di dominio.

Le modifiche da Active Directory possono essere ottenute anche eseguendo una query sull'attributo uSNChanged , evitando così le limitazioni del controllo DirSync. Questa alternativa non è migliore del controllo DirSync in tutto il rispetto perché implica la trasmissione di tutti gli attributi quando qualsiasi attributo cambia e richiede più lavoro da parte dello sviluppatore dell'applicazione per gestire correttamente determinati scenari di errore. Attualmente è il modo migliore per scrivere determinate applicazioni di rilevamento delle modifiche.

Quando un controller di dominio modifica un oggetto imposta l'attributo uSNChanged dell'oggetto su un valore maggiore del valore precedente dell'attributo uSNChanged per tale oggetto e maggiore del valore corrente dell'attributo uSNChanged per tutti gli altri oggetti contenuti nel controller di dominio. Di conseguenza, un'applicazione può trovare l'oggetto modificato più di recente in un controller di dominio trovando l'oggetto con il valore uSNChanged più grande. Il secondo oggetto modificato più di recente in un controller di dominio avrà il secondo valore uSNChanged più grande e così via.

L'attributo uSNChanged non viene replicato, pertanto la lettura dell'attributo uSNChanged di un oggetto in due controller di dominio diversi genererà valori diversi.

Ad esempio, l'attributo uSNChanged può essere usato per tenere traccia delle modifiche in un sottoalbero S. Prima di tutto, eseguire una "sincronizzazione completa" del sottoalbero S. Si supponga che il valore uSNChanged più grande per qualsiasi oggetto in S sia U. Eseguire periodicamente una query per tutti gli oggetti nel sottoalbero S il cui valore uSNChanged è maggiore di U. La query restituirà tutti gli oggetti modificati dopo la sincronizzazione completa. Impostare su uSNChanged più grande tra questi oggetti modificati e si è pronti a eseguire di nuovo il polling.

Le sottigliezze dell'implementazione di un'applicazione di sincronizzazione uSNChanged includono:

  • Usare l'attributo highestCommittedUSN di rootD edizione Standard per associare i filtri uSNChanged. Ovvero, prima di avviare una sincronizzazione completa, leggere il valore highestCommittedUSN del controller di dominio affiliato. Eseguire quindi una query di sincronizzazione completa (usando i risultati di paging) per inizializzare il database. Al termine, archiviare il valore highestCommittedUSN letto prima della query di sincronizzazione completa. Per usare come limiti inferiori dell'attributo uSNChanged per la sincronizzazione successiva. Successivamente, per eseguire una sincronizzazione incrementale, rileggere l'attributo rootD edizione Standard highestCommittedUSN. Eseguire quindi una query per gli oggetti pertinenti, usando i risultati di paging, il cui valore uSNChanged è maggiore dei limiti inferiori del valore dell'attributo uSNChanged salvato dalla sincronizzazione precedente. Aggiornare il database usando queste informazioni. Al termine, aggiornare i limiti inferiori dell'attributo uSNChanged dal valore highestCommittedUSN letto prima della query di sincronizzazione incrementale. Archiviare sempre i limiti inferiori del valore dell'attributo uSNChanged nella stessa risorsa di archiviazione che l'applicazione sta sincronizzando con il contenuto del controller di dominio.

    Seguendo questa procedura, anziché in base ai valori uSNChanged sugli oggetti recuperati, evita di rieseminare gli oggetti aggiornati del server che rientrano all'esterno del set applicabile all'applicazione.

  • Poiché uSNChanged è un attributo non replicato, l'applicazione deve essere associata allo stesso controller di dominio ogni volta che viene eseguita. Se non è in grado di eseguire l'associazione a tale controller di dominio, deve attendere fino a quando non può farlo oppure associare un nuovo controller di dominio ed eseguire una sincronizzazione completa con il controller di dominio. Quando l'applicazione è associata a un controller di dominio, registra il nome DNS del controller di dominio in una risorsa di archiviazione stabile, che è la stessa risorsa di archiviazione che mantiene coerente con il contenuto del controller di dominio. Usa quindi il nome DNS archiviato per eseguire l'associazione allo stesso controller di dominio per le sincronizzazioni successive.

  • L'applicazione deve rilevare quando il controller di dominio a cui è attualmente associato è stato ripristinato dal backup, perché ciò può causare incoerenza. Quando l'applicazione è associata a un controller di dominio memorizza nella cache l'"ID chiamata" di tale controller di dominio in una risorsa di archiviazione stabile, ovvero la stessa risorsa di archiviazione che mantiene coerente con il contenuto del controller di dominio. L'"ID chiamata" di un controller di dominio è un GUID archiviato nell'attributo invocationID dell'oggetto servizio del controller di dominio. Per ottenere il nome distinto dell'oggetto servizio di un controller di dominio, leggere l'attributo dsServiceName dell'oggetto rootD edizione Standard.

    Tenere presente che quando lo spazio di archiviazione stabile dell'applicazione viene ripristinato dal backup non esistono problemi di coerenza perché il nome del controller di dominio, l'ID chiamata e i limiti inferiori del valore dell'attributo uSNChanged vengono archiviati con i dati sincronizzati con il contenuto del controller di dominio.

  • Usare il paging durante l'esecuzione di query sul server, sia con sincronizzazioni complete che incrementali, per evitare la possibilità di recuperare set di risultati di grandi dimensioni contemporaneamente. Per altre informazioni, vedere Specifica di altre opzioni di ricerca.

  • Eseguire query basate su indici per evitare di forzare il server a archiviare risultati intermedi di grandi dimensioni quando si usano risultati di paging. Per altre informazioni, vedere Attributi indicizzati.

  • In generale, non usare l'ordinamento lato server dei risultati della ricerca, che può forzare il server a archiviare e ordinare risultati intermedi di grandi dimensioni. Questo vale sia per le sincronizzazioni complete che per le sincronizzazioni incrementali. Per altre informazioni, vedere Specifica di altre opzioni di ricerca.

  • Gestire correttamente le condizioni padre. L'applicazione può riconoscere un oggetto prima di aver riconosciuto il relativo elemento padre. A seconda dell'applicazione, questo può essere o meno un problema. L'applicazione può sempre leggere lo stato corrente dell'elemento padre dalla directory.

  • Per gestire gli oggetti spostati o eliminati, archiviare l'attributo objectGUID di ogni oggetto rilevato. L'attributo objectGUID di un oggetto rimane invariato indipendentemente dalla posizione in cui viene spostato in tutta la foresta.

  • Per gestire gli oggetti spostati, eseguire sincronizzazioni complete periodiche o aumentare l'ambito di ricerca e filtrare le modifiche non interessante al termine del client.

  • Per gestire gli oggetti eliminati, eseguire sincronizzazioni complete periodiche o eseguire una ricerca separata di oggetti eliminati quando si esegue una sincronizzazione incrementale. Quando si esegue una query per gli oggetti eliminati, recuperare l'objectGUID degli oggetti eliminati per determinare gli oggetti da eliminare dal database. Per altre informazioni, vedere Recupero di oggetti eliminati.

  • Tenere presente che i risultati della ricerca includono solo gli oggetti e gli attributi che il chiamante ha l'autorizzazione per la lettura (in base ai descrittori di sicurezza e agli elenchi di controllo dati nei vari oggetti). Per altre informazioni, vedere Effetti della sicurezza nelle query.

Per altre informazioni e un esempio di codice che illustra le nozioni di base di un'applicazione di sincronizzazione USNChanged, vedere Codice di esempio per recuperare le modifiche tramite USNChanged.