如何使用加密数据部署SSIS项目?

时间:2018-06-25 12:13:47

标签: visual-studio powershell ssis sql-server-data-tools

我们有一个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环境替换,但是会出现上述错误。

我们尝试了所有保护级别:

  • DontSaveSensitive:程序包不能在VS / SSISDB中运行。
  • EncryptSensitiveWithPassword:PowerShell $ folder.DeployProject命令中不支持密码。 Same method as here.

2 个答案:

答案 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"
}