This回答说:
有一个conversation_id,在两个端点都是一样的。
还有conversation_handle,每个都必须不同 端点。
所以我认为将conversation_id写入会话的每个端点的审计表进行故障排除会很有用。这样,我可以轻松地在每个端点上跟踪给定对话的审核信息。
问题是从哪里拿起conversation_id。我原本以为我可以从sys.conversation_endpoints查找刚发送或接收的消息的conversation_handle。但是,发送和接收消息的数据库用户无权查看sys.conversation_endpoints中的元数据。
我可以通过让用户发送和接收消息数据库所有者来解决这个问题但我不希望出于安全原因。在sys.conversation_endpoints中查看记录所需的最低权限是多少?或者,如何才能读取刚刚发送或接收的消息的conversation_id(来自执行发送或接收的代码,该代码不具有dbo或sysadmin权限)?
修改:我在线阅读了有关Metadata Visibility Configuration的联机文章
元数据的可见性仅限于用户拥有或用户被授予某些权限的安全性
对于诸如sys.tables或sys.procedures之类的目录视图,相当明显的是,用户需要被授予哪些安全性。但是sys.conversation_endpoints中列出的安全性是什么:对话,会话端点?你如何授予他们权限?用户已经拥有开始对话或结束对话的权限,因此我认为它已经拥有足够的对话权限。
答案 0 :(得分:1)
获得它的最佳位置是sys.conversation_endpoints
。
每当您遇到应用程序需要当前用户未拥有的权限的问题时,最佳选择是利用code signing。 SQL Server允许管理员使用证书检查和签署存储过程,并授予签名的权限。这允许用户调用该过程,并且该过程可以访问用户不能直接访问的信息。
有关示例,请参阅signing Activated Procedures。
至于为什么你看不到自己的对话:imho这是一个错误。正在运行sp_helptext 'sys.conversation_endpoints'
会显示已应用的权限过滤器:
CREATE VIEW sys.conversation_endpoints AS
SELECT ce.conversation_handle,
...
FROM sys.conversation_endpoints$ ce
LEFT JOIN sys.syssingleobjrefs f
ON f.depid = ce.service_id
AND f.class = 21
AND f.depsubid = 0 -- SRC_SVCTOQUEUE
WHERE has_access('CO', f.indepid) = 1
该视图显示了用户对该对话框所属服务的队列具有CONTROL访问权限的对话(需要了解syssingleobjrefs
以了解视图条件是什么,但是它是什么转换为)。权限检查应该是RECEIVE
权限,因为这是此服务上BEGIN DIALOG
/ SEND
/ END
条消息所需的权限:
要开始一个对话框,当前用户必须具有队列的RECEIVE权限,才能获得命令的FROM子句中指定的服务和指定合同的REFERENCES权限。 要发送消息,当前用户必须对发送消息的每个服务的队列具有RECEIVE权限。
MSND在END CONVERSATION
权限主题上实际上是错误的,当它说'要结束活动对话时,当前用户必须是对话的所有者,sysadmin固定服务器角色的成员或成员db_owner固定数据库角色'。所需权限与SEND
的权限相同(可以轻松测试)。
可以很容易地说,如果你可以操纵一个安全的(并且SEND,END显然是在操纵对话),那么应该能够看到被操纵的安全的元数据。