Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Windows Server 2003 obsahuje funkci obnovit odstraněné objekty.
Chcete-li povolit obnovení odstraněného objektu, musí v systému Windows Server 2003 nebo novější verzi Systému Windows běžet alespoň jeden řadič domény v doméně. Ve výchozím nastavení můžou odstraněné objekty obnovit jenom správci domény, i když je to možné delegovat ostatním.
Při obnovování odstraněných objektů platí následující omezení:
- Objekt nelze obnovit, pokud vypršela platnost životnosti objektu náhrobek, protože po vypršení platnosti životnosti náhrobku se objekt trvale odstraní.
- Objekty, které existují v kořenovém adresáři kontextu pojmenování, jako je doména nebo oddíl aplikace, nelze obnovit.
- Objekty schématu nelze obnovit. Objekty schématu by nikdy neměly být odstraněny.
- Odstraněné kontejnery je možné obnovit, ale obnovení odstraněných objektů, které byly v kontejneru před odstraněním, je obtížné, protože struktura stromu pod kontejnerem musí být rekonstruována ručně.
Oprávnění potřebná k obnovení odstraněného objektu
Při odstranění objektu se zachová popisovač zabezpečení objektu. I když je vlastník identifikovatelný z popisovače zabezpečení, z bezpečnostních důvodů mohou odstraněné objekty obnovit pouze správci domény. Správci domény mohou udělit oprávnění k obnovení odstraněných objektů jiným uživatelům a skupinám tím, že udělí uživateli nebo skupině právo přístupu k řízení "Reanimate Tombstone". Oprávnění k přístupu "Reanimate Tombstone" je uděleno v kořenovém adresáři Naming Context. Po odstranění objektu jsou povoleni jen uživatelé, kteří měli oprávnění ke čtení přístupu k objektu a jeho atributům.
Poznámka
Udělení tohoto oprávnění uživateli může být bezpečnostní riziko, protože by uživateli mohlo umožnit obnovit objekt účtu, který má přístup k prostředkům, ke kterým by uživatel normálně neměl přístup. Obnovením účtu získá uživatel v podstatě kontrolu nad tímto účtem, protože uživatel musí při obnovení účtu nastavit počáteční heslo.
Aby bylo možné odstraněný objekt zcela obnovit, musí uživatel:
Mít nebo být členem skupiny, která má oprávnění k řízení přístupu "Reanimate Tombstone".
Mít přístup k zápisu pro každý povinný atribut, který vyžaduje aktualizaci.
Mít oprávnění k zápisu k relativnímu rozlišujícímu názvu (RDN).
Mít přístup k zápisu ke každému volitelnému atributu, který je potřeba aktualizovat.
Mají práva k vytváření podřízených objektů v cílovém kontejneru pro třídu obnoveného objektu.
Poznámka
Atribut isDeleted není během operace obnovení ověřen. Ani oprávnění k odstranění podřízených objektů v kontejneru „Odstraněné objekty“ nebude ověřeno.
Obnovení odstraněného objektu
Chcete-li obnovit odstraněný objekt, musí být nejprve umístěn v kontejneru Odstraněné objekty. Další informace o načítání odstraněných objektů naleznete v tématu Načítání odstraněných objektů.
Po umístění objektu musí být v jedné operaci LDAP dokončeny následující operace. To vyžaduje použití funkce ldap_modify_ext_s s ovládacím prvku LDAP_SERVER_SHOW_DELETED_OID.
- Odeberte hodnotu atributu isDeleted. Hodnota atributu isDeleted musí být odebrána, nikoli nastavena na hodnotu FALSE.
- Nahraďte rozlišující název objektu tak, aby byl přesunut do jiného kontejneru než kontejner Odstraněné objekty. To může být jakýkoli kontejner, který může normálně obsahovat objekt. Rozlišující název předchozího kontejneru objektu najdete v atributu lastKnownParent odstraněného objektu. Atribut lastKnownParent je nastaven pouze v případě, že byl objekt odstraněn na řadiči domény se systémem Windows Server 2003. Je tedy možné, že obsah atributu lastKnownParent není přesný.
- Obnovte povinné atributy objektu, který byl vymazán během odstranění.
Poznámka
Atribut objectCategory lze také nastavit při obnovení objektu, ale nevyžaduje se. Pokud není zadána žádná hodnota objectCategory, použije se výchozí objectCategory pro objektovou objectClass.
Po obnovení objektu se k němu dostanete tak, jak byl předtím, než byl odstraněn. V tomto okamžiku by se měly obnovit všechny volitelné atributy, které jsou důležité. Všechny odkazy na objekt z jiných objektů v adresáři musí být také obnoveny.
V rámci bezpečnostních opatření jsou objekty uživatelů při obnovení zakázány. Uživatelské objekty musí být povoleny po obnovení volitelných atributů, aby bylo možné použít objekt uživatele.
Další informace a příklad kódu, který ukazuje, jak obnovit odstraněný objekt, naleznete v části RestoreDeletedObject funkce níže.
ObnovitSmazanýObjekt
Následující příklad kódu C++ ukazuje, jak obnovit odstraněný objekt.
//***************************************************************************
//
// RestoreDeletedObject()
//
// Restores a deleted object.
//
// pwszDeletedDN - Contains the fully qualified distinguished name of the
// deleted object.
//
// pwszDestContainerDN - Contains the fully qualified distinguished name of
// the folder that the deleted object should be moved to.
//
// Returns S_OK if successful or an HRESULT or LDAP error code otherwise.
//
//***************************************************************************
HRESULT RestoreDeletedObject(LPCWSTR pwszDeletedDN, LPCWSTR pwszDestContainerDN)
{
if((NULL == pwszDeletedDN) || (NULL == pwszDestContainerDN))
{
return E_POINTER;
}
HRESULT hr = E_FAIL;
// Build the new distinguished name.
LPWSTR pwszNewDN = new WCHAR[lstrlenW(pwszDeletedDN) + lstrlenW(pwszDestContainerDN) + 1];
if(pwszNewDN)
{
wcscpy_s(pwszNewDN, pwszDeletedDN);
// Search for the first 0x0A character. This is the delimiter in the deleted object name.
LPWSTR pwszChar;
for(pwszChar = pwszNewDN; *pwszChar; pwszChar = CharNextW(pwszChar))
{
if(('\\' == *pwszChar) && ('0' == *(pwszChar + 1)) && ('A' == *(pwszChar + 2)))
{
break;
}
}
if(0 != *pwszChar)
{
// Truncate the name string at the delimiter.
*pwszChar = 0;
// Add the last known parent DN to complete the DN.
wcscat_s(pwszNewDN, L",");
wcscat_s(pwszNewDN, pwszDestContainerDN);
PLDAP ld;
// Initialize LDAP.
ld = ldap_init(NULL, LDAP_PORT);
if(NULL != ld)
{
ULONG ulRC;
ULONG version = LDAP_VERSION3;
// Set the LDAP version.
ulRC = ldap_set_option(ld, LDAP_OPT_PROTOCOL_VERSION, (void*)&version);
if(LDAP_SUCCESS == ulRC)
{
// Establish a connection with the server.
ulRC = ldap_connect(ld, NULL);
if(LDAP_SUCCESS == ulRC)
{
// Bind to the LDAP server.
ulRC = ldap_bind_s(ld, NULL, NULL, LDAP_AUTH_NEGOTIATE);
if(LDAP_SUCCESS == ulRC)
{
// Setup the new values.
LPWSTR rgNewVals[] = {pwszNewDN, NULL};
/*
Remove the isDeleted attribute. This cannot be set
to FALSE or the restore operation will not work.
*/
LDAPModW modIsDeleted = { LDAP_MOD_DELETE, L"isDeleted", NULL };
/*
Set the new DN, in effect, moving the deleted
object to where it resided before the deletion.
*/
LDAPModW modDN = { LDAP_MOD_REPLACE, L"distinguishedName", rgNewVals };
// Initialize the LDAPMod structure.
PLDAPModW ldapMods[] =
{
&modIsDeleted,
&modDN,
NULL
};
/*
Use the LDAP_SERVER_SHOW_DELETED_OID control to
modify deleted objects.
*/
LDAPControlW showDeletedControl;
showDeletedControl.ldctl_oid = LDAP_SERVER_SHOW_DELETED_OID_W;
showDeletedControl.ldctl_value.bv_len = 0;
showDeletedControl.ldctl_value.bv_val = NULL;
showDeletedControl.ldctl_iscritical = TRUE;
// Initialzie the LDAPControl structure
PLDAPControlW ldapControls[] = { &showDeletedControl, NULL };
/*
Modify the specified attributes. This must performed
in one step, which is why the LDAP APIs must be used
to restore a deleted object.
*/
ulRC = ldap_modify_ext_sW(ld, (PWCHAR)pwszDeletedDN, ldapMods, ldapControls, NULL);
if(LDAP_SUCCESS == ulRC)
{
hr = S_OK;
}
else if(LDAP_ALREADY_EXISTS == ulRC)
{
/*
An object already exists with the specified name
in the specified target container. At this point,
a new name must be selected.
*/
}
}
}
}
if(LDAP_SUCCESS != ulRC)
{
hr = ulRC;
OutputDebugString(ldap_err2string(ulRC));
}
// Release the LDAP session.
ldap_unbind(ld);
}
}
else
{
/*
If the end of the string is reached before the delimiter is found, just
end and fail.
*/
hr = E_INVALIDARG;
}
delete pwszNewDN;
}
else
{
hr = E_OUTOFMEMORY;
}
return hr;
}