【问题标题】:SQL xp_cmdshell copy files between serversSQL xp_cmdshell 在服务器之间复制文件
【发布时间】:2012-10-05 07:09:42
【问题描述】:

我正在尝试将特定文件夹中的所有 .zip 移动到另一个文件夹。源文件夹位于另一台服务器上,目前我正在使用

EXECUTE xp_cmdshell 'copy \\server1\e$\ETL\*.zip \\server2\e$\ETL\'
GO

如果我登录到两个服务器,这会起作用,但目标是通过 sql server 作业代理自动化这个过程。我试过了

EXECUTE sp_xp_cmdshell_proxy_account 'domain\useracc','pass'
GO
EXECUTE xp_cmdshell 'copy \\server1\e$\ETL\*.zip \\server2\e$\ETL\'
GO

但我收到以下错误;

执行 sp_xp_cmdshell_proxy_account 时出错。可能的原因:提供的帐户无效或无法创建“##xp_cmdshell_proxy_account##”凭据。错误代码:“0”。

而且也不确定这是否是我的解决方案。请帮助我如何实现这一目标。 server1 上的文件名每天都在更改名称和数量。

【问题讨论】:

    标签: sql sql-server sql-agent-job xp-cmdshell


    【解决方案1】:

    我强烈建议...不要使用 xp_cmdshell。它在您的表面区域打开了大型安全系统,使您容易受到攻击。 xp_cmdshell 应该被禁用!

    相反,如果您想使用服务器代理自动执行此操作,您有 2 个选项。我的偏好是编写一个带有文件系统任务的简单 SSIS 包,并使用服务器代理安排这个包。 SSIS 在这类任务中没有得到充分利用,但实际上非常擅长。

    或者重新编写脚本以使用服务器代理 CmdExec 作业步骤。这不需要启用 xp_cmdshell 并减少攻击面。

    【讨论】:

      【解决方案2】:

      我发现以下内容对我有用;

      1. 在命令提示符下,输入 services.msc,这将打开服务器上所有服务的列表。

      2. 在服务列表中,查找 SQL Server 代理,右键单击 -> 属性。转到登录选项卡

      将登录更改为在两台服务器上都具有访问权限的用户。然后重新编写脚本以使用服务器代理 CmdExec 作业步骤(谢谢 Pete Carter)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多