本文可帮助你解决在电子邮件订阅传递期间可能会遇到 AuthzInitializeContextFromSid
API 函数调用的问题。
原始产品版本:SQL Server
原始 KB 数: 842423
总结
本文讨论在尝试使用域用户帐户创建和处理电子邮件订阅时,SQL Server Reporting Services 中MICROSOFT SQL Server Reporting Services 和 Power BI 报表服务器 中可能出现的问题的原因和一些可能的解决方案。 当Authz.dll文件中的 AuthzInitializeContextFromSid
API 函数调用不成功时,会出现此问题。
注意
此问题不会出现在 Windows Server 2008 中。
本文中讨论的解决方案如下所示:
如何将 Reporting Services Windows 服务配置为在域用户帐户下运行。 如果这不能解决问题,还必须使用以下方法之一:
- 授予针对所有用户帐户和域组的域用户帐户的读取权限。
- 授予特定于用户帐户或用户所属组的域用户帐户的读取权限。
简介
本文讨论与在电子邮件订阅传递期间发生的 API 函数调用相关的 AuthzInitializeContextFromSid
问题。 本文还讨论了该问题的一些可能解决方法。
详细信息
在为电子邮件订阅传送电子邮件时,Reporting Services 程序可能会调用 AuthzInitializeContextFromSid
在Authz.dll文件中定义的 API 函数。 如果以下条件之一为 true,Reporting AuthzInitializeContextFromSid
Services 程序可能会调用 API 函数:
- 电子邮件中嵌入了报表。
- 报表附加到电子邮件。
如果使用不同于 Reporting Services Windows 服务服务登录帐户的域用户帐户创建和处理电子邮件订阅, AuthzInitializeContextFromSid
API 函数调用可能会失败。
如果函数调用失败,可能需要在运行 Reporting Services 的计算机的域中配置设置才能解决问题。
Reporting Services 计划调用 AuthzInitializeContextFromSid
API 函数来验证用于创建订阅的用户帐户是否仍具有查看报表的正确权限。 当电子邮件仅包含指向报表的链接(URL)时,不需要进行此验证,因为当用户尝试使用 URL 访问报表时,Reporting Services 会执行用户权限验证。
AuthzInitializeContextFromSid
API 函数调用读取 API 函数调用中指定的AuthzInitializeContextFromSid
安全标识号 (SID) 的 tokenGroupsGlobalAndUniversal (TGGAU) 属性,以确定当前用户的 Windows 组成员身份信息。 Reporting Services 使用 Reporting Services Windows 服务服务服务登录帐户的安全上下文调用 AuthzInitializeContextFromSid
API 函数。 因此,用于运行 Reporting Services Windows 服务的用户帐户必须具有足够的权限,才能读取 TGGAU
用于创建和处理电子邮件订阅的用户帐户的属性。
如果计算机未正确配置为访问并在Authz.dll文件中运行 AuthzInitializeContextFromSid
API 函数调用,可能会收到错误消息。 此外,可能会将错误消息写入 Reporting Services 日志文件。 若要确定发生错误,请执行以下步骤:
打开ReportServerService_ 时间戳.log文件。 搜索 authz 一词。
注意
默认情况下,ReportServerService_ Timestamp.log 文件位于 .
<Installation drive>:\Program Files\Microsoft SQL Server\<InstanceOfSQLServer>\Reporting Services\Logfiles folder
在 ReportServerService_ Timestamp.log 文件中,你可能会注意到类似于以下内容的错误消息:
错误消息 1
ReportingServicesService!library!718!06/16/2004-00:00:03:: e ERROR: Throwing Microsoft.ReportingServices.Diagnostics.Utilities.ServerConfigurationErrorException:报表服务器遇到了配置错误;日志文件中的更多详细信息,AuthzInitializeContextFromSid: Win32 错误:5;可能的原因 - 服务帐户无权检查域用户 SID。;信息:Microsoft.ReportingServices.Diagnostics.Utilities.ServerConfigurationErrorException:报表服务器遇到配置错误;日志文件中的更多详细信息。
错误消息 2
ReportingServicesService!library!7e4!05/24/2004-10:00:22:: e ERROR: Throwing Microsoft.ReportingServices.Diagnostics.Utilities.ServerConfigurationErrorException:报表服务器遇到了配置错误;日志文件中的更多详细信息,AuthzInitializeContextFromSid: Win32 错误:1722;信息:Microsoft.ReportingServices.Diagnostics.Utilities.ServerConfigurationErrorException:报表服务器遇到配置错误;日志文件中的更多详细信息。
修改导致错误消息的电子邮件订阅。 不要在电子邮件中嵌入或附加报表。 使用指向报表的链接。 处理修改后的订阅后,如果未收到错误消息,可以确认发生错误是因为
AuthzInitializeContextFromSid
API 函数调用失败。
若要解决此问题,请使用以下方法之一。
如果满足以下条件,可以使用方法 1:
- Reporting Services Windows 服务在网络服务帐户下运行。
- 你不希望更改 Reporting Services Windows 服务正在其下运行的帐户。 可以使用方法 2 进行常规解析。 如果方法 2 无法解决问题,请使用方法 3。
方法 1
- 使用 Active Directory 用户和计算机 管理单元将 Windows 帐户添加到预 Windows 2000 兼容性访问组。
- 使用Active Directory 用户和计算机管理单元将 Windows 帐户添加到 Windows 授权访问组。
- 重启运行 Reporting Services 的计算机。
注意
- 步骤 1 和步骤 2 中的 Windows 帐户是用于运行 Reporting Services 的帐户。
- 将帐户添加到这些组后,可以保证 Reporting Services 可以访问 TGGAU 属性。
- 此方法不要求修改任何用户或组的权限。
方法 2
将 Reporting Services Windows 服务配置为在域用户帐户下运行。
注意
尝试更改用于运行 Reporting Services Windows 服务的用户帐户时,可能会向 Reporting Services 跟踪日志写入错误消息。
方法 3
在运行 Reporting Services 的计算机的域中配置设置。 为此,请使用下列方法之一。
授予对所有用户帐户和域中所有组的读取权限
可以通过授予用于运行 Reporting Services Windows 服务的用户帐户的读取权限来读取 TGGAU
域中所有用户帐户和所有组的属性,从而解决此问题。 为此,请使用以下部分之一中的信息,具体取决于所使用的操作系统。
对于 Microsoft Windows 2000 域
如果域处于 Windows 2000 之前的兼容性访问模式,则 EVERYONE 组对所有用户帐户和所有组的属性具有读取权限 TGGAU
。 因此,用于运行 Reporting Services Windows 服务的用户帐户有权访问 TGGAU
Reporting Services 用于创建电子邮件订阅的用户帐户上的属性。
如果域不在 Windows 2000 之前的兼容性访问模式(也称为本机模式)中,则必须授予用于运行 Reporting Services Windows 服务的用户帐户的读取权限,以便它可以读取 TGGAU
Reporting Services 用于创建订阅的用户帐户的属性。 可以创建一个域本地组来模拟 Windows 2000 之前的兼容性组,将用于运行 Reporting Services Windows 服务的用户帐户添加到此组,然后授予针对所有用户帐户的组的读取权限。 为此,请按照下列步骤进行操作:
注意
你必须对域具有管理员权限才能执行以下步骤。
- 单击“开始”,依次指向“程序”、“管理工具”,然后单击“Active Directory 用户和计算机”。
- 在Active Directory 用户和计算机窗口中的左窗格中,展开 DomainName。
- 右键单击“用户”,指向“新建”,然后单击“组”。
- 在 “新建对象 - 组 ”对话框中,在 “组名称 ”框中键入 MyAuthZGrp。
- 在“组范围”下,选择“域本地”选项,然后单击“确定”。 MyAuthZGrp 组可能显示在右窗格中。
- 在Active Directory 用户和计算机窗口的左窗格中,右键单击“用户”文件夹,然后单击“属性”。
- 在 “用户属性 ”对话框中,单击“ 安全 ”选项卡。
- 单击“添加” 。
- 在 “选择用户、计算机或组 ”对话框中,选择在步骤 5 中创建的组。
- 单击“添加”,然后单击“确定”。
- 向在步骤 9 中选择的用户帐户授予 “读取 ”权限。
对于 Microsoft Windows Server 2003 域
如果域处于 Windows 2000 功能级别,则 EVERYONE 组对所有用户帐户和组的 TGGAU 属性具有读取权限。 因此,Reporting Service 服务帐户对创建电子邮件订阅的用户帐户具有正确的权限。
如果域处于 Windows Server 2003 功能级别,则 Windows 授权访问组(WAA 组)对所有用户帐户和组的 TGGAU 属性具有读取权限。 因此,如果将 Reporting Services 服务帐户添加到 WAA 组,Reporting Services 服务帐户对可以创建电子邮件订阅的用户帐户的 TGGAU 属性具有读取权限。
若要将 Reporting Services 服务帐户添加到 WAA 组,请执行以下步骤:
- 在域控制器上,单击“开始”,指向“程序”,指向“管理工具”,然后单击“Active Directory 用户和计算机”。
- 在Active Directory 用户和计算机窗口中,展开 DomainName,然后单击“用户”或其他适当的组织单位(OU)。
- 双击 Reporting Services 服务帐户。
- 在 “属性 ”对话框中,单击“ 成员成员 ”选项卡。
- 在“隶属于”选项卡上,单击“添加”。
- 在“选择组”对话框中,在“输入要选择的对象名称”下键入 Windows 授权访问组,然后单击“确定”。
- 重新启动 Reporting Services 服务。
向可创建 Reporting Services 订阅的特定用户帐户或组授予读取权限
你可能不希望向所有用户帐户和组的 TGGAU 属性授予读取权限。 相反,你可能想要向特定用户帐户或组的 TGGAU 属性授予读取权限。
注意
- Reporting Services 用于运行订阅的用户帐户是创建订阅时登录到报表管理器的 Windows 用户帐户。
- 如果 Reporting Services 服务帐户位于 WAA 组中,则不需要执行这些步骤。
- 必须针对可在 Reporting Services 中创建电子邮件订阅的每个用户帐户或组执行这些步骤。
若要向 TGGAU
特定用户帐户或组的属性授予读取权限,请执行以下步骤:
- 在域控制器上,单击“开始”,指向“程序”,指向“管理工具”,然后单击“Active Directory 用户和计算机”。
- 在 “视图 ”菜单上,确保 已选择“高级功能 ”项。
- 双击可创建 Reporting Services 订阅的用户帐户或组。
- 在 “属性 ”对话框中,单击“ 安全 ”选项卡。
- 在“安全”选项卡上,单击“添加”。
- 在“选择用户、计算机或组”对话框中,键入“输入要选择的对象名称”下的 Reporting Services 服务帐户,然后单击“确定”。
- 在“属性”对话框中,单击在“组”或“用户名”下的步骤 6 中添加的用户帐户。
- 在“权限 forUser”下,单击以选中“读取权限”旁边的“允许”复选框,然后单击“确定”。
注意
这些更改可能不会立即生效。
如何在计算机上配置域设置
域的配置取决于Microsoft Windows 域的操作模式。 此外,还必须在 Windows 域中启用高级功能。 若要在域控制器上查找域操作模式并打开高级功能,请执行以下步骤:
- 单击“开始”,依次指向“程序”、“管理工具”,然后单击“Active Directory 用户和计算机”。
- 在Active Directory 用户和计算机窗口中,在左窗格中,右键单击 DomainName,然后单击“属性”。
- 在“域名称属性”对话框中,请参阅“常规”选项卡上的“域操作模式”文本框。
“ 域操作模式 ”文本框显示域当前正在使用的域操作模式。 4. 在Active Directory 用户和计算机窗口的左窗格中,单击 DomainName。 5. 在 “视图 ”菜单上,单击“ 高级功能”。 有关需要访问用户帐户授权的 API 的详细信息,请参阅 某些应用程序和 API 需要访问有关帐户对象的授权信息。