【问题标题】:Getting a CLR stored procedure activated by a broker queue to run as the database owner让代理队列激活的 CLR 存储过程以数据库所有者身份运行
【发布时间】:2013-04-23 06:31:41
【问题描述】:

我正在尝试设置从服务代理队列运行的 CLR 存储过程,以便 CLR 存储过程作为数据库所有者运行。

我已经尝试了各种组合,但如果不以用户身份(使用用户名和密码)登录 CLR 存储过程,则无法使其工作。

CLR 存储过程正在访问文件系统,我只希望它能够访问拥有数据库的 Windows 用户允许的文件夹。

【问题讨论】:

  • 你不能只使用 EXECUTE AS OWNER 吗?抱歉,服务代理和 CLR 存储过程不是我的强项。
  • 是的,我就是这样,数据库归 Windows 域用户所有,我的理解是激活的存储过程作为 dbo 运行。
  • Microsoft 自己的文档Impersonation and Credentials for Connections 包含处理在 CLR 存储过程中获取文件详细信息的示例代码。

标签: sql-server filesystems impersonation sqlclr service-broker


【解决方案1】:

如果不向 Windows 提供密码,您将永远无法访问 SQL Server 之外的资源。 EXECUTE AS 仅在引擎内部受信任,Windows(以及因此文件系统)完全有零理由信任这种模拟骗局。

SQL 中有一种特殊的结构可以促进操作系统级别的模拟:CREATE CREDENTIAL,但它们仅在将 SQL 登录映射到 Windows 登录时才有效。由于在您的情况下没有 SQL 登录开始,我不确定您是否可以让 SQL Server 凭据工作。

【讨论】:

  • 因为这是一个 CLR 存储过程,所以还有 WindowsIdentityWindowsImpersonationContext 等。实际上你甚至可以调用 LogonUser,虽然它不是首选的解决方案。
  • @joshuadrake LogonUser 的问题是存储密码。
  • 我觉得你回答的语气在“无法完成”阵营中过于强烈,因为Impersonation and Credentials for Connections的Microsoft示例显示了文件系统的访问权限,我认为这是外部资源SQL Server,没有密码或创建凭据调用。
  • MSDN 中的示例处理模拟调用者,这是一个非常不同的事情。上下文可以一直跟踪到原始 NT 用户登录到它的 Windows 会话,它已经提供了密码。在 SSB 激活的上下文中,此链不存在,因为 SSB 激活的上下文会话是由引擎启动的后台会话。因此,他们需要调用 LogonUser 来创建 NT 上下文,这会造成访问帐户密码的(非常重要的)问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-25
  • 1970-01-01
  • 2016-07-26
  • 2016-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多