从 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
那些具有此安全级别且值得信赖的用户。代理人方法。
创建了一个具有强密码的新域用户帐户,并记下了用户名和密码。确保帐户已启用,并且密码设置为永不过期。
创建了一个新的SQL Server 登录与我们创建的新域用户帐户绑定。
创建了一个新的代理凭证与域用户帐户绑定。
EXEC sp_xp_cmdshell_proxy_account '<Domain>\<NewUser>', '<password>' -- you have to type actual password
当然SQL Server 登录从名为 的数据库明确
EXECUTE
访问系统扩展存储过程。Master
sys.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>]
授予该人使用
EXECUTE AS
模仿允许新的SQL Server 登录。GRANT IMPERSONATE ON LOGIN::[<Domain>\<NewUser>] TO [<Domain>\<UserGrantingExecuteAsUser>]
现在使用以下命令运行以登录身份执行并将
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