执行PowerShell更新指定数据源凭据后,所有Windows密码失效
问题分析
你的脚本出现问题的核心原因是:Get-RsRestItemDataSource从服务器获取数据源对象时,出于安全考虑不会返回Secret(密码)字段,该字段值为$null。当你将未修改的数据源对象(包含$null的Secret)通过Set-RsRestItemDataSource提交回服务器时,服务器会将对应数据源的密码设置为空,从而覆盖原有有效密码,导致使用Windows认证的非目标数据源(如datasource3)运行失败。
修复后的脚本
# Variables $ReportPortalUri = 'http://blah.co.nz/reports'; $reportFolder = "ReptFolder"; # Create new web session to your Power BI Report portal $session = New-RsRestSession -ReportPortalUri $ReportPortalUri; # Get list of all reports $reports = Get-RsCatalogItems -ReportServerUri $ReportPortalUri -RsFolder "/$($reportFolder)" -Recurse | Where {$_.TypeName -eq 'PowerBIReport'}; # Loop through selected reports ForEach ($report in $reports) { Write-Host "Processing report: $($report.Path)" try { # Get data source object $dataSources = Get-RsRestItemDataSource -WebSession $session -RsItem $report.Path # Update data source object foreach ($dataSource in $dataSources) { switch -Regex ($dataSource.ConnectionString) { 'datasource1' { $dataSource.DataModelDataSource.AuthType = 'Windows' $dataSource.CredentialRetrieval = 'Store' $dataSource.DataModelDataSource.Username = 'win_srv_account1' $dataSource.DataModelDataSource.Secret = '1234' } 'datasource2' { $dataSource.DataModelDataSource.AuthType = 'UsernamePassword' $dataSource.CredentialRetrieval = 'Store' $dataSource.DataModelDataSource.Username = 'sql_srv_account2' $dataSource.DataModelDataSource.Secret = '1234' } default { Write-Host "No matching condition for connection string $($dataSource.ConnectionString). Skipping modification." # 移除Secret属性,避免提交空值覆盖原有密码 if ($dataSource.DataModelDataSource.PSObject.Properties['Secret']) { $dataSource.DataModelDataSource.PSObject.Properties.Remove('Secret') } } } } # Update data source object on server Set-RsRestItemDataSource -WebSession $session -RsItem $report.Path -RsItemType 'PowerBIReport' -DataSources $dataSources } catch { Write-Error "Error processing report $($report.Path): $_" } }
关键修复点
- 在
default分支中移除了数据源对象的Secret属性:提交到服务器时该字段不会被包含,服务器会保留原有密码,而非用空值覆盖 - 优化了日志输出,便于跟踪每个报表和数据源的处理状态
内容的提问来源于stack exchange,提问作者John Kidd
相关产品推荐
相关产品推荐

