2010-11-23 23 views
7

Existe-t-il un moyen de se connecter à un lecteur réseau nécessitant un nom d'utilisateur/mot de passe différent du nom d'utilisateur/mot de passe de l'utilisateur?SSIS: Accès à un lecteur réseau avec un nom d'utilisateur et un mot de passe différents

Je dois copier des fichiers à partir d'un serveur distant. À l'heure actuelle, je mappe le lecteur réseau dans l'Explorateur Windows, puis je tâche de système de fichiers. Cependant, éventuellement, ce paquet sera exécuté automatiquement, à partir d'une machine différente, et devra cartographier le lecteur réseau par lui-même. Est-ce possible? Pourquoi ne pas utiliser une tâche FTP pour transférer les fichiers sur l'ordinateur local?

+1

Pourquoi ne pouvez-vous pas seulement donner les autorisations nécessaires à l'utilisateur ou d'un processus en cours d'exécution du package? Si vous expliquez pourquoi vous avez cette limitation, vous pourriez obtenir une meilleure réponse. En attendant, qu'en est-il de NET USE? – Pondlife

+0

Nous allons le faire fonctionner comme un utilisateur qui a des permissions. Le problème est qu'il s'agit d'un lecteur mappé sur un AS400 et que nous exécutons normalement tous nos travaux avec un compte comportant plus de 10 caractères et un trait de soulignement dans le nom - qui n'est pas pris en charge sur un AS400. Nous espérions, par souci de cohérence, faire fonctionner ce travail avec le même compte et nous authentifier avec le 400 sur l'autre compte ... Mais nous pensons que cela n'en vaut pas la peine, donc nous allons probablement abandonner. – nosirrahcd

Répondre

1

Exécutez SSIS sur la machine locale. Lors du transfert en utilisant FTP en binaire, c'est très rapide. Rappelez-vous que le délimiteur ROW pour SSIS doit être LF, pas CRLF, car FTF binaire ne convertit pas LF (unix) en CRLF (windows)

1

Vous devez mapper le lecteur réseau, voici un exemple que j'utilise maintenant:

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) 

De là, utilisez juste cette driveLetter et accédez au fichier via le lecteur mappé.

Je vais avoir un problème (ce qui m'a amené ici) avec un nouveau script qui accède à deux disques d'actions et effectue des opérations de copier/déplacer entre les lecteurs et je reçois une erreur de SSIS qui dit:

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

Ceci est seulement sur la "2ème exécution" du processus et si je l'exécute une 3ème fois tout cela fonctionne très bien donc je suppose que la connexion n'est pas correctement fermée ou n'attend pas la copie/déplacer vers terminer avant d'avancer ou quelque chose de ce genre, mais je suis incapable de trouver une commande "close" ou "flush" qui empêche cette erreur. Si vous avez une solution, faites le moi savoir, mais le code ci-dessus devrait fonctionner pour obtenir le lecteur mappé en utilisant vos informations d'identification de remplacement et vous permettre d'accéder à ce partage.

Zach

+0

qu'est-ce que objNetwork? – toha

+0

C'est une variable qui référence et est utilisée pour accéder à l'objet créé par CreateObject ("WScript.Network") – Zach

10

Vous pouvez utiliser la tâche exécution de processus avec la commande « net use » pour créer le lecteur mappé. Voici comment les propriétés de la tâche doivent être définies:

Executable: net

Arguments: utilisation \ Server \ SomeShare YourPassword/utilisateur: Domaine \ youruser

Toutes les tâches du système de fichiers suivant la Execute Process sera en mesure d'accéder aux fichiers.

Méthode Alternative

Cette Sql Server Select Article couvre les étapes décrites dans les détails, mais les principes de base sont les suivants:

1) créer un « processus d'exécution des tâches » à la carte du lecteur réseau (cela correspond à la z :)

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

2) Ensuite, exécutez une "Tâche système de fichiers" pour effectuer la copie. N'oubliez pas que la destination "Flat File Connection" doit avoir "DelayValidation" défini sur True car z: \ suchandsuch.csv n'existe pas au moment du design.

3) Enfin, unmap le lecteur lorsque vous avez terminé avec un autre « exécution du processus de travail »

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

Merci @Valentino Vranken! Votre solution m'a sauvé, mais j'ai mis à jour votre réponse pour inclure un article connexe que j'ai trouvé après avoir utilisé votre réponse. –

+2

Merci @Valentino fonctionne comme un charme. Ajouter uniquement à l'instruction de fin/oui paramètre '/ c" NET USE Z:/delete/yes "' for forcer la déconnexion – Equiman

+0

Je reçois une erreur pendant que j'essaie de mapper le lecteur réseau à partir de l'invite de commande. Erreur: "Le nom de fichier, le répertoire ou la syntaxe de l'étiquette de volume est incorrect" – Sakthivel

Questions connexes