Inhalt des SharePoint SecureStore auflisten

Den Inhalt des SecureStore auflisten ist im Grunde keine gute Idee. Immerhin ist der Inhalt “sicher”..
Manchmal muss aber trotzdem einen Blick darauf werfen – entweder weil keiner die Einstellungen der DEV-VM dokumentiert hat oder weil der Kunde sich gerade nicht sicher ist was denn nun eingestellt ist…

Den Inhalt aufzulisten ist per PowerShell einfach möglich:

Add-PSSnapin Microsoft.SharePoint.PowerShell
[Reflection.Assembly]::LoadWithPartialName("Microsoft.Office.SecureStore.dll") | Out-Null
[Reflection.Assembly]::LoadWithPartialName("Microsoft.Office.SecureStoreService") | Out-Null
$site = ((Get-SPWebApplication -IncludeCentralAdministration) | ?{ $_.IsAdministrationWebApplication } | select -First 1).Sites[0]
$secs = [Microsoft.Office.SecureStoreService.Server.SecureStoreProviderFactory]::Create()
$secs.Context = Get-SPServiceContext -Site $site
$apps = $secs.GetTargetApplications()
Write-Host "$($apps.count) applications in SecureStore..."
$apps | %{
$type = [Enum]::GetName([Microsoft.BusinessData.Infrastructure.SecureStore.TargetApplicationType], $_.Type)
Write-Host "$($_.Name):$($_.ApplicationId) ($type)"
$fields = $secs.GetTargetApplicationFields($_.ApplicationId);
$creds = $secs.GetCredentials($_.ApplicationId)
$creds | %{
$c = $_
$f = $fields | ?{ $_.CredentialType -eq $c.CredentialType}
$ptr = [IntPtr]::Zero
$ptr = [Runtime.InteropServices.Marshal]::SecureStringToGlobalAllocUnicode($c.Credential)
$str = [Runtime.InteropServices.Marshal]::PtrToStringUni($ptr);
[Runtime.InteropServices.Marshal]::ZeroFreeGlobalAllocUnicode($ptr);
Write-Host " - $($f.Name) ($($c.CredentialType)): $($str)"
}
}