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

时间:2015-04-13 17:39:50

标签: sql-server sql-server-2012 bcp xp-cmdshell

我正在使用一个调用xp_cmdshell的SQL存储过程。 xp_cmdshell已启用,并且代理帐户已设置为“vpexporter”。这个sproc旨在将数据文件写入磁盘。

这个sproc在SQL 2005服务器上运行时一直在工作。环境已升级到SQL 2012,并且sproc不再运行。拨打电话的线路是:

set @sql1 = 'bcp "SELECT * FROM dbo.udPayrollOutput" queryout "D:\Repository\Exports\' + @fileunique  -Uvpexporter -Ppassword -c -t,' 
exec master..xp_cmdshell @sql1

在SSMS中运行它给我以下内容:

  

SQLState = 28000. NativeError = 18456错误= [Microsoft] [SQL Server   Native Client 11.0] [SQL Server]用户'vpexporter'登录失败。

我已尝试使用SQL登录和域帐户。两者都返回相同的错误。 'vpexporter'已添加为登录名,并已设置为具有xp_cmdshell执行权限的主数据库的用户。

我觉得在使用SQL版本2012调用xp_cmdshell的方式上肯定会有所改变,但在google搜索时我没有找到任何内容。

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

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


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

  

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

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

exec sp_xp_cmdshell_proxy_account 'NEWMECHDOM\vpexporter', 'password';
GRANT EXECUTE ON xp_cmdshell TO [NEWMECHDOM\vpexporter];

我已用此验证:

select  * from  sys.credentials

是否需要设置其他安全措施?

2 个答案:

答案 0 :(得分:3)

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

-T调用WITH ERROR 18456是:

BCP.EXE

bcp.exe "SELECT * from DWH.BS.flussi.vw_KLINX_Anagrafiche800" queryout %fname% -t";" -c -SLOCALHOST -dMEF -Uxxx -Pyyy 工作电话是:

BCP.EXE

答案 1 :(得分:0)

我发现2008年与2012年不同。2008年我不需要指定服务器名称。在2008年,我也可以使用D $使用驱动器号,但现在我需要使用共享驱动器名称。以下内容适用于2012年。

-- Declare report variables
DECLARE @REPORT_DIR VARCHAR(4000)
DECLARE @REPORT_FILE VARCHAR(100)
DECLARE @DATETIME_STAMP VARCHAR(14)
DECLARE @Statement VARCHAR(4000)
DECLARE @Command VARCHAR(4000)

--SET variables for the Report File
SET @DATETIME_STAMP = (SELECT CONVERT(VARCHAR(10), GETDATE(), 112) + 
REPLACE(CONVERT(VARCHAR(8), GETDATE(),108),':','')) -- Date Time Stamp with YYYYMMDDHHMMSS
SET @REPORT_DIR = '\\aServerName\SharedDirectory\' -- Setting where to send the report. The Server name and a Shared name, not a drive letter
SET @REPORT_FILE = @REPORT_DIR + 'Tables_' + @DATETIME_STAMP + '.csv' --the -t below is used for the csv file

- 使用所有数据创建CSV文件报告。必须使用@Statement变量在xp_cmdshell命令中使用变量。

SET @Statement = '"SELECT * FROM  sys.tables" queryout "'+@REPORT_FILE+'" -c -t"," -r"\n" -S"CurrentServerName\Databasename" -T' --The -S must be used with the -T
SET @Command = 'bcp '+@Statement+' '
EXEC master..xp_cmdshell @Command