Server Behavior of the IDL_DRSReplicaVerifyObjects Method

Informative summary of behavior: Let N be the NC pNC^, and let the reference DC be the DC corresponding to the nTDSDSA object uuidDsaSrc.

For the purposes of this method, an object exists within an NC replica if it is either an object or a tombstone.

Let S be the set of objects that exists in N at the server running IDL_DRSReplicaVerifyObjects at the time IDL_DRSReplicaVerifyObjects begins processing. Let the set S' be S minus the members of S that have never existed in N at the reference DC when IDL_DRSReplicaVerifyObjects begins processing. The members of (S - S') are objects recently added to N on the server, since otherwise they would have replicated to the reference DC. The set S' is computable using the replUpToDateVector for N at the server and at the reference DC.

For each object o in S' that does not exist in N at the reference DC while IDL_DRSReplicaVerifyObjects is processing, either expunge o at the server (if ulOptions = 0) or log an administrator-visible event at the server (if ulOptions = 1).

If an object goes out of existence in N at the reference DC during processing of IDL_DRSReplicaVerifyObjects, then there is no requirement on whether IDL_DRSReplicaVerifyObjects should or should not expunge or log the object at the server.

 ULONG IDL_DRSReplicaVerifyObjects(
   [in, ref] DRS_HANDLE hDrs,
   [in] DWORD dwVersion,
   [in, ref, switch_is(dwVersion)]
       DRS_MSG_REPVERIFYOBJ *pmsgVerify)
 err: ULONG
 nc, refDsa, o: DSName
 sPrime: set of DSName
 ValidateDRSInput(hDrs, 22)
 /* Perform input validation and access check */
 if dwVersion ≠ 0x1 then
 msgIn := pmsgVerify^.V1
 if msgIn.pNC = null or 
    msgIn.uuidDsaSrc = NULLGUID then
 nc := msgIn.pNC^
 if not FullReplicaExists(nc) and 
     not PartialGCReplicaExists(nc) then
 if not AccessCheckCAR(nc, DS-Replication-Manage-Topology) then
 refDsa := select one object o from subtree ConfigNC() where 
     o!objectGUID = msgIn.uuidDsaSrc and nTDSDSA in o!objectClass
 if refDsa = null then
 /* Compute the set S' */
 uTDServer := nc!replUpToDateVector
 err := GetRemoteUTD(refDsa, nc, uTDRef)
 if err ≠ 0 then
   return err
 uTDMerge := MergeUTD(uTDServer, uTDRef)
 sPrime := select all objects o from subtree-ts-included nc where
     StampLessThanOrEqualUTD(AttrStamp(o, whenCreated), uTDMerge)
 /* Process the set S' */
 for each o in sPrime
   if not ObjectExistsAtDC(o, refDSA) then
     if msgIn.ulOptions = 0 then
     else if msgIn.ulOptions = 1 then
       Log a message: o exists on server but does not exist on refDsa
 return 0

Windows behavior about the for loop is specified in the following citation:<38>