【问题标题】:SSIS: Accessing a network drive using a different username and passwordSSIS:使用不同的用户名和密码访问网络驱动器
【发布时间】:2010-11-23 17:05:30
【问题描述】:

有没有办法连接到需要与运行软件包的用户的用户名/密码不同的用户名/密码的网络驱动器?

我需要从远程服务器复制文件。现在我在 Windows 资源管理器中映射网络驱动器,然后执行文件系统任务。然而,最终这个包会自动从不同的机器上运行,并且需要自己映射网络驱动器。这可能吗?

【问题讨论】:

  • 为什么不能只为运行包的用户或进程授予必要的权限?如果你解释为什么你有这个限制,你可能会得到一个更好的答案。与此同时,NET USE 呢?
  • 我们将以具有权限的用户身份运行它。问题是它是 AS400 上的映射驱动器,我们通常使用一个包含 10 个以上字符和名称中的下划线的帐户运行所有作业——这在 AS400 上不受支持。为了一致性起见,我们希望使用同一个帐户运行此作业,并仅使用另一个帐户上的 400 进行身份验证......但我们认为这不值得,所以可能会放弃...... .

标签: ssis


【解决方案1】:

您可以通过“net use”命令使用执行进程任务来创建映射驱动器。以下是应如何设置任务的属性:

可执行文件: net

参数: 使用 \Server\SomeShare YourPassword /user:Domain\YourUser

执行过程之后的任何文件系统任务都可以访问这些文件。

替代方法

Sql Server Select Article 详细介绍了这些步骤,但基本内容如下:

1)创建一个“执行进程任务”来映射网络驱动器(这个映射到z:)

Executable: cmd.exe
Arguments: /c "NET USE Z: "\\servername\shareddrivename" /user:mydomain\myusername mypassword"

2) 然后运行“文件系统任务”来执行复制。请记住,目标“平面文件连接”必须将“DelayValidation”设置为 True,因为 z:\suchandsuch.csv 在设计时不存在。

3) 最后,当您完成另一个“执行进程任务”时,取消映射驱动器

Executable: cmd.exe
Arguments: /c "NET USE Z: /delete"

【讨论】:

  • 感谢@Valentino Vranken!你的解决方案救了我,但我更新了你的答案,加入了我在使用你的答案后找到的相关文章。
  • 感谢@Valentino 就像一个魅力。只在结束指令/yes参数/c "NET USE Z: /delete /yes"添加强制断开
  • 我尝试从命令提示符映射网络驱动器时出错。错误说,“文件名、目录或卷标语法不正确”
  • 这可以在带有EXEC master..xp_cmdshell @myCmd;的存储过程中完成吗?
  • 这确实可以在存储过程中完成,但是就像执行过程一样,任务必须完成;您必须编写 3 个单独的程序,第二个使用映射驱动器。另外,SQL Server 无法在新驱动器上执行数据库操作,但您可以先将文件移动到网络上的文件夹中。
【解决方案2】:

为什么不使用 FTP 任务将文件 GET 到本地计算机?在本地机器上运行 SSIS。使用 FTP 进行二进制传输时,速度非常快。请记住,SSIS 的 ROW 分隔符应该是 LF,而不是 CRLF,因为二进制 FTP 不会将 LF (unix) 转换为 CRLF (windows)

【讨论】:

    【解决方案3】:

    您必须映射网络驱动器,这是我现在正在使用的示例:

        profile = "false"
        landingPadDir = Dts.Variables("strLandingPadDir").Value.ToString
        resultsDir = Dts.Variables("strResultsDir").Value.ToString
        user = Dts.Variables("strUserName").Value.ToString
        pass = Dts.Variables("strPassword").Value.ToString
        driveLetter = Dts.Variables("strDriveLetter").Value.ToString
    
        objNetwork = CreateObject("WScript.Network")
        CheckDrive = objNetwork.EnumNetworkDrives()
    
        If CheckDrive.Count > 0 Then
            For intcount = 0 To CheckDrive.Count - 1 Step 2 'if drive is already mapped, then disconnect it
                If CheckDrive.Item(intcount) = driveLetter Then
                    objNetwork.RemoveNetworkDrive(driveLetter)
                End If
            Next
        End If
    
        objNetwork.MapNetworkDrive(driveLetter, landingPadDir, profile, user, pass)
    

    从那里只需使用该 driveLetter 并通过映射的驱动器访问文件。

    我遇到了一个问题(导致我来到这里),该脚本访问两个共享驱动器并在驱动器之间执行一些复制/移动操作,我从 SSIS 收到一条错误消息:

    This network connection has files open or requests pending.
       at Microsoft.VisualBasic.CompilerServices.LateBinding.InternalLateCall(Object o, Type objType, String name, Object[] args, String[] paramnames, Boolean[] CopyBack, Boolean IgnoreReturn)
       at Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateCall(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack, Boolean IgnoreReturn)
       at ScriptTask_3c0c366598174ec2b6a217c43470f581.ScriptMain.Main()
    

    这只是在进程的“第二次运行”,如果我第三次运行它,一切正常,所以我猜连接没有正确关闭或者它没有等待复制/移动在前进或类似之前完成,但我无法找到防止此错误的“关闭”或“刷新”命令。如果您有任何解决方案,请告诉我,但上述代码应该可以使用您的备用凭据获取驱动器映射,并允许您访问该共享。

    扎克

    【讨论】:

    • 是一个变量,引用并用于访问CreateObject("WScript.Network")创建的对象
    【解决方案4】:

    要使包更健壮,您可以执行以下操作;

    在第一个执行流程任务中,设置 - FailTask​​IfReturnCodeNotSuccessValue = False 如果最后一次断开连接无效,这将使包运行。

    【讨论】:

      【解决方案5】:

      这是一个较老的问题,但带有 SSIS 数据库的 SQL Server 的较新版本允许您使用代理来执行 SQ Server 作业。

      1. 在 SSMS Under Security
      2. 在 SQL Server 代理下创建一个新代理,为其提供步骤 1 中的凭据和执行 SSIS 包的权限。
      3. 在 SQL Server 代理作业下创建一个执行包的新作业
      4. 选择执行包的步骤并单击编辑。在“运行方式”下拉列表中,选择您在第 2 步中创建的代理

      【讨论】:

        猜你喜欢
        • 2014-12-31
        • 2011-04-11
        • 2010-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-22
        相关资源
        最近更新 更多