4.1.10.4.2 ReplSingleObjRequestMsg
-
procedure ReplSingleObjRequestMsg( hDrs: DRS_HANDLE, version: DWORD, nc: DSName, object: DSName, rf: RepsFrom, ulFlags: ULONG, ulMoreFlags: ULONG, cMaxObjects: ULONG, cMaxBytes: ULONG, fWithSecrets: boolean, var msgRequest: DRS_MSG_GETCHGREQ): DWORD
Informative summary of behavior: The client can send an IDL_DRSGetNCChanges request to the server to replicate changes from a single object. The ReplSingleObjRequestMsg procedure specifies how the request message is constructed for this operation. The arguments for this method are the same as those for the procedure ReplicateNCRequestMsg, with the following exceptions:
object: The DSName of the object that should be replicated.
fWithSecrets: The object's secret attributes should be replicated. Only RODCs need to make, and can make, this request.
The procedure returns a Windows error code if it cannot construct msgRequest.
-
msgRequest: DRS_MSG_GETCHGREQ msgIn: DRS_MSG_GETCHGREQ_V10 ncType: ULONG /* An NC replica with root of DSName nc must already exist on the client */ if (not PartialGCReplicaExists(nc) and not FullReplicaExists(nc)) then return ERROR_DS_DRA_BAD_NC endif /* Only RODCs are allowed to request secrets explicitly */ if fWithSecrets and not AmIRODC() then return ERROR_INVALID_PARAMETER endif if fWithSecrets then msgIn.ulExtendedOp := EXOP_REPL_SECRETS else msgIn.ulExtendedOp := EXOP_REPL_OBJ endif if AmIRODC()then if DRS_WRIT_REP in ulFlags then return ERROR_INVALID_PARAMETER endif ext := ServerExtensions(hDrs) if not DRS_EXT_LH_BETA2 in ext.dwFlags and msgIn.pNC^ = SchemaNC() then ulFlags := ulFlags + {DRS_WRIT_REP} endif endif ncType = GetNCType(nc) if not NCT_GC_PARTIAL in ncType then ulFlags := ulFlags + {DRS_GET_ALL_GROUP_MEMBERSHIP} endif msgIn.ulFlags := ulFlags msgIn.ulMoreFlags := ulMoreFlags msgIn.cMaxObjects := cMaxObjects msgIn.cMaxBytes := cMaxBytes msgIn.uuidDsaObjDest := dc.serverGuid msgIn.pNC := ADR(object) msgIn.liFsmoInfo := 0 msgIn.pUpToDateVecDest := ConcreteUTDFromAbstractUTD(nc!replUpToDateVector) msgIn.pPartialAttrSetEx := null /* set msgIn.pPartialAttrSet field */ if ObjExists(nc) and nc!partialAttributeSet ≠ null then msgIn.pPartialAttrSet := ConcretePASFromAbstractPAS( nc!partialAttributeSet) else if (NCT_GC_PARTIAL in ncType and NCT_FILTERED_ATTRIBUTE_SET in ncType)} then msgIn.pPartialAttrSet := FilteredGCPAS() else if NCT_FILTERED_ATTRIBUTE_SET in ncType then msgIn.pPartialAttrSet := FilteredPAS() else if NCT_GC_PARTIAL in ncType then msgIn.pPartialAttrSet := GCPAS() else msgIn.pPartialAttrSet := null endif endif msgIn.PrefixTableDest = ConcretePTFromAbstractPT(dc.prefixTable) /* Fill usnvecFrom and uuidInvocIdSrc fields. * usnvecFrom: This field contains the value of the usnVec field in * RepsFrom tuple corresponding to the IDL_DRSGetNCChanges server * DC, or zeros if no such repsFrom is present. * uuidInvocIdSrc: If the usnvecFrom field is not zeros, this field * MUST contain the uuidInvocId from the same tuple from which the * usnVec fieldwas retrieved. Otherwise, this field contains * zeros.*/ if (rf = null) then msgIn.usnvecFrom := 0 msgIn.uuidInvocIdSrc := 0 else msgIn.usnvecFrom := rf.usnVec msgIn.uuidInvocIdSrc := rf.uuidInvocId endif if version = 5 then msgRequest.V5 := msgIn msgRequest.V5.pUpToDateVecDestV1 := msgIn.pUpToDateVecDest else if version = 8 then msgRequest.V8 := msgIn else msgRequest.V10 := msgIn endif return 0