为什么Reporting Services在服务帐户更改期间无法导入现有的encryption密钥?

我已经多次更改了SQL Server 2005 Reporting Services的服务帐户,但昨天是第一次遇到令人恐惧的“报表服务器无法解密用于访问…的对称密钥”错误。

该环境是作为默认情况下也具有SQL Server 2000 Standard版本的盒子上的命名实例安装的SQL Server 2005 Enterprise版本。 一切都是32位的。

BOLbuild议我总是使用Reporting Servicesconfigurationpipe理器来进行更改,并且从不必恢复encryption密钥。

但是,这个最近的时间(它将不得不在生产中,不是吗?),服务帐户更改无法导入现有的encryption密钥; 从ReportServerService日志文件:

ReportingServicesService!crypto!b!5/19 / 2009-17:20:37 :: i INFO:将crypto初始化为用户:\ ReportingServicesService!crypto!b!5/19 / 2009-17:导出公钥ReportingServicesService!crypto!b!5/19 / 2009-17:20:37 :: i INFO:执行skuvalidationReportingServicesService!crypto!b!5/19 / 2009-17:20:37 :: i INFO:导入现有的encryption密钥ReportingServicesService!library!b!5/19 / 2009-17:20:37 :: e错误:抛出Microsoft.ReportingServices.Diagnostics.Utilities.ReportServerDisabledException:报表服务器无法解密用于访问敏感的对称密钥或在报表服务器数据库中encryption的数据。 您必须还原备份密钥或删除所有encryption的内容。 检查文档以获取更多信息。 信息:Microsoft.ReportingServices.Diagnostics.Utilities.ReportServerDisabledException:报表服务器无法解密用于访问报表服务器数据库中的敏感或encryption数据的对称密钥。 您必须还原备份密钥或删除所有encryption的内容。 检查文档以获取更多信息。 —> System.Runtime.InteropServices.COMException(0x80090005):错误的数据。 (从HRESULTexception:0x80090005)在System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode,IntPtr errorInfo)

在RSManagedCrypto.RSCrypto.ImportSymmetricKey(Byte [] symKeyBlob)在Microsoft.ReportingServices.Library.ConnectionManager.GetEncryptionKey()—内部exception堆栈跟踪结束—

现在,我是一个很好的小DBA,我有一个以前的encryption密钥的备份,所以我能够很快从这个问题中恢复,但是,我想知道的是,为什么会发生? MS的这篇文章暗示可能会发生 ,但我不喜欢这个完全随机发生的build议。 我已经阅读,现在很遗憾找不到链接,当您通过RSconfigurationpipe理器之外的其他方式(例如SQL Serverconfigurationpipe理器或Windows服务)更改Reporting Services的服务帐户时,build议您定期执行此操作。

所以,我有两个问题:

  1. 为什么如果我按照build议使用RSconfigurationpipe理器会发生这种情况? (但它testing了,他感叹!)
  2. 我应该不确定的是,我目前的encryption密钥不是像通常那样基于机器/当前服务帐户,而是基于以前的服务帐户?

  1. 当您使用不同的服务帐户时,密钥应该失败

报表服务器服务使用对称密钥来访问报表服务器数据库中的encryption数据。 此对称密钥使用与计算机对应的非对称公钥和用于运行报表服务器服务的用户帐户进行encryption。 当您更改用于运行报表服务器服务的用户帐户时,报表服务器不能使用非对称公钥来解密对称密钥。 因此,报表服务器服务不能使用对称密钥从报表服务器数据库访问数据

2。 我只是用你当前的configuration创build一个新的密钥备份