简体   繁体   English

使用Powershell打开SSRS项目

[英]Opening a SSRS project using Powershell

I have a report that is copied to a number of different servers. 我有一个报告被复制到许多不同的服务器。 It is imported manually and the data source properties are altered to match the current server's specs. 它是手动导入的,并且数据源属性被更改以匹配当前服务器的规范。 I would like to be able to automate the process by enabling users to open a the SSRS report and dynamically alter it's shared data source properties through PowerShell. 我希望能够通过允许用户打开SSRS报告并通过PowerShell动态更改其共享数据源属性来自动化该过程。 I hope you could help. 我希望你能帮忙。 You may see reference below. 您可能会在下面看到参考。

该报告位于以下位置:

在此输入图像描述

The script would accept an input parameter for servername, username and password. 该脚本将接受servername,username和password的输入参数。 Also, the save my password must be ticked. 此外,必须勾选保存我的密码。

I couldn't believe I managed to create a script for this. 我简直不敢相信我设法为此创建了一个脚本。 You may make use of the script below as future reference. 您可以使用下面的脚本作为将来的参考。 Comments are available for each part and anything that needs to be altered has a "here" keyword , ex. 每个部分都有注释,任何需要更改的内容都有一个“here”关键字,例如。 Your_database_name_here . Your_database_name_here。

Import-Module SqlPs

#Input parameter to get Server\Instancename of your Datasource
$Servername = Read-Host "Please enter your Servername"
$Instancename = Read-Host "Please enter your Instancename. For default instance please press enter"
Write-host ""

if ($Instancename -eq ""){
   $ServerInstance = $Servername
   }
Else {
   $ServerInstance = $Servername +"\"+ $InstanceName
}

#Setting up SSRS Target URL. This is the location where your reports would be deployed.
if ($Instancename -eq ""){
   $ReportServerUri = "http://$Servername/ReportServer//ReportService2010.asmx?wsdl"
   $TargetURL = "http://$Servername/Reports"
   }
Else {
   $ReportServerUri = "http://$Servername/ReportServer_$Instancename//ReportService2010.asmx?wsdl"
   $TargetURL = "http://$Servername/Reports_$Instancename"
}

$global:proxy = New-WebServiceProxy -Uri $ReportServerUri -UseDefaultCreden



#We would make use of SQL Server Authentication for the reports shared datasource so you need to supply a username and password.
Write-Host "     SQL Server Authentication:"
$Username = Read-Host "     Username"
$Password = Read-Host -AsSecureString "Password" 


$type = $Proxy.GetType().Namespace
$datatype = ($type + '.Property')

$property =New-Object ($datatype);
$property.Name = “NewFolder”
$property.Value = “NewFolder”

$numproperties = 1
$properties = New-Object ($datatype + '[]')$numproperties 
$properties[0] = $property;

$newFolder = $proxy.CreateFolder("Reports”, “/”, $properties);
$newFolder = $proxy.CreateFolder("Data Sources”, “/”, $properties);

$Children =$proxy.ListChildren("/",$false)
$DBname = 'Your_Database_Name_Here'


# Creating Datasource through powershell
Write-Host "     Creating Datasource ..."
$Name = "Name_Your_Datasource_here"
$Parent = "/Data Sources"
$ConnectString = "data source=$Servername\$Instancename;initial catalog=$DBname"
$type = $Proxy.GetType().Namespace
$DSDdatatype = ($type + '.DataSourceDefinition')
$DSD = new-object ($DSDdatatype)
if($DSD -eq $null){
      Write-Error Failed to create data source definition object
}
$CredentialDataType = ($type + '.CredentialRetrievalEnum')
$Cred = new-object ($CredentialDataType)
$CredEnum = ($CredentialDataType).Integrated
$Cred.value__=1 

$DSD.CredentialRetrieval =$Cred
$DSD.ConnectString = $ConnectString
$DSD.Enabled = $true
$DSD.EnabledSpecified = $false
$DSD.Extension = "SQL"
$DSD.ImpersonateUserSpecified = $false
$DSD.Prompt = $null
$DSD.WindowsCredentials = $false
$DSD.UserName = $Username
$DSD.Password = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($Password))

$newDSD = $proxy.CreateDataSource($Name,$Parent,$true,$DSD,$null)

#Deploying RLD files to Target URL
Write-Host "     Deploying RDL files ..."
$stream = Get-Content 'D:\Your_RDL_path_here.rdl' -Encoding byte
$warnings =@();
$proxy.CreateCatalogItem("Report","Report_Name_here","/Reports",$true,$stream,$null,[ref]$warnings)


#Let's make use of the datasource we just created for your RDL files.
$Items = $global:proxy.listchildren("/Data Sources", $true) 
foreach ($item in $items)
{

$DatasourceName = $item.Name
$DatasourcePath = $item.Path
}


$RDLS = $global:proxy.listchildren("/Reports", $true) 
foreach ($rdl in $rdls)
{
$report = $rdl.path


$rep = $global:proxy.GetItemDataSources($report)
$rep | ForEach-Object {
$proxyNamespace = $_.GetType().Namespace
    $constDatasource = New-Object ("$proxyNamespace.DataSource")
    $constDatasource.Name = $DataSourceName
    $constDatasource.Item = New-Object ("$proxyNamespace.DataSourceReference")
    $constDatasource.Item.Reference = $DataSourcePath

$_.item = $constDatasource.Item
$global:proxy.SetItemDataSources($report, $_)
Write-Host "Changing datasource `"$($_.Name)`" to $($_.Item.Reference)"
}
}

#Open a IE browser to view the report.
$IE=new-object -com internetexplorer.application
$IE.navigate2($TargetURL)
$IE.visible=$true
Write-Host ""     
Write-Host "You may now view the Reports through the open IE browser."
Write-Host -ForegroundColor Green "**STEP COMPLETED!"

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM