Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SSIS:使用不同的用户名和密码访问网络驱动器_Ssis - Fatal编程技术网

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

SSIS:使用不同的用户名和密码访问网络驱动器,ssis,Ssis,是否有一种方法可以连接到需要不同用户名/密码的网络驱动器,而不是运行包的用户的用户名/密码 我需要从远程服务器复制文件。现在,我在Windows资源管理器中映射网络驱动器,然后执行文件系统任务。但是,最终该包将从另一台机器自动运行,并且需要自己映射网络驱动器。这可能吗?为什么不使用FTP任务将文件传送到本地计算机?在本地计算机上运行SSIS。使用二进制FTP传输时,速度非常快。请记住SSI的行delimter应该是LF,而不是CRLF,因为二进制FTp不会将LF(unix)转换为CRLF(win

是否有一种方法可以连接到需要不同用户名/密码的网络驱动器,而不是运行包的用户的用户名/密码


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

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

您必须映射网络驱动器,下面是我现在使用的一个示例:

    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)
从那里只需使用该驱动器号并通过映射的驱动器访问文件

我遇到了一个新脚本的问题(导致我出现此问题),该脚本访问两个共享驱动器,并在驱动器之间执行一些复制/移动操作,我从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()
这只是在进程的“第二次运行”时,如果我第三次运行它,一切正常,因此我猜测连接没有正确关闭,或者它没有等待复制/移动完成,然后再继续或类似操作,但我找不到防止此错误的“关闭”或“刷新”命令。如果您有任何解决方案,请让我知道,但是上面的代码应该可以使用您的备用凭据映射驱动器,并允许您访问该共享


Zach

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

可执行文件:net

参数:使用\Server\SomeShare您的密码/user:Domain\YourUser

执行过程之后的任何文件系统任务都将能够访问这些文件

替代方法

本章详细介绍了这些步骤,但基本内容如下:

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

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

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


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

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

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


  • 在安全性下的SSMS中,为什么不能仅向运行包的用户或进程授予必要的权限?如果你解释一下为什么你有这样的限制,你可能会得到一个更好的答案。同时,网络使用呢?我们将以有权限的用户身份运行它。问题是,它是AS400上的映射驱动器,我们通常使用名称中包含10个以上字符和下划线的帐户来运行所有作业,而AS400不支持这一点。为了一致性起见,我们希望使用同一个帐户运行此作业,并仅通过另一个帐户上的400进行身份验证。。。但我们认为这不值得,所以我们可能会放弃……谢谢@Valentino Vranken!你的解决方案救了我,但我更新了你的答案,加入了我在使用你的答案后发现的一篇相关文章。谢谢@Valentino的魅力。当我试图从命令提示符映射网络驱动器时,仅在末尾添加指令/yes参数
    /c“NET USE Z:/delete/yes”
    ,以强制断开连接并获取错误。错误表示,“文件名、目录或卷标语法不正确”,这可以通过
    EXEC master..xp\u cmdshell@myCmd?这确实可以在存储过程中完成,但就像执行过程一样,任务必须完成;您必须编写3个单独的过程,第二个过程使用映射的驱动器。此外,SQL Server无法在新驱动器上执行数据库操作,但您可以先将文件移动到网络上的文件夹中。该变量引用并用于访问CreateObject创建的对象(“WScript.network”)
    
    Executable: cmd.exe
    Arguments: /c "NET USE Z: "\\servername\shareddrivename" /user:mydomain\myusername mypassword"
    
    Executable: cmd.exe
    Arguments: /c "NET USE Z: /delete"