我正在处理一个SQL存储过程,该存储过程调用了xp_cmdshell。 xp_cmdshell已启用,并且代理帐户设置为“vpexporter”。此存储过程旨在将数据文件写入磁盘。
在SQL 2005服务器上,这个存储过程可以正常运行。但现在环境已经升级到SQL 2012,该存储过程无法运行。造成问题的那一行代码是:
在SSMS中运行此命令会导致以下结果:
SQL状态 = 28000。本机错误 = 18456 错误 = [Microsoft][SQL Server Native Client 11.0][SQL Server]Login failed for user ‘vpexporter’。
我已经尝试了使用SQL登录和域账户进行操作,但是两者都返回相同的错误。'vpexporter'已被添加为登录用户,并且作为主数据库的用户设置,具有对xp_cmdshell执行权限。
我感觉在SQL 2012版本中调用xp_cmdshell方式发生了变化,但是我在谷歌上没有找到任何信息。
我尝试运行“exec xp_cmdshell 'whoami.exe'”,它返回“nt authority\network service”,这是SQL Server正在其中运行的账户。
我的理解是,通过使用'sp_xp_cmdshell_proxy_account'指定一个命令行代理帐户来替换该代理帐户。我不想授予Network Service对xp_cmdshell的执行权限。
我已经取得了一些进展但仍然卡住了。由于新环境需要通过在查询行中添加“-S ServerName\InstanceName”来指定SQL实例,因此最初的错误是由此引起的。现在我收到错误消息:
无法启动 'cvADPTaxCreditExp' 存储过程。 拒绝在对象 'xp_cmdshell' 上执行权限,数据库 'mssqlsystemresource',架构 'sys'。
我已经授予了xp_cmdshell在主数据库中的代理帐户执行权限,但仍然收到此错误。
在SQL 2005服务器上,这个存储过程可以正常运行。但现在环境已经升级到SQL 2012,该存储过程无法运行。造成问题的那一行代码是:
set @sql1 = 'bcp "SELECT * FROM dbo.udPayrollOutput" queryout "D:\Repository\Exports\' + @fileunique -Uvpexporter -Ppassword -c -t,'
exec master..xp_cmdshell @sql1
在SSMS中运行此命令会导致以下结果:
SQL状态 = 28000。本机错误 = 18456 错误 = [Microsoft][SQL Server Native Client 11.0][SQL Server]Login failed for user ‘vpexporter’。
我已经尝试了使用SQL登录和域账户进行操作,但是两者都返回相同的错误。'vpexporter'已被添加为登录用户,并且作为主数据库的用户设置,具有对xp_cmdshell执行权限。
我感觉在SQL 2012版本中调用xp_cmdshell方式发生了变化,但是我在谷歌上没有找到任何信息。
我尝试运行“exec xp_cmdshell 'whoami.exe'”,它返回“nt authority\network service”,这是SQL Server正在其中运行的账户。
我的理解是,通过使用'sp_xp_cmdshell_proxy_account'指定一个命令行代理帐户来替换该代理帐户。我不想授予Network Service对xp_cmdshell的执行权限。
我已经取得了一些进展但仍然卡住了。由于新环境需要通过在查询行中添加“-S ServerName\InstanceName”来指定SQL实例,因此最初的错误是由此引起的。现在我收到错误消息:
无法启动 'cvADPTaxCreditExp' 存储过程。 拒绝在对象 'xp_cmdshell' 上执行权限,数据库 'mssqlsystemresource',架构 'sys'。
我已经授予了xp_cmdshell在主数据库中的代理帐户执行权限,但仍然收到此错误。
exec sp_xp_cmdshell_proxy_account 'NEWMECHDOM\vpexporter', 'password';
GRANT EXECUTE ON xp_cmdshell TO [NEWMECHDOM\vpexporter];
我已经通过以下方式进行验证:
select * from sys.credentials
安全性是否需要在其他地方进行设置?
xp_cmdshell 'whoami.exe'
;它是否返回你所期望的内容? - MackanEXEC sp_xp_cmdshell_proxy_account 'DOMAIN\user','password'
。如果通过sysadmin帐户运行,xp_cmdshell将使用服务帐户来生成子进程。 - Mackan