Private/Strings/ConvertFrom-SecureString.ps1

<#
  .SYNOPSIS
    Converts a secure string to an (un)encrypted standard string.
 
  .PARAMETER SecureString
    Specifies the secure string to convert to an encrypted standard string.
  .PARAMETER SecureKey
    Specifies the encryption key as a secure string. The secure string value is
    converted to a byte array before being used as the key.
  .PARAMETER Key
    Specifies the encryption key as a byte array.
  .PARAMETER AsPlainText
    Specified the returned result should be an unencrypted standard string.
#>

Function ConvertFrom-SecureString {
  [CmdletBinding(DefaultParameterSetName="Secure", HelpUri="http://go.microsoft.com/fwlink/?LinkID=113287")]
  Param(
      [Parameter(Position = 1, Mandatory = $true, ValueFromPipeline = $true)]
      [securestring]$SecureString
      ,
      [Parameter(ParameterSetName="Secure", Position = 2)]
      [securestring]$SecureKey
      ,
      [Parameter(ParameterSetName="Open")]
      [byte[]]$Key
      ,
      [Parameter(ParameterSetName="Decrypt")]
      [switch]$AsPlainText
  )
  Begin {
    Try {
      $outBuffer = $null
      If ($PSBoundParameters.TryGetValue("OutBuffer", [ref]$outBuffer)) {
        $PSBoundParameters["OutBuffer"] = 1
      }
      $wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand("Microsoft.PowerShell.Security\ConvertFrom-SecureString", [System.Management.Automation.CommandTypes]::Cmdlet)
      If ($PSBoundParameters["AsPlainText"]) {
        $scriptCmd = { & ConvertFrom-SecureString2 $SecureString }
      } Else {
        $scriptCmd = { & $wrappedCmd @PSBoundParameters }
      }
      $steppablePipeline = $scriptCmd.GetSteppablePipeline($myInvocation.CommandOrigin)
      $steppablePipeline.Begin($PSCmdlet)
    } Catch {
      Throw
    }
  }
  Process {
    Try {
      $steppablePipeline.Process($_)
    } Catch {
      Throw
    }
  }
  End {
    Try {
      $steppablePipeline.End()
    } Catch {
      Throw
    }
  }
  <#
 
  .ForwardHelpTargetName Microsoft.PowerShell.Security\ConvertFrom-SecureString
  .ForwardHelpCategory Cmdlet
 
  #>

}

<#
  .SYNOPSIS
    Converts a secure string to an unencrypted standard string.
 
  .PARAMETER SecureString
    Specifies the secure string to convert to an encrypted standard string.
#>

Function ConvertFrom-SecureString2 {
  Param(
      [Parameter(Position = 1, Mandatory = $true, ValueFromPipeline = $true)]
      [securestring]$SecureString
  )
  Process {
    $BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecureString)
    [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
  }
}