public _NETLOGON_CONTROL_DATA_INFORMATION CreateNetlogonControlDataInformation(
            FunctionCode_Values functionCode,
            string trustedDomainNameOrUserName)
        {
            _NETLOGON_CONTROL_DATA_INFORMATION netlogonControlDataInfo = new _NETLOGON_CONTROL_DATA_INFORMATION();

            switch (functionCode)
            {
                case FunctionCode_Values.NETLOGON_CONTROL_REDISCOVER:
                case FunctionCode_Values.NETLOGON_CONTROL_TC_QUERY:
                case FunctionCode_Values.NETLOGON_CONTROL_CHANGE_PASSWORD:
                case FunctionCode_Values.NETLOGON_CONTROL_TC_VERIFY:
                    netlogonControlDataInfo.TrustedDomainName = trustedDomainNameOrUserName;
                    break;

                case FunctionCode_Values.NETLOGON_CONTROL_SET_DBFLAG:
                    //When functionCode is 0x0000FFFE, set debugFlags to 0.
                    netlogonControlDataInfo.DebugFlag = 0;
                    break;

                case FunctionCode_Values.NETLOGON_CONTROL_FIND_USER:
                    netlogonControlDataInfo.UserName = trustedDomainNameOrUserName;
                    break;

                default:
                    //do nothing
                    break;
            }

            return netlogonControlDataInfo;
        }
        /// <summary>
        ///  The NetrLogonControl2Ex method executes windows-specific
        ///  administrative actions that pertain to the Netlogon
        ///  server operation. It is used to query the status and
        ///  control the actions of the Netlogon server. Opnum :
        ///  18 
        /// </summary>
        /// <param name="ServerName">
        ///  The custom RPC binding handle, as specified in section
        ///  .
        /// </param>
        /// <param name="FunctionCode">
        ///  The control operation to be performed; MUST be one of
        ///  the following values. The following restrictions apply
        ///  to the values of the FunctionCode parameter in windows_nt_4_0,
        ///  windows_2000, windows_7, and windows_server_7. There
        ///  are no restrictions in windows_server_2003, windows_vista,
        ///  and windows_server_2008. The following values are not
        ///  supported on windows_nt_4_0:NETLOGON_CONTROL_CHANGE_PASSWORD
        ///  (0x00000009)NETLOGON_CONTROL_TC_VERIFY (0x0000000A)NETLOGON_CONTROL_FORCE_DNS_REG
        ///  (0x0000000B)NETLOGON_CONTROL_QUERY_DNS_REG (0x0000000C)NETLOGON_CONTROL_BACKUP_CHANGE_LOG
        ///  (0x0000FFFC)NETLOGON_CONTROL_TRUNCATE_LOG (0x0000FFFD)NETLOGON_CONTROL_SET_DBFLAG
        ///  (0x0000FFFE)NETLOGON_CONTROL_BREAKPOINT (0x0000FFFF)The
        ///  error ERROR_NOT_SUPPORTED is returned if one of these
        ///  values is used. The following values are not supported
        ///  on windows_2000_server:NETLOGON_CONTROL_TC_VERIFY (0x0000000A)NETLOGON_CONTROL_FORCE_DNS_REG
        ///  (0x0000000B)NETLOGON_CONTROL_QUERY_DNS_REG (0x0000000C)The
        ///  error ERROR_NOT_SUPPORTED is returned if one of these
        ///  values is used. The following values are not supported
        ///  on windows_7 or windows_server_7:NETLOGON_CONTROL_REPLICATE
        ///  (0x00000002)NETLOGON_CONTROL_SYNCHRONIZE (0x00000003)NETLOGON_CONTROL_PDC_REPLICATE
        ///  (0x00000004)NETLOGON_CONTROL_BACKUP_CHANGE_LOG (0x0000FFFC)The
        ///  error ERROR_NOT_SUPPORTED is returned if one of these
        ///  values is used.
        /// </param>
        /// <param name="QueryLevel">
        ///  Information query level requested by the client. The
        ///  buffer returned in the Buffer parameter contains one
        ///  of the following structures, based on the value of
        ///  this field.
        /// </param>
        /// <param name="Data">
        ///  NETLOGON_CONTROL_DATA_INFORMATION structure, as specified
        ///  in section , that contains specific data required by
        ///  the query.
        /// </param>
        /// <param name="Buffer">
        ///  NETLOGON_CONTROL_QUERY_INFORMATION structure, as specified
        ///  in section , that contains the specific query results,
        ///  with a level of verbosity as specified in QueryLevel.
        /// </param>
        public NetApiStatus NetrLogonControl2Ex(
            string ServerName,
            FunctionCode_Values FunctionCode,
            QueryLevel_Values QueryLevel,
            _NETLOGON_CONTROL_DATA_INFORMATION? Data,
            out _NETLOGON_CONTROL_QUERY_INFORMATION? Buffer)
        {
            const ushort opnum = 18;

            byte[] requestStub;
            byte[] responseStub;
            Int3264[] paramList;
            int retVal;

            SafeIntPtr pServerName = Marshal.StringToHGlobalUni(ServerName);
            SafeIntPtr pData = TypeMarshal.ToIntPtr(Data, FunctionCode, null, null);

            paramList = new Int3264[] {
                pServerName,
                (uint)FunctionCode,
                (uint)QueryLevel,
                pData,
                IntPtr.Zero,
                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 pBuffer = outParamList[4];
                Buffer = TypeMarshal.ToNullableStruct<_NETLOGON_CONTROL_QUERY_INFORMATION>(
                    pBuffer,
                    QueryLevel,
                    null,
                    null);

                retVal = outParamList[5].ToInt32();
            }

            pServerName.Dispose();
            pData.Dispose();

            return (NetApiStatus)retVal;
        }
 /// <summary>
 ///  The NetrLogonControl2Ex method executes windows-specific
 ///  administrative actions that pertain to the Netlogon
 ///  server operation. It is used to query the status and
 ///  control the actions of the Netlogon server. Opnum: 18 
 /// </summary>
 /// <param name="serverName">
 ///  The custom RPC binding handle.
 /// </param>
 /// <param name="functionCode">
 ///  The control operation to be performed; MUST be one of
 ///  the following values. The following restrictions apply
 ///  to the values of the FunctionCode parameter in windows_nt_4_0,
 ///  windows_2000, windows_7, and windows_server_7. There
 ///  are no restrictions in windows_server_2003, windows_vista,
 ///  and windows_server_2008. The following values are not
 ///  supported on windows_nt_4_0: NETLOGON_CONTROL_CHANGE_PASSWORD
 ///  (0x00000009) NETLOGON_CONTROL_TC_VERIFY (0x0000000A) NETLOGON_CONTROL_FORCE_DNS_REG
 ///  (0x0000000B) NETLOGON_CONTROL_QUERY_DNS_REG (0x0000000C) NETLOGON_CONTROL_BACKUP_CHANGE_LOG
 ///  (0x0000FFFC) NETLOGON_CONTROL_TRUNCATE_LOG (0x0000FFFD) NETLOGON_CONTROL_SET_DBFLAG
 ///  (0x0000FFFE) NETLOGON_CONTROL_BREAKPOINT (0x0000FFFF).<para/>
 ///  The error ERROR_NOT_SUPPORTED is returned if one of these
 ///  values is used.<para/>
 ///  The following values are not supported
 ///  on windows_2000_server: NETLOGON_CONTROL_TC_VERIFY (0x0000000A) NETLOGON_CONTROL_FORCE_DNS_REG
 ///  (0x0000000B) NETLOGON_CONTROL_QUERY_DNS_REG (0x0000000C).<para/>
 ///  The error ERROR_NOT_SUPPORTED is returned if one of these
 ///  values is used.<para/>
 ///  The following values are not supported
 ///  on windows_7 or windows_server_7: NETLOGON_CONTROL_REPLICATE
 ///  (0x00000002) NETLOGON_CONTROL_SYNCHRONIZE (0x00000003) NETLOGON_CONTROL_PDC_REPLICATE
 ///  (0x00000004) NETLOGON_CONTROL_BACKUP_CHANGE_LOG (0x0000FFFC).<para/>
 ///  The error ERROR_NOT_SUPPORTED is returned if one of these
 ///  values is used.
 /// </param>
 /// <param name="queryLevel">
 ///  Information query level requested by the client. The
 ///  buffer returned in the Buffer parameter contains one
 ///  of the following structures, based on the value of
 ///  this field.
 /// </param>
 /// <param name="data">
 ///  NETLOGON_CONTROL_DATA_INFORMATION structure, 
 ///  that contains specific data required by
 ///  the query.
 /// </param>
 /// <param name="buffer">
 ///  NETLOGON_CONTROL_QUERY_INFORMATION structure, 
 ///  that contains the specific query results,
 ///  with a level of verbosity as specified in QueryLevel.
 /// </param>
 /// <returns>
 /// The method returns 0x00000000 on success; 
 /// otherwise, it returns a nonzero error code.
 /// </returns>
 public NetApiStatus NetrLogonControl2Ex(
     string serverName,
     FunctionCode_Values functionCode,
     QueryLevel_Values queryLevel,
     _NETLOGON_CONTROL_DATA_INFORMATION? data,
     out _NETLOGON_CONTROL_QUERY_INFORMATION? buffer)
 {
     return rpc.NetrLogonControl2Ex(
         serverName,
         functionCode,
         queryLevel,
         data,
         out buffer);
 }