Windows Server

Recupero degli oggetti contrassegnati per la rimozione definitiva di Active Directory

Gil Kirkpatrick

 

Panoramica:

  • Come memorizzare gli oggetti eliminati in Active Directory
  • Uso di LDP e ADRESTORE per trovare e ripristinare gli oggetti contrassegnati per la rimozione definitiva
  • Attributi degli oggetti e systemFlags

La perdita accidentale dei dati è una realtà con cui bisogna fare i conti, anche se si preferirebbe pensare ad altro, e, in qualità di professionista IT, è necessario prepararsi per poter far fronte a qualsiasi tipo di scenario di ripristino. Nel numero di aprile 2007 di TechNet Magazine, ho spiegato quanto è importante avere un piano

per il ripristino di utenti e gruppi di Active Directory®. In questo articolo, disponibile all'indirizzo technetmagazine.com/issues/2007/04/ADRecovery, ho analizzato i meccanismi dei processi di collegamento degli oggetti, replica, eliminazione e ripristino autorevole. Sfortunatamente, la funzione di ripristino autorevole richiede l'avvio di un controller di dominio (DC) in modalità ripristino servizi directory (DSRM). Questa operazione non rende disponibile il controller di dominio per la durata dell'operazione di ripristino.

Si tratta di un altro tipo di approccio che è opportuno tenere in considerazione. Il recupero degli oggetti contrassegnati per la rimozione definitiva, in inglese "Tombstone" (il che non ha nulla a che vedere con gli zombie), è l'unico metodo che consente di ripristinare gli oggetti eliminati senza disconnettere un controller di dominio nonché di recuperare le informazioni sull'identità dell'oggetto eliminato, come gli attributi objectGUID e objectSid. Questa funzionalità risolve chiaramente il problema di ricreare un utente o un gruppo eliminato e di dover correggere i vecchi riferimenti dell'elenco di controllo di accesso (ACL) che contengono objectSid dell'oggetto eliminato. Occorre tenere presente che il recupero degli oggetti contrassegnati per la rimozione definitiva presenta alcuni limiti che verranno analizzati più avanti, pertanto potrebbe essere necessario far ricorso ai ripristini autorevoli.

Il recupero degli oggetti contrassegnati per la rimozione definitiva è stato introdotto in Active Directory di Windows Server® 2003 per semplificare alcuni scenari di ripristino dei dati. Questa funzionalità si avvale del fatto che Active Directory mantiene gli oggetti eliminati nel database per un determinato periodo di tempo prima di rimuoverli fisicamente. In questo articolo fornirò una descrizione dettagliata del modo in cui Active Directory elimina e recupera gli oggetti. Inoltre, illustrerò come recuperare gli oggetti eliminati utilizzando gli strumenti Microsoft standard.

Che cos'è un oggetto contrassegnato per la rimozione definitiva?

Quando Active Directory elimina un oggetto dalla directory, non lo rimuove fisicamente dal database. Al contrario, Active Directory contrassegna l'oggetto come eliminato impostandone l'attributo isDeleted su TRUE, rimuovendone la maggior parte degli attributi, ridenominandolo e spostandolo in un contenitore speciale del contesto dei nomi dell'oggetto denominato CN=Deleted Objects. L'oggetto, ora definito oggetto contrassegnato per la rimozione definitiva, è invisibile alle normali operazioni di directory, non viene visualizzato in nessuno snap-in MMC (Microsoft® Management Console) e la maggior parte delle utilità LDAP (Lightweight Directory Access Protocol) sono assolutamente inconsapevoli della sua esistenza. Tale oggetto è, a tutti gli effetti, assente. I dati, tuttavia, sono sempre lì, ma sono invisibili. Per quale motivo Active Directory conserva gli oggetti contrassegnati per la rimozione definitiva nel database?

Nonostante sia invisibile ad altri processi, un oggetto contrassegnato per la rimozione definitiva è visibile al processo di replica di Active Directory. Per verificare che l'eliminazione venga eseguita su tutti i controller di dominio che ospitano l'oggetto eliminato, Active Directory replica l'oggetto contrassegnato per la rimozione definitiva sugli altri controller di dominio. In questo modo l'oggetto contrassegnato per la rimozione definitiva viene utilizzato per replicare l'eliminazione in ogni parte dell'ambiente Active Directory.

Durata di un oggetto contrassegnato per la rimozione definitiva

Active Directory elimina in genere un oggetto dalla directory in risposta a un'operazione di eliminazione del protocollo LDAP o a un'operazione di eliminazione di Gestione account di protezione (SAM). Questa operazione viene definita come punto di partenza dell'operazione di eliminazione e si distingue dalle altre operazioni eseguite dal processo di replica di Active Directory. Si noti che questa discussione non riguarda gli oggetti dinamici che hanno un diverso meccanismo di eliminazione e che, una volta scaduti, vengono eliminati direttamente da Active Directory.

Quando Active Directory riceve l'operazione di eliminazione, analizza dapprima un elenco di controllo per assicurarsi che l'oggetto possa essere eliminato. Questo processo garantisce che siano rispettati i seguenti criteri:

  • L'attributo isDeleted dell'oggetto non è già impostato su TRUE (non è possibile eliminare un oggetto già eliminato!).
  • Il flag di controllo del descrittore di protezione specifico della risorsa "oggetto privato" non viene impostato nel descrittore di protezione dell'oggetto. Questa sembra essere una funzionalità non documentata. Il flag dell'oggetto privato è di 1 bit di byte Sbz1 della struttura del descrittore di protezione.
  • Il bit che non consente l'eliminazione (0x80000000) non è impostato nell'attributo systemFlags dell'oggetto.
  • L'attributo isCriticalSystemObject dell'oggetto non è impostato su TRUE.
  • Il descrittore di protezione dell'oggetto concede i diritti di accesso appropriati all'utente per eliminare l'oggetto. Più specificatamente, l'utente può eliminare l'oggetto stesso e può eliminare un figlio dall'oggetto padre.
  • L'oggetto non è un oggetto di riferimento incrociato (objectClass = crossRef) per un contesto dei nomi esistente.
  • L'oggetto non contiene alcun oggetto subordinato. Se l'operazione di eliminazione LDAP include l'ID dell'oggetto di controllo "eliminazione della struttura", Active Directory eliminerà automaticamente anche gli oggetti subordinati, a meno che l'attributo isCriticalSystemObject non sia impostato su TRUE. In questo modo si impedisce che gli oggetti di sistema critici vengano eliminati inavvertitamente come parte dell'operazione di eliminazione della struttura. Naturalmente, è possibile eliminare singolarmente questi oggetti.
  • L'oggetto non è un oggetto interno critico (ad esempio, non è l'oggetto nTDSDSA per il controller di dominio o gli oggetti segnaposto per gli antenati delle intestazioni di NC).

Oltre a quanto appena detto, Active Directory deve trovarsi in uno stato appropriato per elaborare l'operazione di eliminazione. Ad esempio, se Active Directory sta ridenominando un dominio, non eliminerà un account trust tra domini o un oggetto crossRef.

Se è stato stabilito che l'oggetto può di fatti essere eliminato, Active Directory procede a trasformarlo in un oggetto contrassegnato per la rimozione definitiva. Active Directory elimina dapprima gli attributi inutili dall'oggetto, lasciando solo quelli specificati nella Figura 1 e quelli definiti nello schema nell'oggetto contrassegnato per la rimozione definitiva. Per ulteriori informazioni, vedere la sezione "Recupero degli attributi oggetto". Successivamente, modifica il nome distinto relativo (RDN) dell'oggetto in CN<=old RDN>\0ADEL<:objectGUID>, dove \0A indica il carattere di avanzamento di riga ASCII e <objectGUID> è objectGUID espresso come stringa. L'attributo lastKnownParent viene impostato sul nome distinto (DN) del contenitore padre dell'oggetto e l'attributo isDeleted viene impostato su TRUE. Active Directory rimuove poi tutti gli attributi di collegamento in avanti e a ritroso dall'oggetto. Infine, se nell'attributo systemFlag dell'oggetto il bit "disallow move on delete" non è impostato, Active Directory sposta l'oggetto nel contenitore CN=Deleted Objects per NC. Per ulteriori informazioni su questo argomento, vedere l'intestazione laterale Attributo systemFlags e comportamento dell'oggetto.

Figure 1 Attributi salvati in un oggetto contrassegnato per la rimozione definitiva

Contrassegnato per essere salvato
attributeID
attributeSyntax
dnReferenceUpdate
dNSHostName
flatName
governsID
groupType
instanceType
lDAPDisplayName
legacyExchangeDN
mS-DS-CreatorSID
mSMQOwnerID
nCName
objectClass
objectGUID
objectSid
oMSyntax
proxiedObejctName
replPropertyMetaData
sAMAccountName
securityIdentifier
sIDHistory
subClassOf
systemFlags
trustPartner
trustDirection
trustType
trustAttributes
userAccountControl
uSNChanged
uSNCreated
whenCreated
Salvato a causa dell'impostazione di searchFlags
msDS-AdditionalSam­AccountName
msDS-Auxiliary-Classes
msDS-Entry-Time-To-Die
msDS-IntId
msSFU30NisDomain
nTSecurityDescriptor
uid

Si noti che la cartella CN=Deleted Objects è piatta e non presenta alcuna gerarchia di oggetti. Si potrebbe pensare che ciò causi conflitti di nome nel caso in cui vengano eliminati due oggetti diversi con lo stesso CN. Ma non è questo il caso. Poiché objectGUID è incorporato in ogni RDN dell'oggetto contrassegnato per la rimozione definitiva, ogni RDN di tale oggetto è univoco nel contenitore CN=Deleted Objects.

Ovviamente, gli oggetti non rimangono nel contenitore CN=Deleted Objects per sempre. La durata predefinita di un oggetto contrassegnato per la rimozione definitiva è di 60 giorni per le foreste create inizialmente utilizzando Windows® 2000 e Windows Server 2003 e di 180 giorni per le foreste create inizialmente con Windows Server 2003 SP1. È possibile modificare la durata dell'oggetto contrassegnato per la rimozione definitiva impostando l'attributo tombstoneLifetime dell'oggetto CN=Directory Service,CN=Windows NT, CN=Services,CN=Configuration, DC=<root domain>.

Ogni 12 ore, ciascun controller di dominio inizia un processo di Garbage Collection. Questa impostazione può essere modificata impostando un nuovo valore per l'attributo garbageCollPeriod dell'oggetto CN=Directory Service,CN=Windows NT, CN=Services,CN=Configuration,DC=<root domain>. La Garbage Collection esegue la scansione di tutti gli oggetti contrassegnati per la rimozione definitiva sul controller di dominio ed elimina fisicamente tutti gli oggetti più vecchi rispetto alla durata dell'oggetto contrassegnato per la rimozione definitiva.

Utilizzo di LDP per trovare gli oggetti contrassegnati per la rimozione definitiva

LDP è un'utilità, simile a Esplora risorse, che viene utilizzata con Active Directory. LDP è stato ideato originariamente dal team di sviluppo di Active Directory per testare il codice LDAP mentre Active Directory era ancora in fase di sviluppo. Attualmente parte degli strumenti di supporto di Windows Server 2003, LDP è diventato uno strumento valido per l'utilizzo di Active Directory.

Sebbene gli oggetti contrassegnati per la rimozione definitiva siano invisibili alle normali operazioni di directory, è possibile trovare tali oggetti in Active Directory utilizzando le operazioni di ricerca LDAP e le estensioni speciali di LDAP definite controlli. I controlli rappresentano un meccanismo, definito nello standard LDAP, utilizzato per estendere il protocollo LDAP al fine di fornire un'ulteriore funzionalità oltre quella definita nello standard LDAP pur rimanendo compatibile con altro software conforme a LDAP. Active Directory supporta 22 controlli, compreso il controllo Return Deleted Objects. Se utilizzato per estendere un'operazione di ricerca LDAP, questo controllo recupera gli oggetti eliminati che altrimenti resterebbero invisibili.

Per illustrare la modalità di funzionamento del controllo, accedo al dominio foo.local con le credenziali di amministratore dell'organizzazione e utilizzo lo snap-in MMC Utenti e i computer di Active Directory (ADUC) per creare un oggetto utente (CN=John Smith,CN=Users,DC=foo,DC=local), come illustrato nella Figura 2. Quindi elimino l'oggetto utente, utilizzando ancora ADUC.

Figura 2 Uso di ADUC per creare un utente

Figura 2** Uso di ADUC per creare un utente **(Fare clic sull'immagine per ingrandirla)

A questo punto posso eseguire il programma LDP e utilizzarlo per visualizzare l'oggetto contrassegnato per la rimozione definitiva per l'utente eliminato. Il primo passaggio consiste nel collegare LDP a un controller di dominio specifico ed eseguire l'autenticazione utilizzando le credenziali appropriate. Per effettuare il collegamento al controller di dominio, scelgo semplicemente l'opzione Connect dal menu Connection. Poiché eseguo LDP sul controller di dominio, premo semplicemente OK per collegarmi al controller di dominio locale. Se esegui LDP in modalità remota, è necessario specificare il nome del controller di dominio al quale si desidera collegarsi. Dopo aver effettuato la connessione, LDP visualizza gli attributi di rootDSE che contiene attributi che descrivono lo stato e la configurazione del controller di dominio stesso (vedere la Figura 3).

Figura 3 LDP connesso a un controller di dominio

Figura 3** LDP connesso a un controller di dominio **(Fare clic sull'immagine per ingrandirla)

Per effettuare l'autenticazione a un controller di dominio utilizzando le credenziali di dominio o di amministratore di dominio, seleziono Bind dal menu Connection. Poiché sono già registrato come amministratore dell'organizzazione per la foresta (per impostazione predefinita gli amministratori di dominio e gli amministratori dell'organizzazione dispongono dei diritti per elencare e recuperare gli oggetti nel contenitore CN=Deleted Objects), lascio vuoti i campi Username e Password della finestra di dialogo Bind e seleziono OK. Altrimenti, nella finestra di dialogo Bind potrei inserire le credenziali appropriate.

La prossima cosa da fare è elencare i contenuti del contenitore CN=Deleted Objects,DC=foo=DC=local. In genere il contenitore CN=Deleted Objects non viene visualizzato in quanto il contenitore stesso è contrassegnato come eliminato. L'unico modo per ricercare il contenitore CN=Deleted Objects è utilizzare il controllo LDAP Return Deleted Objects.

Per utilizzare questo controllo con LDP, andare al menu Browse e scegliere Search. Verrà visualizzata la finestra di dialogo di ricerca illustrata nella Figura 4. Il campo Dn di base consente di specificare dove avviare la ricerca nella struttura di directory. Inserisco il DN del contenitore Deleted Objects per il dominio. In questo esempio, il DN è CN=Deleted Objects,DC=foo,DC=local.

Figura 4 Finestra di dialogo di ricerca LDP

Figura 4** Finestra di dialogo di ricerca LDP **

Nel campo Filter, specifico l'LDP dei criteri di ricerca che utilizzerò. Il valore predefinito è (objectClass=*) e indica alla ricerca di restituire tutti gli oggetti che hanno un valore per l'attributo objectClass. Poiché anche gli oggetti eliminati in Active Directory hanno un valore per objectClass, il filtro predefinito restituirà ogni oggetto nell'ambito della ricerca. In quest'esempio, modifico il filtro in (objectClass=user), limitando la ricerca agli oggetti utente. In questo modo la ricerca dell'utente eliminato, John Smith, tra migliaia di possibili oggetti contrassegnati per la rimozione definitiva nel contenitore CN=Deleted Objects risulterà più semplice.

È possibile che vengano individuati più oggetti nel contenitore CN=Deleted Objects di quelli che Active Directory restituirà in un'unica operazione di ricerca. Per risolvere questo problema, in genere si utilizza una ricerca LDAP di paging, che restituisce i risultati un gruppo per volta. Tuttavia, LDP non consente di specificare una ricerca di paging ed estesa. Pertanto sarà necessario perfezionare il filtro LDAP per individuare l'oggetto desiderato.

I pulsanti di opzione Scope consentono di specificare la parte di struttura di directory nella quale eseguire la ricerca. Una ricerca di base restituirà soltanto l'oggetto specificato dal campo Dn di base. La ricerca su un solo livello restituirà gli oggetti immediatamente subordinati all'oggetto Dn di base. Mentre la ricerca in una sottostruttura restituirà tutti gli oggetti subordinati all'oggetto Dn di base. Poiché la cartella CN=Deleted Objects è piatta, si utilizza una ricerca su un solo livello per richiamare tutti gli oggetti contrassegnati per la rimozione definitiva.

Fino ad ora, ho semplicemente delineato una ricerca LDAP convenzionale. Se dovessimo eseguirla ora, LDP visualizzerebbe un errore che indica che CN=Deleted Objects,DC=foo,DC=com non esiste in quanto è stato contrassegnato come eliminato. È necessario includere ancora il controllo LDAP Return Deleted Objects nell'operazione di ricerca. A tal fine, seleziono il pulsante Options della finestra di dialogo Search e scelgo Extended for the Search Call Type, come illustrato nella Figura 5. Questa opzione mi consente di specificare i controlli per l'operazione di ricerca. A questo punto, modifico anche l'elenco Attributes in *. LDP visualizza tutti gli attributi normali per ogni oggetto recuperato, invece della serie predefinita di attributi LDP.

Figura 5 Ricerca LDP Finestra di dialogo Options

Figura 5** Ricerca LDP Finestra di dialogo Options **

A questo punto premo il pulsante Controls per visualizzare la finestra di dialogo Controls. La finestra di dialogo Controls di LDP è poco pratica, pertanto quando si esegue questa operazione è necessario attenersi attentamente alle istruzioni per aggiungere il controllo Return Deleted Objects.

Aprire l'elenco a discesa Load Predefined, scegliere Return Deleted Objects e premere il pulsante Check in. In questo modo l'identificatore di oggetto (OID) per il controllo Return Deleted Objects (1.2.840.113556.1.4.417) viene aggiunto all'elenco Active Controls, come illustrato nella Figura 6. LDP aggiunge poi il controllo a tutte le successive operazioni di ricerca estese. Premere OK per salvare le impostazioni di controllo e nuovamente OK per chiudere la finestra di dialogo Search Options.

Figura 6 Aggiunta del controllo Return Deleted Objects

Figura 6** Aggiunta del controllo Return Deleted Objects **

La finestra di dialogo Controls assume un comportamento particolare. In modo specifico, anche se viene visualizzato un OID nell'elenco Active Controls, ciò non significa necessariamente che il controllo è attivo. A volte è necessario estrarre un controllo e archiviarlo nuovamente per verificare che quest'ultimo venga utilizzato nella successiva operazione LDAP.

A questo punto sono pronto a eseguire la mia ricerca. Premo il pulsante OK nella finestra di dialogo Search LDP e LDP recupera tutti gli oggetti utente dal contenitore CN=Deleted Objects del dominio. I risultati sono illustrati nella Figura 7.

Figura 7 Risultati del contenitore CN=Deleted Objects

Figura 7** Risultati del contenitore CN=Deleted Objects **(Fare clic sull'immagine per ingrandirla)

Analisi dei risultati LDP

La mia ricerca ha restituito due oggetti contrassegnati per la rimozione definitiva. Innanzitutto, è possibile visualizzare il nome distinto del primo oggetto contrassegnato per la rimozione definitiva: CN=John Smith\0ADEL:41800281-6bc4-42c3-a99b-b283022b3af8,CN=Deleted Objects,DC=foo,DC=local. L'objectGUID dell'oggetto eliminato è rappresentato come una stringa (41800281-6bc4-42c3-a99b-b283022b3af8). Sotto il nome distinto viene visualizzato un elenco di attributi contenente i valori per objectClass, cn, distinguishedName e così via. È possibile vedere che il valore dell'attributo isDeleted è TRUE e ciò significa che l'oggetto è stato di fatto eliminato. Si vedrà inoltre che objectSid è stato conservato nell'oggetto contrassegnato per la rimozione definitiva. Ciò è importante per il recupero degli oggetti contrassegnati per la rimozione definitiva dell'utente e del gruppo, come verrà illustrato più avanti. Anche l'attributo lastKnownParent, che rappresenta il nome distinto dell'oggetto che conteneva l'oggetto eliminato prima che diventasse contrassegnato per la rimozione definitiva, è di fondamentale importanza durante il ripristino degli oggetti contrassegnati per la rimozione definitiva.

Nel mio esempio, LDP ha visualizzato due oggetti contrassegnati per la rimozione definitiva, entrambi i quali erano oggetti utente definiti CN=John Smith che provenivano in origine dal contenitore CN=Users,dc=foo,dc=local. Come è possibile che due oggetti distinti aventi lo stesso RDN provengano dallo stesso contenitore? La spiegazione è molto semplice. Prima di eseguire LDP per la ricerca degli oggetti contrassegnati per la rimozione definitiva, ho creato l'oggetto utente CN=John Smith nel contenitore CN=Users,DC=foo,DC=local e l'ho eliminato. Successivamente, ho creato un altro oggetto utente con gli stessi attributi e ho eliminato anche quello. Poiché avevo già eliminato il primo oggetto utente CN=John Smith, era perfettamente logico crearne un secondo, anche con lo stesso nome. Ma si tratta comunque di oggetti separati, univoci, distinti dai relativi objectGUID. Poiché Active Directory incorpora objectGUID nel DN dell'oggetto contrassegnato per la rimozione definitiva, questi vengono visualizzati come oggetti distinti nel contenitore CN=Deleted Objects.

Modalità di recupero di un oggetto contrassegnato per la rimozione definitiva

Active Directory fornisce un meccanismo per il recupero di un oggetto contrassegnato per la rimozione definitiva che diventa così nuovamente un oggetto normale. Si tratta di fatto di una funzione che consente di annullare l'eliminazione degli oggetti eliminati. La funzione è un'operazione di modifica LDAP creata ad hoc che deve includere due modifiche ad attributi specifici: deve rimuovere l'attributo isDeleted (non solo impostarlo su FALSE) e spostare l'oggetto su un altro contenitore modificando il distinguishedName dell'oggetto. In genere, il nuovo distinguishedName utilizza (ma non necessariamente) l'attributo lastKnownParent come contenitore e mantiene lo stesso RDN meno il componente \0ADEL:<objectGUID> che Active Directory ha aggiunto quando ha creato l'oggetto contrassegnato per la rimozione definitiva.

Prima di ripristinare l'oggetto contrassegnato per la rimozione definitiva, Active Directory verifica se determinate condizioni necessarie sono tutte True. L'utente deve disporre del diritto di accesso esteso al ripristino degli oggetti contrassegnati per la rimozione definitiva definito nell'intestazione NC dell'NC che contiene tale oggetto. L'utente non può recuperare il proprio oggetto. L'attributo isDeleted dell'oggetto contrassegnato per la rimozione definitiva deve essere impostato su TRUE. L'identificatore di protezione (SID) del proprietario dell'oggetto, come definito nel descrittore di protezione, deve disporre di un SID di uno dei domini nella foresta o di un dominio trusted.

Se l'oggetto in questione si trova nel contesto dei nomi della configurazione o in quello degli schemi, i bit FLAG_CONFIG_ALLOW_RENAME e FLAG_CONFIG_ALLOW_MOVE devono essere impostati nell'attributo systemFlags dell'oggetto contrassegnato per la rimozione definitiva. Se l'oggetto si trova nel contesto dei nomi della configurazione o in quello degli schemi ed è stato impostato il flag FLAG_CONFIG_ALLOW_LIMITED_MOVE, l'oggetto può essere soltanto spostato in un contenitore che ha lo stesso padre del padre. In altre parole, dopo lo spostamento, l'oggetto deve mantenere l'entità superiore di tre livelli. Inoltre, se l'oggetto si trova in un contesto dei nomi dei domini o in una partizione dell'applicazione, i bit FLAG_DOMAIN_DISALLOW_RENAME e FLAG_DOMAIN_DISALLOW_MOVE non devono essere impostati nell'attributo systemFlags dell'oggetto contrassegnato per la rimozione definitiva.

L'utente deve disporre dei diritti, come definito nel descrittore di protezione, per modificare l'RDN (in genere CN, ma non sempre) e aggiungere l'oggetto al nuovo contenitore padre. A sua volta, il nuovo contenitore padre deve essere un possibile superiore per objectClass dell'oggetto contrassegnato per la rimozione definitiva, come definito dallo schema. Sebbene gli spostamenti all'interno o all'esterno del contenitore System non siano normalmente consentiti (a meno che il valore del Registro di sistema della sottostruttura di sistema Unlock non sia diverso da zero) è consentito il recupero di un oggetto contrassegnato per la rimozione definitiva.

Il recupero di un oggetto schema non è mai consentito. Tuttavia, non è un problema poiché non è possibile eliminare legittimamente un oggetto dal contesto dei nomi degli schemi.

Se tutte le verifiche risultano corrette e vengono soddisfatti tutti i requisiti necessari, Active Directory effettua le operazioni indicate di seguito per recuperare l'oggetto contrassegnato per la rimozione definitiva:

  • L'attributo isDeleted viene rimosso.
  • Se non diversamente indicato nell'operazione di modifica, objectCategory viene impostato sull'objectClass più specifico indicato nell'oggetto contrassegnato per la rimozione definitiva.
  • L'RDN viene modificato e l'oggetto viene scritto nel nuovo contenitore padre.

Al termine del recupero, l'oggetto presenta gli stessi attributi objectGUID e objectSid che conteneva in origine. Ciò significa che i riferimenti esterni all'oggetto, ad esempio negli ACL, non devono essere ripristinati come se venisse ricreato un oggetto eliminato. L'oggetto recuperato assomiglia e agisce come l'oggetto eliminato, con un'importante differenza: l'oggetto recuperato non dispone di tutti gli attributi che non sono stati salvati nell'oggetto contrassegnato per la rimozione definitiva.

Utilizzo di LDP per recuperare gli oggetti contrassegnati per la rimozione definitiva

Attributo systemFlags e comportamento dell'oggetto

L'attributo systemFlags è un attributo facoltativo definito per la classe principale che rende systemFlags un attributo facoltativo per ogni classe Active Directory. È una maschera di bit a numero intero a 32 bit che controlla il comportamento degli spostamenti e delle eliminazioni degli oggetti. Di seguito è riportato un riepilogo dei flag importanti.

FLAG_DISALLOW_DELETE (0x80000000)

Se viene impostato questo flag, il sistema non consentirà l'eliminazione o lo spostamento dell'oggetto in un altro dominio.

FLAG_CONFIG_ALLOW_RENAME (0x40000000)

Gli oggetti nei contesti dei nomi della configurazione e degli schemi non possono essere ridenominati a meno che il flag non venga impostato nell'attributo systemFlags.

FLAG_CONFIG_ALLOW_MOVE (0x20000000)

Gli oggetti nei contesti dei nomi della configurazione e degli schemi non possono essere spostati a meno che il flag non venga impostato nell'attributo systemFlags.

FLAG_CONFIG_ALLOW_LIMITED_MOVE (0x10000000)

Gli oggetti nei contesti dei nomi della configurazione e degli schemi non possono essere spostati a meno che il flag non venga impostato nell'attributo systemFlags. Questo flag impone un'ulteriore limitazione al contenitore di destinazione dell'operazione di spostamento‑il contenitore di destinazione deve avere lo stesso padre del padre del contenitore corrente.

FLAG_DOMAIN_DISALLOW_RENAME (0x08000000)

Per impostazione predefinita, è possibile ridenominare gli oggetti nei contesti dei nomi dei domini o delle applicazioni. Tuttavia, se questo flag viene impostato nell'attributo systemFlags dell'oggetto, il sistema non consentirà la ridenominazione dell'oggetto.

FLAG_DOMAIN_DISALLOW_MOVE (0x04000000)

Per impostazione predefinita, è possibile spostare in un altro contenitore gli oggetti nei contesti dei nomi dei domini o delle applicazioni. Tuttavia, se questo flag è impostato nell'attributo systemFlags dell'oggetto, il sistema non consentirà lo spostamento dell'oggetto.

FLAG_DISALLOW_MOVE_ON_DELETE (0x02000000)

Se viene impostato questo flag, il sistema non sposterà l'oggetto nel contenitore CN=Deleted Objects del relativo contesto dei nomi. Imposterà semplicemente l'attributo isDeleted, ridenominerà l'oggetto e rimuoverà gli attributi non indicati nello schema da salvare. Ciò significa che non tutti gli oggetti eliminati vengono visualizzati nel contenitore CN=Deleted Objects del contesto dei nomi, infatti alcuni rimangono nel contenitore padre originale.

Dopo aver descritto in dettaglio come avviene il recupero degli oggetti contrassegnati per la rimozione definitiva, desidero illustrare come è possibile utilizzare LDP per ripristinare l'utente CN=John Smith eliminato. Innanzitutto, mi connetto a un controller di dominio ed eseguo l'autenticazione. A questo punto posso eseguire un'operazione di modifica utilizzando LDP. Nei parametri dell'operazione di modifica, posso eliminare l'attributo isDeleted e, allo stesso tempo, specificare un nuovo DN.

Poiché sto lavorando su un oggetto contrassegnato per la rimozione definitiva, devo specificare il controllo LDAP Return Deleted Objects. Per impostare questo controllo per l'operazione di modifica in LDP, scelgo Controls dal menu di opzioni, seleziono Return Deleted Objects dall'elenco a discesa Load Predefined, premo il pulsante Check in, quindi OK per salvare le impostazioni del controllo.

In seguito seleziono Modify dal menu Browse per aprire la finestra di dialogo Modify e immettere il DN dell'oggetto contrassegnato per la rimozione definitiva che si intende ripristinare. Il metodo più semplice per eseguire questa operazione è copiare e incollare il DN dai risultati dell'operazione di ricerca eseguita in precedenza.

A questo punto devo inserire un elenco di operazioni sull'attributo da eseguire. Il recupero di un oggetto contrassegnato per la rimozione definitiva richiede due operazioni: l'eliminazione dell'attributo isDeleted e la sostituzione dell'attributo distinguishedName con il DN desiderato dell'oggetto contrassegnato per la rimozione definitiva recuperato. Quindi, immetto isDeleted nel campo Attribute e seleziono il pulsante di opzione Delete. Una volta premuto il pulsante Enter, l'operazione sull'attributo viene aggiunta all'elenco Entry, come illustrato nella Figura 8.

Figura 8 Specifica delle operazioni sull'attributo da eseguire

Figura 8** Specifica delle operazioni sull'attributo da eseguire **

Inserisco il distinguishedName nel campo Attribute, seleziono il pulsante di opzione Replace e inserisco il nuovo DN dell'oggetto nel campo Values. In questo caso, utilizzo il distuiguishedName originale dell'utente, CN=John Smith,CN=Users,DC=foo,DC=local. Premo il pulsante Enter e l'operazione di modifica viene aggiunta all'elenco Entry.

Poiché devo includere il controllo LDAP Return Deleted Objects con l'operazione di modifica, devo utilizzare una modifica LDAP estesa. A tal fine, seleziono la casella di spunta Extended. Al termine di tutte le impostazioni, come illustrato nella Figura 9, premo il pulsante Run per apportare le modifiche. LDP visualizza i risultati in una finestra di testo di grandi dimensioni.

Figura 9 Modifica del distinguishedName

Figura 9** Modifica del distinguishedName **

A questo punto torno allo snap-in MMC Utenti e computer di Active Directory e controllo il contenitore CN=Users, l'oggetto utente eliminato si trova nello stesso punto dal quale è stato generato. Ma l'oggetto presenterà alcune differenze importanti rispetto allo stato originale che illustrerò a breve.

Utilizzo di ADRESTORE per recuperare gli oggetti contrassegnati per la rimozione definitiva

Una volta scoperto come utilizzare LDP, il recupero di un oggetto contrassegnato per la rimozione definitiva non risulta estremamente difficile, sebbene non sia molto conveniente. Fortunatamente, quei santi che lavorano presso Sysinternals (un'azienda che adesso fa parte di Microsoft) hanno sviluppato uno strumento della riga di comando per semplificare il processo di recupero. Questo strumento, definito ADRESTORE, è disponibile dal sito Web di Microsoft all'indirizzo microsoft.com/technet/sysinternals/utilities/AdRestore.mspx. L'installazione è semplice. È sufficiente copiare l'eseguibile in una directory appropriata sul computer, ad esempio la directory C:\WINDOWS\SYSTEM32.

ADRESTORE viene eseguito in due modalità. Se viene eseguito senza parametri, elencherà tutti gli oggetti contrassegnati per la rimozione definitiva nel contenitore CN=Deleted Objects del dominio predefinito. È possibile aggiungere una stringa di ricerca alla riga di comando per selezionare gli oggetti da visualizzare, ad esempio:

C:\> adrestore John

In questo modo, verranno visualizzati tutti gli oggetti contrassegnati per la rimozione definitiva nel contenitore CN=Deleted Objects che contiene la stringa "John" nell'attributo CN o OU. Il contenitore visualizzerà i filtri di ricerca LDAP cn=*John* e ou=*John*. Non si tratta esattamente del metodo più flessibile per ricercare gli oggetti contrassegnati per la rimozione definitiva, ma è adatto per la maggior parte delle situazioni. Nella Figura 10 viene illustrato l'output restituito dalla mia ricerca in ADRESTORE.

Figura 10 Attributi salvati in un oggetto contrassegnato per la rimozione definitiva

Figura 10** Attributi salvati in un oggetto contrassegnato per la rimozione definitiva **(Fare clic sull'immagine per ingrandirla)

Se si intende recuperare, e non solo trovare, un oggetto contrassegnato per la rimozione definitiva, è necessario specificare l'opzione –r, insieme a una stringa facoltativa, come la seguente:

C:\> adrestore –r John

Questo comando chiederà di recuperare ogni oggetto contrassegnato per la rimozione definitiva corrispondente. ADRESTORE recupera sempre l'oggetto nel contenitore fornito dall'attributo lastKnownParent dell'oggetto contrassegnato per la rimozione definitiva: non esiste un metodo per specificare un contenitore diverso.

ADRESTORE fornisce un'interfaccia della riga di comando conveniente per utilizzare la funzionalità di ripristino di Active Directory. Sebbene non sia molto flessibile, è più semplice da utilizzare rispetto a LDP. Tuttavia, ADRESTORE non evita due problemi significativi che si verificano durante il recupero degli oggetti contrassegnati per la rimozione definitiva: il ripristino degli attributi rimossi dall'oggetto dopo la relativa eliminazione e il ripristino degli oggetti eliminati dal contesto dei nomi della configurazione.

Recupero degli attributi oggetto

Per quanto concerne il ripristino dei dati, il recupero degli oggetti contrassegnati per la rimozione definitiva presenta un grande vantaggio rispetto all'esecuzione di un ripristino autorevole: il recupero degli oggetti contrassegnati per la rimozione definitiva non richiede la disconnessione di un controller di dominio. Inoltre, il recupero degli oggetti contrassegnati per la rimozione definitiva è un'operazione di gran lunga migliore rispetto alla creazione di una nuova versione di un oggetto eliminato. Se si sceglie di ricreare un oggetto, si otterranno sempre nuovi attributi objectGUID e objectSid (se si tratta di un'entità di protezione come un utente). Di conseguenza, qualsiasi riferimento esterno all'oggetto, come gli ACL, dovrà essere aggiornato per riflettere l'identità del nuovo oggetto. Questo potrebbe rappresentare uno dei grattacapi principali.

Alcuni attributi vengono rimossi quando un oggetto viene eliminato e non vengono ripristinati con il recupero degli oggetti contrassegnati per la rimozione definitiva. Ma Active Directory salva alcuni attributi principali nell'oggetto contrassegnato per la rimozione definitiva, i più importanti dei quali sono attributi correlati all'identità come objectGUID e objectSid. Per impostazione predefinita, Active Directory salva anche molti altri attributi (vedere la Figura 1). La maggior parte degli attributi da salvare non sono molto interessanti, in particolar modo nel caso di una discussione sul ripristino degli oggetti utente eliminati. Ma è possibile specificare ulteriori attributi da salvare nell'oggetto contrassegnato per la rimozione definitiva impostando il bit 3 (0x00000008) dell'attributo searchFlags dell'oggetto attributeSchema corrispondente nello schema Active Directory. Alcuni attributi presentano già questa serie di bit nello schema di Windows Server 2003 R2 (illustrati anche nella Figura 1).

L'installazione di determinate applicazioni potrebbe modificare il bit 3 di searchFlags degli attributi esistenti o persino aggiungere nuovi attributi che presentano una serie bit 3. Exchange Server, ad esempio, configura diversi attributi aggiuntivi da salvare nell'oggetto contrassegnato per la rimozione definitiva.

Active Directory non salverà gli attributi con collegamenti in avanti o a ritroso nell'oggetto contrassegnato per la rimozione definitiva, anche se viene indicato di proseguire in questa maniera nell'attributo searchFlags dell'oggetto schema. In particolare, Active Directory non salva elementi come l'attributo member o l'attributo memberOf di un utente. Pertanto, il recupero di un oggetto contrassegnato per la rimozione definitiva non fornisce una soluzione per il ripristino delle appartenenze in Active Directory. Vedere il mio articolo "Ripristino di emergenza: utenti e gruppi di Active Directory" all'indirizzo technetmagazine.com/issues/2007/04/ADRecovery. Dunque sarà necessario fornire un meccanismo alternativo per il ripristino di queste informazioni durante il recupero degli oggetti contrassegnati per la rimozione definitiva.

Se si desidera utilizzare il recupero degli oggetti contrassegnati per la rimozione definitiva come parte della strategia di ripristino dei dati, sarà necessario assicurarsi che gli attributi importanti vengano salvati nell'oggetto contrassegnato per la rimozione definitiva oppure sarà necessario fornire un altro metodo per salvare e ripristinare gli attributi importanti, come utilizzare LDIFDE o un altro schema di backup e ripristino. Le alternative prevedono prodotti di ripristino dati Active Directory di terzi che forniscono un meccanismo automatico per il backup e il ripristino degli attributi che non vengono salvati e ripristinati dall'oggetto contrassegnato per la rimozione definitiva.

Recupero degli oggetti dal contesto dei nomi della configurazione

In genere, un'altro limite significativo del recupero degli oggetti contrassegnati per la rimozione definitiva è rappresentato dall'impossibilità di recuperare gli oggetti che sono stati eliminati dal contesto dei nomi della configurazione. Tali oggetti sono soggetti a regole specifiche per lo spostamento e la ridenominazione, come definito dall'attributo systemFlags dell'oggetto. A meno che non venga specificato diversamente dall'attributo systemFlags, gli oggetti nel contesto dei nomi della configurazione non possono essere spostati o ridenominati, il che significa che non è possibile recuperare gli oggetti contrassegnati per la rimozione definitiva. Come illustrato nella Figura 11, quando crea oggetti di classi specifiche, Active Directory applica determinati valori per l'attributo systemFlags. Si noti che Active Directory applica l'operazione logica OR bit per bit a questi valori in combinazione con qualsiasi valore systemFlags specificato nell'operazione di aggiunta. In questo modo, anche se l'applicazione specifica un valore diverso per l'attributo systemFlags, i bit necessari verranno impostati correttamente.

Figure 11 Impostazioni systemFlags predefinite

Classe Impostazione predefinita
server FLAG_DISALLOW_MOVE_ON_DELETE FLAG_CONFIG_ALLOW_RENAME FLAG_CONFIG_ALLOW_LIMITED_MOVE
site FLAG_DISALLOW_MOVE_ON_DELETE
serversContainer FLAG_DISALLOW_MOVE_ON_DELETE
nTDSDSA FLAG_DISALLOW_MOVE_ON_DELETE
siteLink FLAG_CONFIG_ALLOW_RENAME
siteLinkBridge FLAG_CONFIG_ALLOW_RENAME
nTDSConnection FLAG_CONFIG_ALLOW_RENAME

Gli unici oggetti del contesto dei nomi della configurazione che vengono recuperati in circostanze normali sono gli oggetti server. È interessante notare che quando Active Directory elimina un oggetto server, l'oggetto contrassegnato per la rimozione definitiva non viene spostato nel contenitore CN=Deleted Objects del contesto dei nomi della configurazione, ma rimane semplicemente dove si trova l'oggetto. Ciò consente al controllo di coerenza informazioni (KCC, Knowledge Consistency Checker), il processo responsabile del calcolo della topologia di replica di Active Directory, di eseguire automaticamente il ripristino da alcuni scenari in cui gli oggetti server eliminati potrebbero impedire la replica corretta. Di conseguenza, se si desidera recuperare un oggetto server, è necessario ricordare che non è possibile trovarlo nel contenitore CN=Deleted Objects.

Recupero nel piano di ripristino

Il recupero degli oggetti contrassegnati per la rimozione definitiva è una parte importante del toolkit per il ripristino dei dati. Questo meccanismo rappresenta l'unico modo per recuperare gli oggetti eliminati senza dover disconnettere un controller di dominio e, ugualmente importante, rappresenta l'unico modo per recuperare le informazioni sull'identità dell'oggetto eliminato. In questo modo si risolve chiaramente il problema di ricreare un utente o un gruppo eliminato e di dover correggere tutti i vecchi riferimenti dell'elenco di controllo di accesso (ACL).

Ma il recupero degli oggetti contrassegnati per la rimozione definitiva rimane una soluzione incompleta. È necessario fornire un proprio meccanismo per il ripristino degli attributi che Active Directory non conserva negli oggetti contrassegnati per la rimozione definitiva, ma la capacità di recuperare gli oggetti eliminati dal contesto dei nomi della configurazione è limitata. Tenere presente che se si sceglie di ripristinare un utente o un gruppo eliminato, sarà ancora necessario ripristinare le appartenenze ai gruppi e tutti gli altri attributi collegati di cui si potrebbe aver bisogno.

Gil Kirkpatrick è CTO di NetPro e si occupa dello sviluppo software per Active Directory dal 1996. In collaborazione con Guido Grillenmeier, che lavora presso HP, ha realizzato i noti workshop sul ripristino di emergenza in Active Directory. Gil è anche il fondatore della Directory Experts Conference (www.dec2007.com).

© 2008 Microsoft Corporation e CMP Media, LLC. Tutti i diritti riservati. È vietata la riproduzione completa o parziale senza autorizzazione.