private string CallEncryptOrDecrypt(bool doEncrypt, string xmlString, ProtectedConfigurationProvider protectionProvider, ProtectedConfigurationSection protectedConfigSection)
 {
     string str = null;
     WindowsImpersonationContext context = null;
     string assemblyQualifiedName = protectionProvider.GetType().AssemblyQualifiedName;
     ProviderSettings settings = protectedConfigSection.Providers[protectionProvider.Name];
     if (settings == null)
     {
         throw System.Web.Util.ExceptionUtil.ParameterInvalid("protectionProvider");
     }
     NameValueCollection parameters = settings.Parameters;
     if (parameters == null)
     {
         parameters = new NameValueCollection();
     }
     string[] allKeys = parameters.AllKeys;
     string[] parameterValues = new string[allKeys.Length];
     for (int i = 0; i < allKeys.Length; i++)
     {
         parameterValues[i] = parameters[allKeys[i]];
     }
     if (this._Identity != null)
     {
         context = this._Identity.Impersonate();
     }
     try
     {
         try
         {
             IRemoteWebConfigurationHostServer o = CreateRemoteObject(this._Server, this._Username, this._Domain, this._Password);
             try
             {
                 str = o.DoEncryptOrDecrypt(doEncrypt, xmlString, protectionProvider.Name, assemblyQualifiedName, allKeys, parameterValues);
             }
             finally
             {
                 while (Marshal.ReleaseComObject(o) > 0)
                 {
                 }
             }
             return str;
         }
         finally
         {
             if (context != null)
             {
                 context.Undo();
             }
         }
     }
     catch
     {
     }
     return str;
 }
        private string CallEncryptOrDecrypt(bool doEncrypt, string xmlString, ProtectedConfigurationProvider protectionProvider, ProtectedConfigurationSection protectedConfigSection)
        {
#if !FEATURE_PAL // FEATURE_PAL has no COM objects => no encryption
            // ROTORTODO: COM Objects are not implemented.
            // CORIOLISTODO: COM Objects are not implemented.
            ProviderSettings                   ps;
            NameValueCollection                nvc;
            string  []                         paramKeys;
            string  []                         paramValues;
            string                             returnString = null;
            string                             typeName;
            WindowsImpersonationContext        wiContext = null;

            ////////////////////////////////////////////////////////////
            // Step 1: Create list of parameters for the protection provider
            typeName = protectionProvider.GetType().AssemblyQualifiedName;
            ps = protectedConfigSection.Providers[protectionProvider.Name];
            if (ps == null)
                throw ExceptionUtil.ParameterInvalid("protectionProvider");

            nvc = ps.Parameters;
            if (nvc == null)
                nvc = new NameValueCollection();

            paramKeys = nvc.AllKeys;
            paramValues = new string[paramKeys.Length];
            for(int iter = 0; iter<paramKeys.Length; iter++)
                paramValues[iter] = nvc[paramKeys[iter]];

            ////////////////////////////////////////////////////////////
            // Step 2: Set the impersonation if required
            if (_Identity != null)
                wiContext = _Identity.Impersonate();

            try {
                try {
                    //////////////////////////////////////////////////////////////////
                    // Step 3: Get the type and create the object on the remote server
                    IRemoteWebConfigurationHostServer remoteSrv = CreateRemoteObject(_Server, _Username, _Domain, _Password);
                    try {
                        //////////////////////////////////////////////////////////////////
                        // Step 4: Call the API
                        returnString = remoteSrv.DoEncryptOrDecrypt(doEncrypt, xmlString, protectionProvider.Name, typeName, paramKeys, paramValues);
                    } finally {
                        while (Marshal.ReleaseComObject(remoteSrv) > 0) { } // release the COM object
                    }
                } finally {
                    if (wiContext != null)
                        wiContext.Undo(); // revert impersonation
                }
            }
            catch {
            }

            return returnString;
#else       // !FEATURE_PAL
            throw new NotImplementedException("ROTORTODO");
#endif      // !FEATURE_PAL
        }