A proxy command of PowerShell's New-WebServiceProxy to allow for the passing of client certificates during creation.
Function New-ProxyWebServiceProxy { | |
[CmdletBinding(DefaultParameterSetName='NoCredentials', HelpUri='http://go.microsoft.com/fwlink/?LinkID=135238')] | |
Param ( | |
[Parameter(Mandatory=$true, Position=0)] | |
[Alias('WL','WSDL','Path')] | |
[ValidateNotNullOrEmpty()] | |
[uri] | |
${Uri}, | |
[Parameter(ParameterSetName='Credential')] | |
[Alias('Cred')] | |
[ValidateNotNullOrEmpty()] | |
[pscredential] | |
[System.Management.Automation.CredentialAttribute()] | |
${Credential}, | |
[Alias('Cert')] | |
[ValidateNotNullOrEmpty()] | |
[System.Security.Cryptography.X509Certificates.X509Certificate2] | |
${Certificate}, | |
[Parameter(Position=1)] | |
[Alias('FileName','FN')] | |
[ValidateNotNullOrEmpty()] | |
[string] | |
${Class}, | |
[Parameter(Position=2)] | |
[Alias('NS')] | |
[ValidateNotNullOrEmpty()] | |
[string] | |
${Namespace}, | |
[Parameter(ParameterSetName='UseDefaultCredential')] | |
[Alias('UDC')] | |
[ValidateNotNull()] | |
[switch] | |
${UseDefaultCredential} | |
) | |
Begin { | |
Try { | |
$outBuffer = $null | |
If ($PSBoundParameters.TryGetValue('OutBuffer', [ref]$outBuffer)) { | |
$PSBoundParameters['OutBuffer'] = 1 | |
} | |
If ($Certificate) { | |
$TempFile = [System.IO.Path]::GetTempFileName() + "_wsdl.xml" | |
$WebRequest = @{ | |
"Certificate" = $Certificate | |
"URI" = $URI | |
} | |
If ($Credential) { | |
$WebRequest.Credential = $Credential | |
#$WebRequest.ProxyCredential = $Credential | |
} ElseIf ($UseDefaultCredential) { | |
$WebRequest.UseDefaultCredentials = $True | |
#$WebRequest.ProxyUseDefaultCredentials = $True | |
} | |
$Response = Invoke-WebRequest @WebRequest | |
$Content = [XML]$Response.Content | |
$FirstChild = $Content.FirstChild | |
If ($FirstChild.Name -eq "xml") { | |
$Content.RemoveChild($FirstChild) | Out-Null | |
} | |
$Content.OuterXml | Out-File -FilePath $TempFile | |
$PSBoundParameters.Uri = "file://" + $TempFile | |
} | |
$PSBoundParameters.Remove("Certificate") | Out-Null | |
$wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('New-WebServiceProxy', [System.Management.Automation.CommandTypes]::Cmdlet) | |
$scriptCmd = {& $wrappedCmd @PSBoundParameters } | |
$steppablePipeline = $scriptCmd.GetSteppablePipeline($myInvocation.CommandOrigin) | |
$steppablePipeline.Begin($PSCmdlet) | |
} Catch { | |
Throw $_ | |
} | |
} | |
Process { | |
Try { | |
$Proxy = New-WebServiceProxy @PSBoundParameters | |
$Proxy.ClientCertificates.Add($Certificate) | Out-Null | |
$Proxy | |
} Catch { | |
Throw $_ | |
} | |
} | |
End { | |
Try { | |
If ($TempFile) { | |
Remove-Item $TempFile | |
} | |
} Catch { | |
Throw | |
} | |
} | |
<# | |
.ForwardHelpTargetName New-WebServiceProxy | |
.ForwardHelpCategory Cmdlet | |
#> | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment