Hey guys, so here is my current conundrum. i am trying to find a way to use a plugged in smart card to browse or download a file from a Smart card authenticated website, sharepoint in this case.
I have some working ideas, but passing the PIN to the script via command line is proving difficult. Not sure if i can simply pass it as i would a credential with a secure string.
Also, i would love to be able to get the script to navigate past certain pages, like splash pages for example.
And the kicker… i need to do it in PS v2.
here is the code i was working with, but im not attached to it
Add-Type -AssemblyName System.Security add-type @" using System.Net; using System.Security.Cryptography.X509Certificates; public class TrustAllCertsPo licy : ICertificatePolicy { public bool CheckValidationResult( ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem) { return true; } } "@ [System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy # You can do more filtering here if there are other cert requirements... $ValidCerts = [System.Security.Cryptography.X509Certificates.X509Certificate2[]](dir Cert:\CurrentUser\My | where { $_.NotAfter -gt (Get-Date) }) #$ValidCerts | select subject, DnsNameList, Issuer, EnhancedKeyUsageList, Archived, NotAfter | fl $Cert = $ValidCerts[0] $Url = 'URL HERE' $OutFilePath = 'OUTPUT FILE NAME HERE' $Cert = 'USER CERT HERE' if (Test-Path $OutFilePath) { throw "'$OutFilePath' already exists!" } # Create webrequest that contains the selected certificate, and try to get a response $Request = [System.Net.WebRequest]::Create($Url) $Request.ClientCertificates.Add($Cert) try { $Response = $Request.GetResponse() } catch { # You could present a nicer message here Write-Error $_ } if ($Response) { # You'll probably want to check out the $Response object before doing anything with # it (probably at least check $Response.StatusCode) # There's probably a shorter/cleaner/better way to do this, but this will create a buffer and a filestream, # then transfer the binary data from the $Response's stream to the filestream using the buffer... $Buffer = New-Object byte[] 1024 # You can adjust the buffer size $OutFileStream = [System.IO.File]::Create($OutFilePath) # This will overwrite an existing file! $ResponseStream = $Response.GetResponseStream() while (($BytesRead = $ResponseStream.Read($Buffer, 0, $Buffer.Length))) { $OutFileStream.Write($Buffer, 0, $BytesRead) } # Cleanup $OutFileStream.Flush() $OutFileStream.Dispose() $ResponseStream.Dispose() $Response.Close() }