如何才能看到sys.sysprocesses中的所有行而不是SA?

时间:2018-03-26 19:37:04

标签: sql-server

唯一可以看到整个sys.sysprocesses的用户是SA。是否有一个角色我可以将用户(或任何其他方式)置于用户可以成为其成员的位置,以便用户可以查看整个sys.sysprocesses-所有用户的行,而不仅仅是用户执行选择。

我使用dbo帐户连接到许多SQL Server实例。我需要知道是否有人连接到该实例。我无法获得SA特权。

1 个答案:

答案 0 :(得分:2)

您可以使用代码签名来完成您要执行的操作。这是代码:

CREATE LOGIN [normalUser] WITH password = 'f00bar!23'
CREATE USER [normalUser]
GO
CREATE CERTIFICATE [codeSigningCert] WITH SUBJECT = 'Certificate for code signing', EXPIRY_DATE = '2099-01-01'
CREATE LOGIN [codeSigningLogin] FROM CERTIFICATE [codeSigningCert]
GRANT VIEW SERVER STATE TO [codeSigningLogin]
go
CREATE PROCEDURE dbo.processesProc
AS
BEGIN
    SELECT *
    FROM sys.sysprocesses AS s
END
GO
GRANT EXECUTE ON dbo.processesProc TO [normalUser]
GO
EXECUTE AS LOGIN = 'normalUser'
GO
EXEC dbo.processesProc
GO
REVERT
GO
ADD SIGNATURE TO processesProc BY CERTIFICATE [codeSigningCert]
GO
GRANT EXECUTE ON dbo.processesProc TO [normalUser]
GO
EXECUTE AS LOGIN = 'normalUser'
GO
EXEC dbo.processesProc
GO
REVERT
GO

作为解释,我正在创建一个无特权的登录/用户和一个存储过程供他们运行。如果没有签署过程,select会显示正常行为(也就是说,它只显示当前进程。但是一旦我使用具有相应登录权限的证书向过程添加签名,结果集就会开始。< / p>

注意:我在master创建了这个程序,因为我很懒。您可以在任何您想要的位置创建过程,只要证书存在于您正在创建过程的数据库中(因此您可以添加签名)。最后,代码签名的一个问题是修改过程时签名丢失了。这是有道理的,因为签名是签署时proc的内容的证明。如果身体发生变化,则需要重新签名。