function Remove-Datasources { <# .SYNOPSIS Remove DataSource nodes from SSRS Report XML data .PARAMETER ReportXml XML data to remove DataSource nodes from .PARAMETER SkipParameterBasedConnections Whether to keep paramter based DataSources #> [CmdletBinding()] Param( [Parameter(Position = 0, Mandatory = $true)] [XML]$ReportXml, [Parameter(Position = 1, Mandatory = $false)] [bool]$SkipParameterBasedConnections = $false ) $logLead = Get-LogLeadName $stream = New-Object System.IO.MemoryStream try { Write-Verbose "$logLead : Getting DataSourceReference Elements" $dataSourceNodes = $ReportXml.GetElementsByTagName("DataSourceReference") if (!($SkipParameterBasedConnections)) { Write-Verbose "$logLead : Adding Parameter Based Datasources to List to Remove" $dataSourceNodes += $dataSourceNodes = $reportXml.GetElementsByTagName("ConnectionProperties") } $nodesToRemove = @() Write-Verbose "$logLead : Rebuilding nodes with bogus information" foreach ($dataSourceNode in $dataSourceNodes) { Write-Verbose ("$logLead : Rebuilding Datasource {0}" -f $dataSourceNode.ParentNode.Name) $connectionProperties = $ReportXml.CreateNode($dataSourceNode.NodeType, "ConnectionProperties", $null) $dataProvider = $ReportXml.CreateNode($dataSourceNode.NodeType, "DataProvider", $null) $dataProvider.InnerText = "SQL" $conStr = $ReportXml.CreateNode($DataSourceNode.NodeType, "ConnectString", $null) $conStr.InnerText = "Data Source=Server Name Here;Initial Catalog=database name here" $dataSourceNode.ParentNode.AppendChild($connectionProperties) | Out-Null $connectionProperties.AppendChild($dataProvider) | Out-Null $connectionProperties.AppendChild($conStr) | Out-Null $nodesToRemove += $dataSourceNode } Write-Verbose "$logLead : Removing all nodes" foreach ($node in $nodesToRemove) { $node.ParentNode.RemoveChild($node) | Out-Null } Write-Verbose "$logLead : Cleaning Namespaces" $ReportXml.InnerXml = $ReportXml.InnerXml.Replace("xmlns=`"`"", "") Write-Verbose "$logLead : Saving ReportData to Stream" $ReportXml.Save($stream) return $stream.ToArray() } finally { $stream.Close() $stream.Dispose() } }