上周业务部门一名同事联系我说希望在DB服务器上启用xp_cmdshell来调bat.
我第一反应就是这绝对不能开啊.当场回绝掉了.(如果这么顺利就不会有这篇博客了...)
后续发生的事情我就不多说了,反正最后确定要开,但是需要控制相应的权限!!
之前没有太多关注这个系统存储过程,所以翻MSDN的说明大概看了一下.
https://msdn.microsoft.com/zh-cn/library/ms175046.aspx
有戏啊~~
可以用某个windows账号来模拟执行cmdshell的系统账号,给这个账号设置相应权限就好了.
于是开搞.
步骤按照官方文档的来就好.
第一步是新增windows账户:
我给的windows账号只给了user角色.由于他们的bat文件需要有执行某个应用程序的权限,而此应用程序需要写入部分文件在磁盘上.
所以给相应的程序和目录都开了执行权限和写入权限(此次特别注意,可以写入的目录千万不能有执行权限,否则很危险...)
windows账号开设完毕后需要配置为服务器代理账户.
第二步配置服务器代理账户:
有2个办法.
第一个办法是执行sql语句:
EXEC sp_xp_cmdshell_proxy_account '**************\**************', '*********************';GO
第二个办法用SSMS进行配置:
第三步,需要将需要执行xp_cmdshell的SQL SERVER账号映射到master库中
USE [master]GOCREATE USER [test] FOR LOGIN [test]GO
第四步,给指定的SQL SERVER账号赋予执行xp_cmdshell的权限
USE [master]GOGRANT EXEC ON xp_cmdshell TO [test]GO
完成后使用test账号连接数据库,执行如下测试代码:
xp_cmdshell 'whoami.exe'GO
显示如下信息表明正常:
更换SQL SERVER账号登陆后执行上述测试代码报错.
最后说一句.
上述工作的前提是你要开启xp_cmdshell(为了安全,sql server 2005之后默认均不开启)
开启方法:
EXEC sp_configure 'show advanced options', 1;GORECONFIGURE;GOEXEC sp_configure 'xp_cmdshell', 1;GORECONFIGURE;GOEXEC sp_configure 'show advanced options', 0;GORECONFIGURE;GO