使用sqlcmd命令将结果获取到具有用户名和密码保护的共享路径中的文件

时间:2013-10-08 08:54:35

标签: sql sql-server-2008 sqlcmd

我有一个sqlcmd命令,它会将结果提供给一个放在共享文件夹中的文件。

exec xp_cmdshell 'sqlcmd -s $dataSource -d $dbName -i $inputFilePath -o $outputFilePath'

现在,如果共享驱动器受到保护并需要用户名和密码,该怎么办? 如何在Sqlcmd中提供凭证以绕过身份验证。

1 个答案:

答案 0 :(得分:1)

xp_cmdshell将在NT(Windows)凭据下执行:

  • 使用Windows凭据登录时模拟登录
  • 服务帐户(如果使用SQL凭据登录,并且不存在明确的凭据对象)
  • 使用与凭据关联的SQL凭据登录显式凭据(请参阅CREATE CREDENTIAL

如果你坚持使用默认上下文访问远程资源(文件共享),那么你就是没有桨的上坡shitcreek,因为模拟对远程资源的访问是“双跳”并且需要constrained delegation为其中一个案例(使用NT登录)。

更好的选择是在本地将远程共享\\server\share明确映射为驱动器X:,然后再访问驱动器X:。在本地映射驱动器允许存储持久凭据,但您必须小心确保映射在服务帐户会话中可见。哪个......基本上不可能,请参阅Map a network drive to be used by a service

既然你知道为什么你不能正确地做到这一点并且你会自己拉扯自己的头发,同时变得白皙,不断努力解决失败问题,退后一步从不同角度看问题:为什么你想使用xp_cmdshell来致电sqlcmd?从作业/流程直接致电sqlcmd。 SQL Agent具有您需要的所有支持,只需将作业设置为在具有适当凭据的代理帐户下运行即可连接远程共享和目标$datasource