/// <summary>
 ///  Update the session context after receiving a request from the client.
 /// </summary>
 /// <param name="currentInterfaceType">Rpc interface type.</param>
 /// <param name="messageReceived">The DRSR request received</param>
 internal void UpdateSessionContextWithMessageReceived(
     DrsrRpcInterfaceType currentInterfaceType,
     DrsrRequestStub messageReceived)
 {
     requestReceived = messageReceived;
     interfaceType   = currentInterfaceType;
 }
Beispiel #2
0
        public static ushort[] QueryDrsrTcpEndpoint(DrsrRpcInterfaceType interfaceType, string serverName)
        {
            if (serverName == null)
            {
                throw new ArgumentNullException("serverName");
            }

            ushort[] endpoints;
            if (interfaceType == DrsrRpcInterfaceType.DRSUAPI)
            {
                endpoints = RpceEndpointMapper.QueryDynamicTcpEndpointByInterface(
                    serverName,
                    DRSUAPI_RPC_INTERFACE_UUID,
                    DRSUAPI_RPC_INTERFACE_MAJOR_VERSION,
                    DRSUAPI_RPC_INTERFACE_MINOR_VERSION);
            }
            else
            {
                endpoints = RpceEndpointMapper.QueryDynamicTcpEndpointByInterface(
                    serverName,
                    DSAOP_RPC_INTERFACE_UUID,
                    DSAOP_RPC_INTERFACE_MAJOR_VERSION,
                    DSAOP_RPC_INTERFACE_MINOR_VERSION);
            }

            return(endpoints);
        }
        public T ExpectRpcCall <T>(
            DrsrRpcInterfaceType interfaceType,
            TimeSpan timeout,
            out DrsrServerSessionContext sessionContext)
            where T : DrsrRequestStub
        {
            RpceServerSessionContext rpceSessionContext;
            ushort opnum;

            byte[] requestStub = rpceLayerServer.ExpectCall(timeout, out rpceSessionContext, out opnum);

            if ((interfaceType == DrsrRpcInterfaceType.DSAOP &&
                 !Enum.IsDefined(typeof(DsaopMethodOpnums), (ushort)opnum)) ||
                (interfaceType == DrsrRpcInterfaceType.DRSUAPI &&
                 !Enum.IsDefined(typeof(DrsuapiMethodOpnums), (ushort)opnum)))
            {
                throw new InvalidOperationException("An invalid method is invoked");
            }

            //If there isn't a corresponding Drsr session context, it's a new session
            if (contextManager.LookupSessionContext(rpceSessionContext, out sessionContext))
            {
                sessionContext.RpceLayerSessionContext = rpceSessionContext;
            }

            T t;

            if (typeof(T) == typeof(DrsrRequestStub))
            {
                t = (T)DrsrUtility.CreateDrsrRequestStub(interfaceType, opnum);
            }
            else
            {
                t = (T)Activator.CreateInstance(typeof(T));
                if ((ushort)t.Opnum != opnum)
                {
                    throw new InvalidOperationException("An unexpected method call is received");
                }
            }

            //Decode the request stub
            t.Decode(sessionContext, requestStub);

            //Update the session context
            sessionContext.UpdateSessionContextWithMessageReceived(interfaceType, t);
            return(t);
        }
        internal void UpdateSessionContextWithMessageSent(
            DrsrRpcInterfaceType currentInterfaceType,
            DrsrResponseStub messageToSend)
        {
            if (currentInterfaceType == DrsrRpcInterfaceType.DRSUAPI)
            {
                switch ((DrsuapiMethodOpnums)messageToSend.Opnum)
                {
                case DrsuapiMethodOpnums.DrsBind:
                    DrsBindRequest  bindRequest  = requestReceived as DrsBindRequest;
                    DrsBindResponse bindResponse = messageToSend as DrsBindResponse;
                    if (bindRequest != null && bindResponse != null)
                    {
                        if (bindResponse.Status == 0)
                        {
                            drsHandles.Add(bindResponse.drsHandle);
                        }
                    }
                    break;

                case DrsuapiMethodOpnums.DrsUnbind:
                    DrsUnbindRequest  unbindRequest  = requestReceived as DrsUnbindRequest;
                    DrsUnbindResponse unbindResponse = messageToSend as DrsUnbindResponse;
                    if (unbindRequest != null && unbindResponse != null)
                    {
                        if (unbindResponse.Status == 0 && drsHandles.Contains(unbindRequest.drsHandle.Value))
                        {
                            drsHandles.Remove(unbindRequest.drsHandle.Value);
                        }
                    }
                    break;

                default:
                    break;
                }
            }
            else if (currentInterfaceType == DrsrRpcInterfaceType.DSAOP)
            {
                switch ((DsaopMethodOpnums)messageToSend.Opnum)
                {
                case DsaopMethodOpnums.DsaPrepareScript:
                    DsaPrepareScriptRequest  PrepareRequest  = requestReceived as DsaPrepareScriptRequest;
                    DsaPrepareScriptResponse PrepareResponse = messageToSend as DsaPrepareScriptResponse;
                    if (PrepareRequest != null && PrepareResponse != null)
                    {
                        if (PrepareResponse.Status == 0)
                        {
                            password = PrepareResponse.outMessage.Value.V1.pbPassword;
                        }
                    }
                    break;

                case DsaopMethodOpnums.DsaExecuteScript:
                    DsaExecuteScriptRequest  executeRequest  = requestReceived as DsaExecuteScriptRequest;
                    DsaExecuteScriptResponse executeResponse = messageToSend as DsaExecuteScriptResponse;
                    if (executeRequest != null && executeResponse != null)
                    {
                        if (executeResponse.Status == 0)
                        {
                            password = new byte[0];
                        }
                    }
                    break;
                }
            }
        }
Beispiel #5
0
        internal static DrsrRequestStub CreateDrsrRequestStub(DrsrRpcInterfaceType interfaceType, ushort opnum)
        {
            DrsrRequestStub requestStub = null;

            if (interfaceType == DrsrRpcInterfaceType.DRSUAPI)
            {
                switch ((DrsuapiMethodOpnums)opnum)
                {
                case DrsuapiMethodOpnums.DrsBind:
                    requestStub = new DrsBindRequest();
                    break;

                case DrsuapiMethodOpnums.DrsUnbind:
                    requestStub = new DrsUnbindRequest();
                    break;

                case DrsuapiMethodOpnums.DrsReplicaSync:
                    requestStub = new DrsReplicaSyncRequest();
                    break;

                case DrsuapiMethodOpnums.DrsGetNcChanges:
                    requestStub = new DrsGetNcChangesRequest();
                    break;

                case DrsuapiMethodOpnums.DrsUpdateRefs:
                    requestStub = new DrsUpdateRefsRequest();
                    break;

                case DrsuapiMethodOpnums.DrsReplicaAdd:
                    requestStub = new DrsReplicaAddRequest();
                    break;

                case DrsuapiMethodOpnums.DrsReplicaDel:
                    requestStub = new DrsReplicaDelRequest();
                    break;

                case DrsuapiMethodOpnums.DrsReplicaModify:
                    requestStub = new DrsReplicaModifyRequest();
                    break;

                case DrsuapiMethodOpnums.DrsVerifyNames:
                    requestStub = new DrsVerifyNamesRequest();
                    break;

                case DrsuapiMethodOpnums.DrsGetMemberships:
                    requestStub = new DrsGetMembershipsRequest();
                    break;

                case DrsuapiMethodOpnums.DrsInterDomainMove:
                    requestStub = new DrsInterDomainMoveRequest();
                    break;

                case DrsuapiMethodOpnums.DrsGetNt4ChangeLog:
                    requestStub = new DrsGetNt4ChangeLogRequest();
                    break;

                case DrsuapiMethodOpnums.DrsCrackNames:
                    requestStub = new DrsCrackNamesRequest();
                    break;

                case DrsuapiMethodOpnums.DrsWriteSPN:
                    requestStub = new DrsWriteSpnRequest();
                    break;

                case DrsuapiMethodOpnums.DrsRemoveDsServer:
                    requestStub = new DrsRemoveDsServerRequest();
                    break;

                case DrsuapiMethodOpnums.DrsRemoveDsDomain:
                    requestStub = new DrsRemoveDsDomainRequest();
                    break;

                case DrsuapiMethodOpnums.DrsDomainControllerInfo:
                    requestStub = new DrsDomainControllerInfoRequest();
                    break;

                case DrsuapiMethodOpnums.DrsAddEntry:
                    requestStub = new DrsAddEntryRequest();
                    break;

                case DrsuapiMethodOpnums.DrsExecuteKcc:
                    requestStub = new DrsExecuteKccRequest();
                    break;

                case DrsuapiMethodOpnums.DrsGetReplInfo:
                    requestStub = new DrsGetReplInfoRequest();
                    break;

                case DrsuapiMethodOpnums.DrsAddSidHistory:
                    requestStub = new DrsAddSidHistoryRequest();
                    break;

                case DrsuapiMethodOpnums.DrsGetMemberships2:
                    requestStub = new DrsGetMemberships2Request();
                    break;

                case DrsuapiMethodOpnums.DrsReplicaVerifyObjects:
                    requestStub = new DrsReplicaVerifyObjectsRequest();
                    break;

                case DrsuapiMethodOpnums.DrsGetObjectExistence:
                    requestStub = new DrsGetObjectExistenceRequest();
                    break;

                case DrsuapiMethodOpnums.DrsQuerySitesByCost:
                    requestStub = new DrsQuerySitesByCostRequest();
                    break;

                case DrsuapiMethodOpnums.DrsInitDemotion:
                    requestStub = new DrsInitDemotionRequest();
                    break;

                case DrsuapiMethodOpnums.DrsReplicaDemotion:
                    requestStub = new DrsReplicaDemotionRequest();
                    break;

                case DrsuapiMethodOpnums.DrsFinishDemotion:
                    requestStub = new DrsFinishDemotionRequest();
                    break;
                }
            }
            else if (interfaceType == DrsrRpcInterfaceType.DSAOP)
            {
                switch ((DsaopMethodOpnums)opnum)
                {
                case DsaopMethodOpnums.DsaPrepareScript:
                    requestStub = new DsaPrepareScriptRequest();
                    break;

                case DsaopMethodOpnums.DsaExecuteScript:
                    requestStub = new DsaExecuteScriptRequest();
                    break;
                }
            }

            return(requestStub);
        }