我有一个客户端对xp_regread(尝试查找数据库路径)的调用有“拒绝访问权限”,但我似乎无法重现这一点。我试过运行以下
REVOKE execute on xp_regread to public
但它仍然有效。我还发现了一些关于SQL Server 2000问题的文章(http://support.microsoft.com/kb/887165),但客户端服务器是2005年。有关如何解决此问题的任何想法。
编辑:我尝试了以下
USE MASTER
GO
REVOKE execute on xp_regread to public
GO
DECLARE @InstanceName nvarchar( 128 )
SET @InstanceName = ISNULL( CONVERT( nvarchar( 128 ), SERVERPROPERTY( 'InstanceName' ) ), N'MSSQLSERVER' )
DECLARE @InstanceKey nvarchar( 128 )
EXECUTE master.dbo.xp_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\Microsoft SQL Server\Instance Names\SQL\', @InstanceName, @InstanceKey OUTPUT
print @InstanceName
print @InstanceKey
但它仍然有效。要清楚,我正在尝试重现呼叫不起作用的问题。撤销权限是我应该阅读的一种方式,但它仍适用于我。
答案 0 :(得分:2)
这是一个扩展存储过程,所以需要
EXEC master..xp_regread ...
然后,它将是
USE master
GO
GRANT EXECUTE ON xp_regread TO public
GO
如果已设置显式DENY,则REVOKE将删除它。这与GRANT不同。这仅适用于普通用户。
拥有sysadmin权限或master中的db_owner(sa是master中的dbo)的任何人都将绕过权限
答案 1 :(得分:1)
您应该明确DENY
权限:
GRANT DENY ON xp_regread TO XYuser.
但要小心,以后可能会引起问题。就像SSMS中的备份对话框不适用于那个人。
答案 2 :(得分:0)
要重现此问题,首先必须在两个不同的错误之间做出改变:“访问被拒绝。”并且'EXECUTE权限被拒绝'。
第一个错误是由于非sysadmin用户的配置问题。第二个原因是由于缺乏对扩展程序的执行权限。