SQL 2012 bcp 调用返回 SQLState = 28000。NativeError = 18456 用户登录失败

use*_*032 4 sql-server bcp xp-cmdshell sql-server-2012

I\xe2\x80\x99m 使用调用 xp_cmdshell 的 SQL 存储过程。xp_cmdshell 已启用,并且代理帐户设置为 \xe2\x80\x98vpexporter\xe2\x80\x99。该存储过程旨在将数据文件写入磁盘。

\n\n

该存储过程在 SQL 2005 服务器上时一直在工作。环境已升级到SQL 2012,sproc不再运行。拨打电话的线路是:

\n\n
set @sql1 = \'bcp "SELECT * FROM dbo.udPayrollOutput" queryout "D:\\Repository\\Exports\\\' + @fileunique  -Uvpexporter -Ppassword -c -t,\' \nexec master..xp_cmdshell @sql1\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 SSMS 中运行它会给出以下结果:

\n\n
\n

SQLState = 28000。NativeError = 18456 错误 = [Microsoft][SQL Server\n Native Client 11.0][SQL Server]用户 \xe2\x80\x98vpexporter\xe2\x80\x99 登录失败。

\n
\n\n

我已经尝试过使用 SQL 登录和域帐户进行此操作。两者都返回相同的错误。\xe2\x80\x98vpexporter\xe2\x80\x99 已添加为登录名,并已设置为具有 xp_cmdshell 执行权限的主数据库用户。

\n\n

我觉得 SQL 版本 2012 的 xp_cmdshell 调用方式一定发生了变化,但我在谷歌搜索时还没有发现任何东西。

\n\n

我尝试运行“exec xp_cmdshell \'whoami.exe\'”,它返回\'nt Authority\\network service\',这是 SQL Server 正在运行的帐户。

\n\n

我的理解是,通过使用 \'sp_xp_cmdshell_proxy_account\' 指定命令 shell 代理帐户,它将使用它。我不想授予 xp_cmdshell 对网络服务的执行访问权限。

\n\n
\n\n

我已经取得了一些进展,但仍然陷入困境。最初的错误是由于新环境需要通过在我的查询行中添加“-S ServerName\\InstanceName”来指定 SQL 实例。我现在收到错误:

\n\n
\n

无法启动 \'cvADPTaxCreditExp\' 存储过程。\n 对对象 \'xp_cmdshell\'、数据库 \'mssqlsystemresource\'、架构 \'sys\' 的 EXECUTE 权限被拒绝。

\n
\n\n

我已向代理帐户授予 master 中 xp_cmdshell 的执行权限,但仍然收到此错误。

\n\n
exec sp_xp_cmdshell_proxy_account \'NEWMECHDOM\\vpexporter\', \'password\';\nGRANT EXECUTE ON xp_cmdshell TO [NEWMECHDOM\\vpexporter];\n
Run Code Online (Sandbox Code Playgroud)\n\n

我已经用这个验证过:

\n\n
select  * from  sys.credentials\n
Run Code Online (Sandbox Code Playgroud)\n\n

还有其他地方需要设置安全性吗?

\n

小智 5

bcp.exe我在 SQL Server 2008 R2 计算机上运行的批处理文件中使用时遇到了同样的问题:指定用户/密码-U -P返回“NativeError = 18456”(登录失败),我使用参数“可信连接”解决了这个问题-T

BCP.EXE调用错误 18456 是:

bcp.exe "SELECT * from DWH.BS.flussi.vw_KLINX_Anagrafiche800" queryout %fname% -t";" -c -SLOCALHOST -dMEF -Uxxx -Pyyy
Run Code Online (Sandbox Code Playgroud)

BCP.EXE工作电话是:

bcp.exe "SELECT * from DWH.BS.flussi.vw_KLINX_Anagrafiche800" queryout %fname% -t";" -c -SLOCALHOST -dMEF -Uxxx -Pyyy -T
Run Code Online (Sandbox Code Playgroud)