净止损系统错误 5 访问被拒绝

净止损系统错误 5 访问被拒绝

从 SQL Server 2012 我尝试执行以下操作:

DECLARE @COMMAND nvarchar(4000)
SET @COMMAND = 'net stop <servicename>'
exec master.dbo.xp_cmdshell @COMMAND

我收到系统错误 5 和拒绝访问作为响应

服务帐户(已用 检查whoami)已添加到管理员,那么还有什么问题呢?

答案1

以管理员身份运行 SQL Server 2012,问题就会消失。

答案2

xp_cmdshell允许非系统管理员用户从 SSMS执行

我帮助解决了一个问题,我们需要授予应用程序开发人员xp_cmdshell从 SSMS 会话中执行的权限,而不是“运行身份“ 从SQL 代理作业在非关键开发服务器上,而无需让他成为 SQL Server 实例上的系统管理员。

我们做了什么

笔记:域用户账户可以用工作组账户、本地机器账户等代替。

重要的:您需要了解允许您环境中的用户执行操作系统级别命令的风险,并且您应该只将此级别的权限授予xp_cmdshell那些具有此安全级别且值得信赖的用户。代理人方法。

  1. 创建了一个具有强密码的新域用户帐户,并记下了用户名和密码。确保帐户已启用,并且密码设置为永不过期。

  2. 创建了一个新的SQL Server 登录与我们创建的新域用户帐户绑定。

  3. 创建了一个新的代理凭证与域用户帐户绑定。

    EXEC sp_xp_cmdshell_proxy_account '<Domain>\<NewUser>', '<password>' -- you have to type actual password
    
  4. 当然SQL Server 登录从名为 的数据库明确EXECUTE访问系统扩展存储过程。Mastersys.xp_cmdshell

    --see who all has execute access to xp_cmdshell   
    Use master                      
    EXEC sp_helprotect 'xp_cmdshell'
    
    
    -- To allow advanced options to be changed.
    EXEC sp_configure 'show advanced options', 1
    RECONFIGURE
    GO
    
    -- Enable the xp_cmdshell procedure
    EXEC sp_configure 'xp_cmdshell', 1
    RECONFIGURE
    GO
    
    -- Grant execute permissions to account
    GRANT EXECUTE ON xp_cmdshell TO [<Domain>\<NewUser>]
    
  5. 授予该人使用EXECUTE AS 模仿允许新的SQL Server 登录

    GRANT IMPERSONATE ON LOGIN::[<Domain>\<NewUser>] TO [<Domain>\<UserGrantingExecuteAsUser>]
    
  6. 现在使用以下命令运行以登录身份执行并将net stop命令传递给xp_cmdshell存储过程。上面步骤 #5 中列出的安全主体应该<Domain>\<UserGrantingExecuteAsUser>是您为此任务运行 SSMS 作为安全上下文的人员的安全主体。

    EXECUTE AS LOGIN = '<Domain>\<NewUser>'
    DECLARE @COMMAND nvarchar(4000)
    SET @COMMAND = 'net stop <servicename>'
    EXEC xp_cmdshell @COMMAND
    REVERT
    

更多资源

相关内容