SSIS:使用不同的用户名和密码访问网络驱动器

时间:2010-11-23 17:05:31

标签: ssis

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

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

5 个答案:

答案 0 :(得分:11)

您可以将“执行进程”任务与“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"

答案 1 :(得分:1)

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

答案 2 :(得分:1)

你必须映射网络驱动器,这是我现在使用的一个例子:

    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()

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

扎克

答案 3 :(得分:0)

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

在第一个执行流程任务中,设置-FailTask​​IfReturnCodeNotSuccessValue = False 如果最后一个断开连接没有起作用,这将使程序包运行。

答案 4 :(得分:0)

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

  1. 在SSMS的“安全性”下,“ <凭据”在映射到要使用的AD帐户的数据库中设置凭据。
  2. 在SQL Server代理下,创建一个新的代理,为其提供来自步骤1的凭据以及执行SSIS包的权限。
  3. 在SQL Server代理作业下,创建一个新作业来执行您的程序包
  4. 选择执行程序包的步骤,然后单击“编辑”。在“运行方式”下拉列表中,选择您在步骤2中创建的代理