我们有一个SSIS项目,其中一个软件包正在连接到REST API。我们使用HTTP连接管理器(带有用户名/密码)和脚本组件来打开连接管理器并解析响应。所有软件包的保护级别均为EncryptSensitiveWithUserKey。一切都可以在Visual Studio中运行,并且可以使用“部署向导”部署到SSIS-DB。在SSIS-DB中,我们可以运行该程序包,还可以通过环境更改连接管理器的密码/用户名。
但是,我们无法通过正常的自动化部署来实现此目标:签入TFS并在Powershell脚本中使用VSTS-buildserver。从SSIS-db运行程序包时,我们得到:
无法解密受保护的XML节点“ DTS:Property”,错误0x80070002“系统找不到指定的文件。”。 您可能无权访问此信息。存在密码错误时,会发生此错误。验证是否有正确的密钥。
我们(相信我们)知道SSIS保护级别和加密的工作方式,并且原因很明显:SSIS文件使用用户密钥加密,并且部署向导(由开发人员运行!)使用SSIS解密/重新加密。 -目录密钥。但是构建服务器没有用户密钥,因此解密步骤无效。 但是,我们希望这不会成为问题,因为密码已被SSIS环境替换,但是会出现上述错误。
我们尝试了所有保护级别:
答案 0 :(得分:1)
使用 EncryptSensitiveWithUserKey 模式,您可以尝试在计算机上设置构建/发布代理并将服务帐户更改为您的帐户,然后通过该代理进行部署。
答案 1 :(得分:1)
我现在在使用Azure DevOps和针对 SQL Server 2016 的SSIS DevOps任务时遇到了相同的问题。
我怀疑使用Microsoft.SQLServer.Management.IntegrationServices
程序集的行为与ISDeploymentWizard
可执行文件不同。
我发现此问题仅在敏感的package
参数而不是project
参数中发生,因此一种解决方案是用package
参数替换敏感的project
参数。 / p>
使用目录中的敏感package
参数运行软件包时,会发生此问题,但在某些情况下,作为子软件包执行时,软件包将运行而不会出现问题。
我还发现有些软件包会报告软件包执行成功,但是查看事件消息Failed to decrypt protected XML node "DTS:Property" with error 0x80070002
会出现。
另一种解决方案是execute the ISDeploymentWizard from the command line。这确实要求目标目录文件夹已经存在,因为向导将不会创建它。因此,如果目录文件夹尚不存在,则需要执行此步骤以创建目录文件夹。
下面的PowerShell脚本应适用于 SQL Server 2016 :
### Variables
$targetServer = "localhost"
$targetCatalogFolder = "IsDeploymentWizard"
$sourceFolder = "C:\Users\mhept\source\repos\SsisDeploy\AzureDevOpsSensitiveInChildPackage"
### Ensure Target Catalog Folder Exists
Add-Type -AssemblyName "Microsoft.SQLServer.Management.IntegrationServices, Version=13.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL"
$ssisNamespace = "Microsoft.SqlServer.Management.IntegrationServices"
# Create a connection to the server
$sqlConnectionString = "Data Source=" + $targetServer + ";Initial Catalog=master;Integrated Security=SSPI;"
$sqlConnection = New-Object System.Data.SqlClient.SqlConnection $sqlConnectionString
# Create the Integration Services object
$integrationServices = New-Object $ssisNamespace".IntegrationServices" $sqlConnection
# Get the Integration Services catalog
$catalog = $integrationServices.Catalogs["SSISDB"]
$catalogFolder = $catalog.Folders[$targetCatalogFolder]
if($null -eq $catalogFolder){
# Create the target folder
Write-Host "Creating Catalog Folder $targetCatalogFolder"
$catalogFolder = New-Object $ssisNamespace".CatalogFolder" ($catalog, $targetCatalogFolder, "")
$catalogFolder.Create()
}
$targetCatalogPath = "/SSISDB/$targetCatalogFolder"
$ispacs = Get-ChildItem -Path $sourceFolder -Filter "*.ispac" -Recurse
$isDeploymentWizard = Get-ItemPropertyValue -Path "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\130\SSIS\Setup\DeploymentWizardPath" -Name "(default)"
foreach($ispac in $ispacs) {
$projectName = $ispac.BaseName
$sourcePath = $ispac.FullName
Write-Host "Deploying $projectName ..."
Start-Process -Wait -FilePath $isDeploymentWizard -ArgumentList "/Silent", "/SourceType:File", "/ModelType:Project", "/SourcePath:$sourcePath", "/DestinationServer:$targetServer", "/DestinationPath:$targetCatalogPath/$projectName"
Write-Host "Successfully deployed $projectName"
}