如何使用 securityadmin 服务器角色模拟登录名

Die*_*res 2 sql-server permissions t-sql sql-server-2008-r2 impersonation

在 MSSQL 2008R2 上,我在不同的服务器上有两个实例,我需要同步所有登录的密码更改。我认为我可以创建一个存储过程,其中具有 securityadmin 服务器角色的用户(模拟)更改密码。

Obs:CHANGE_PASSWORD 是具有 securityadmin 服务器角色的用户。

ALTER PROCEDURE SPU_CAMBIO_PASSWORD
(
    @USER VARCHAR(50),
    @PASSWORD VARCHAR(100)
)
WITH EXECUTE AS 'CHANGE_PASSWORD'
AS
    DECLARE @STATEMENT VARCHAR(200)
    SET @STATEMENT= 'ALTER LOGIN '+ @USER+ ' WITH PASSWORD = '''+@PASSWORD+''', CHECK_POLICY =OFF'
    EXEC(@STATEMENT)
GO
Run Code Online (Sandbox Code Playgroud)

错误:无法作为服务器主体执行,因为主体“CAMBIO_PASSWORD”不存在,无法模拟此类主体,或者您没有权限。

Sol*_*zky 5

坏消息是与语句相反的EXECUTE AS 子句(您正在使用的)仅适用于用户(数据库级别),而不适用于登录(服务器级别)。

但是,好消息是您不需要使用模拟来解决这个问题。相反,您需要使用模块签名,并通过以下步骤(全部在 中完成[master])执行此操作:

  1. 创建证书(一定要指定ENCRYPTION BY PASSWORD = 'password'
  2. 从该证书创建登录
  3. 授予该登录任何您想要的权限,或将其添加到任何合适的角色
  4. 删除该子句签署该存储过程(即SPU_CAMBIO_PASSWORDEXECUTE AS
  5. 将该证书备份到文件(证书.cer文件和私钥的 .pvk文件)。这样做是为了以后可以重新创建它。
  6. 从该证书中删除私钥。这可以防止其他任何东西用它签名(所以你最好先做备份!)。

如果该存储过程在签名后发生更改,则签名将自动删除,从而失去与为该基于证书的登录设置的那些特殊权限的关联。这是一件好事,因为它允许您在重新启用权限之前进行代码审查(假设您没有进行更改)。在这种情况下,您将:

  1. 恢复私钥(使用与ALTER CERTIFICATE删除私钥相同的命令)。
  2. 签署存储过程
  3. 再次删除私钥