/// <summary> /// The NetrDatabaseDeltas method returns a set of changes (or deltas) /// performed to the SAM, SAM built-in, or LSA databases after a particular /// value of the database serial number. It is used by BDCs to request /// database changes from the PDC that are missing on the BDC. Opnum: 7 /// </summary> /// <param name="PrimaryName"> /// The custom RPC binding handle (as specified in section 3.5.5.1) that /// represents the connection to the PDC. /// </param> /// <param name="ComputerName"> /// The null-terminated Unicode string that contains the NetBIOS name of /// the BDC calling this method. /// </param> /// <param name="Authenticator"> /// A pointer to a NETLOGON_AUTHENTICATOR structure that contains the /// client authenticator. /// </param> /// <param name="ReturnAuthenticator"> /// A pointer to a NETLOGON_AUTHENTICATOR structure that contains the /// server return authenticator. /// </param> /// <param name="DatabaseID"> /// The identifier for a specific account database set as follows: /// 0x00000000 /// Indicates the SAM database. /// 0x00000001 /// Indicates the SAM built-in database. /// 0x00000002 /// Indicates the LSA database. /// </param> /// <param name="DomainModifiedCount"> /// A pointer to an NLPR_MODIFIED_COUNT structure, as specified in section /// 2.2.1.5.26, that contains the database serial number. On input, this is /// the value of the database serial number on the client. On output, this is /// the value of the database serial number corresponding to the last element /// (delta) returned in the DeltaArray parameter. /// </param> /// <param name="DeltaArray"> /// A pointer to a NETLOGON_DELTA_ENUM_ARRAY structure that contains an array /// of enumerated changes (deltas) to the specified database with database /// serial numbers larger than the database serial number value specified in /// the input value of the DomainModifiedCount parameter. /// </param> /// <param name="PreferredMaximumLength"> /// The value that specifies the preferred maximum size, in bytes, of data to /// return in the DeltaArray parameter. This is not a hard upper limit, but /// serves as a guide to the server. The server SHOULD stop including /// elements in the returned DeltaArray after the size of the returned data /// equals or exceeds the value of the PreferredMaximumLength parameter. It is /// up to the client implementation to choose the value for this parameter. /// </param> public NtStatus NetrDatabaseDeltas( string PrimaryName, string ComputerName, _NETLOGON_AUTHENTICATOR? Authenticator, ref _NETLOGON_AUTHENTICATOR? ReturnAuthenticator, DatabaseID_Values DatabaseID, ref _NLPR_MODIFIED_COUNT? DomainModifiedCount, out _NETLOGON_DELTA_ENUM_ARRAY? DeltaArray, uint PreferredMaximumLength) { const ushort opnum = 7; byte[] requestStub; byte[] responseStub; Int3264[] paramList; int retVal; SafeIntPtr pPrimaryName = Marshal.StringToHGlobalUni(PrimaryName); SafeIntPtr pComputerName = Marshal.StringToHGlobalUni(ComputerName); SafeIntPtr pAuthenticator = TypeMarshal.ToIntPtr(Authenticator); SafeIntPtr pReturnAuthenticatorIn = TypeMarshal.ToIntPtr(ReturnAuthenticator); SafeIntPtr pDomainModifiedCountIn = TypeMarshal.ToIntPtr(DomainModifiedCount); paramList = new Int3264[] { pPrimaryName, pComputerName, pAuthenticator, pReturnAuthenticatorIn, (uint)DatabaseID, pDomainModifiedCountIn, IntPtr.Zero, PreferredMaximumLength, 0 // retVal }; requestStub = RpceStubEncoder.ToBytes( RpceStubHelper.GetPlatform(), NrpcRpcStubFormatString.TypeFormatString, new RpceStubExprEval[] { new RpceStubExprEval(logon__NETLOGON_DELTA_USERExprEval_0000) }, NrpcRpcStubFormatString.ProcFormatString, NrpcRpcStubFormatString.ProcFormatStringOffsetTable[opnum], true, paramList); rpceClientTransport.Call(opnum, requestStub, rpceTimeout, out responseStub); using (RpceInt3264Collection outParamList = RpceStubDecoder.ToParamList( RpceStubHelper.GetPlatform(), NrpcRpcStubFormatString.TypeFormatString, new RpceStubExprEval[] { new RpceStubExprEval(logon__NETLOGON_DELTA_USERExprEval_0000) }, NrpcRpcStubFormatString.ProcFormatString, NrpcRpcStubFormatString.ProcFormatStringOffsetTable[opnum], true, responseStub, paramList)) { IntPtr pReturnAuthenticatorOut = outParamList[3]; ReturnAuthenticator = TypeMarshal.ToNullableStruct<_NETLOGON_AUTHENTICATOR>(pReturnAuthenticatorOut); IntPtr pDomainModifiedCountOut = outParamList[5]; DomainModifiedCount = TypeMarshal.ToNullableStruct<_NLPR_MODIFIED_COUNT>(pDomainModifiedCountOut); IntPtr pDeltaArray = outParamList[6]; pDeltaArray = Marshal.ReadIntPtr(pDeltaArray); DeltaArray = TypeMarshal.ToNullableStruct<_NETLOGON_DELTA_ENUM_ARRAY>(pDeltaArray); retVal = outParamList[8].ToInt32(); } pPrimaryName.Dispose(); pComputerName.Dispose(); pAuthenticator.Dispose(); pReturnAuthenticatorIn.Dispose(); pDomainModifiedCountIn.Dispose(); return (NtStatus)retVal; }
/// <summary> /// The NetrDatabaseDeltas method returns a set of changes (or deltas) /// performed to the SAM, SAM built-in, or LSA databases after a particular /// value of the database serial number. It is used by BDCs to request /// database changes from the PDC that are missing on the BDC. Opnum: 7 /// </summary> /// <param name="PrimaryName"> /// The custom RPC binding handle (as specified in section 3.5.5.1) that /// represents the connection to the PDC. /// </param> /// <param name="ComputerName"> /// The null-terminated Unicode string that contains the NetBIOS name of /// the BDC calling this method. /// </param> /// <param name="Authenticator"> /// A pointer to a NETLOGON_AUTHENTICATOR structure that contains the /// client authenticator. /// </param> /// <param name="ReturnAuthenticator"> /// A pointer to a NETLOGON_AUTHENTICATOR structure that contains the /// server return authenticator. /// </param> /// <param name="DatabaseID"> /// The identifier for a specific account database set as follows: /// 0x00000000 /// Indicates the SAM database. /// 0x00000001 /// Indicates the SAM built-in database. /// 0x00000002 /// Indicates the LSA database. /// </param> /// <param name="DomainModifiedCount"> /// A pointer to an NLPR_MODIFIED_COUNT structure, as specified in section /// 2.2.1.5.26, that contains the database serial number. On input, this is /// the value of the database serial number on the client. On output, this is /// the value of the database serial number corresponding to the last element /// (delta) returned in the DeltaArray parameter. /// </param> /// <param name="DeltaArray"> /// A pointer to a NETLOGON_DELTA_ENUM_ARRAY structure that contains an array /// of enumerated changes (deltas) to the specified database with database /// serial numbers larger than the database serial number value specified in /// the input value of the DomainModifiedCount parameter. /// </param> /// <param name="PreferredMaximumLength"> /// The value that specifies the preferred maximum size, in bytes, of data to /// return in the DeltaArray parameter. This is not a hard upper limit, but /// serves as a guide to the server. The server SHOULD stop including /// elements in the returned DeltaArray after the size of the returned data /// equals or exceeds the value of the PreferredMaximumLength parameter. It is /// up to the client implementation to choose the value for this parameter. /// </param> public NtStatus NetrDatabaseDeltas( string PrimaryName, string ComputerName, _NETLOGON_AUTHENTICATOR? Authenticator, ref _NETLOGON_AUTHENTICATOR? ReturnAuthenticator, DatabaseID_Values DatabaseID, ref _NLPR_MODIFIED_COUNT? DomainModifiedCount, out _NETLOGON_DELTA_ENUM_ARRAY? DeltaArray, uint PreferredMaximumLength) { NtStatus status = rpc.NetrDatabaseDeltas( PrimaryName, ComputerName, Authenticator, ref ReturnAuthenticator, DatabaseID, ref DomainModifiedCount, out DeltaArray, PreferredMaximumLength); context.ConnectionStatus = status; return status; }