IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Lecture de fichiers et impersonation


Sujet :

C#

  1. #1
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 54
    Par défaut Lecture de fichiers et impersonation
    Bonjour à tous et bonne année..

    Je développe actuellement une fonction qui doit récupérer le contenu d'un répertoire aux droits restreints pour en déplacer son contenu au sein d'un second dossier (SharePoint, pour être précis).

    Afin de donner le droit à C# d'aller lire le contenu du dossier, j'utilise l'API WIN32 me permettant de faire de l'impersonation.

    Ce code me permet donc d'accèder et de lire le contenu d'un répertoire donc l'accès est sécurisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    public string uploadDoc(string domaine, string login, string passw)
    {
    web.AllowUnsafeUpdates = true;
     
     using (new Impersonation(login, domaine, passw))
                    {
                        try
                        {
                            if (web.GetFolder(nomLib).Exists)
                            {
                                //définition du dossier de reception
                                SPFolder folder = web.Folders[nomLib];
     
                                //lecture du document
                                FileStream fStream = File.OpenRead("C:/Transferts/monDoc.txt"); 
                                byte[] contents = new byte[fStream.Length];
                                fStream.Read(contents, 0, (int)fStream.Length);
                                fStream.Close();
     
                                //Ajout du document
                                folder.Files.Add("nom_du_document_copié", contents, true);
                                folder.Update();
    			    Console.writeLine("Document ajouté");
                            }
                        }
                        catch (System.Exception e)
                        {
                            Console.writeLine(e.Message + " : " + e.Source);
                        }
     
    		}
    	}
    web.AllowUnsafeUpdates = false;
    }
    Cela fonctionne évidemment très bien.


    Hors, lorsque je désire travailler sur tout le contenu du dossier, il me retourne une erreur, comme quoi je ne suis pas authorisé à lire le contenu du répertoire :


    Voici le code me posant problème : J'ai rajouté une lecture fichiers à fichiers du répertoire au sein de l'impersonation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    public void ParcourirDossier()
            {
    		using (new Impersonation(login, domaine, passw))
                    {
                        web.AllowUnsafeUpdates = true;
     
                        String[] fichiers = Directory.GetFiles("C:/Transferts");
     
     
                        for (int i = 0; i < fichiers.Length; i++)
                        {
                            this.uploadDoc(fichiers[i]);
                            Console.Out.WriteLine(fichiers[i]);
                        }
     
                    web.AllowUnsafeUpdates = false;
    		}
    	}
     
    //-----------------------------------------------------------------------
     
    	 public void uploadDoc(string urlDoc)
            {
                try
                {
                    if (web.GetFolder(nomLib).Exists)
                    {
                        //définition du dossier de reception
                        SPFolder folder = web.Folders[nomLib];
     
                        //lecture du document
                        FileStream fStream = File.OpenRead(urlDoc);
                        byte[] contents = new byte[fStream.Length];
                        fStream.Read(contents, 0, (int)fStream.Length);
                        fStream.Close();
     
                        //Ajout du document
                        folder.Files.Add("nom_du_document_copié", contents, true);
                        folder.Update();
                        Console.WriteLine("Document ajouté");
                     }
                 }
     
    	     catch (System.Exception e)
                 {
    			Console.Write(e.Message + " : " + e.Source);
    	     }
     
            }

    Cela me retourne l'erreur suivante:

    --> Could not find a part of the path 'C:/Transferts'. : mscorlib

    Et cela fonctionne sur n'importe quel autre répertoire, il me copie tous les fichiers dans le répertoire de destination..
    Comme si l'impersonation ne fonctionnait plus une fois dans la méthode :'(



    Un énorme merci d'avance pour tous ceux qui voudraient bien m'aider,
    zeni.

  2. #2
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Et cela fonctionne sur n'importe quel autre répertoire, il me copie tous les fichiers dans le répertoire de destination..
    Tu veux dire que c'est uniquement transferts qui pose problème ?

  3. #3
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 54
    Par défaut
    A prioris :/

    Etonnant dans le sens ou si je ne parcours pas le folder mais spécifie un fichier en paramètres, l'impersonation fonctionne et mon document est bien uploadé.

    Sinon, Sur la racine par exemple, il me liste l'intégralité des fichiers et uploade tout dans mon dossier SharePoint (la racine n'est pas protégée).

    Sans parcours du dossier, je suis donc en mesure de rentrer dans "C:/transfert" :/

  4. #4
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 54
    Par défaut
    ça me dépasse -_-"

    Je passe à côté de quelque chose d'évidement, j'en suis à peu près sur, mais après..

    at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
    at System.IO.Directory.InternalGetFileDirectoryNames(String path, String userPathOriginal, String searchPattern, Boolean includeFiles, Boolean includeDirs, SearchOption searchOption)
    at System.IO.Directory.GetFiles(String path, String searchPattern, SearchOption searchOption)
    at System.IO.Directory.GetFiles(String path)
    at UploadeurV1.TraiterDossier.ParcourirDossier()
    at UploadeurV1.Uploadeur.Main(String[] args)
    at System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
    at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
    at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
    at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
    at System.Threading.ThreadHelper.ThreadStart()

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Par défaut
    C:/Transferts
    Pas C:\Transferts plutôt ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    FileStream fStream = File.OpenRead("C:\\Transferts\\monDoc.txt");
     
    String[] fichiers = Directory.GetFiles("C:\\Transferts");

  6. #6
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 54
    Par défaut
    Non, ce n'est pas cela (malhereusement, ce serai si beau).

    J'entend par là, que n'importe quel autre chemin fonctionne, cette erreur ce produit uniquement sur ce dossier, et, si je cherche un fichier en particulier dedans, pas de problèmes..

    Directory.GetFiles ne rajouterai t'il pas des contraintes de sécurité par hazard ?

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Par défaut
    Si il dit qu'il ne peut pas parcourir le répertoire, c'est qu'il manque effectivement une autorisation.

  8. #8
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 54
    Par défaut
    Mhhh.

    En réalité, il me dit, si j'interprete bien l'exception, qu'il ne trouve/connais pas le chemin du répertoire.

    "Could not find a part of the path 'C:/Transferts'."

    Maintenant, je pense effectivement à un problème de droits, car la fonction marche sur n'importe quel dossier ne possédant pas de droits restreints.

    Non, ce qui m'intrigue, c'est bel et bien le fait que sans faire parcours du dossier, il me récupère sans problèmes "monDoc.txt", ce qui me laisse penser que mon fonction d'impersonation est correcte.

    Maintenant, si contraintes de sécurités existent en utilisant "Directory" je ne vois pas lequelles.

  9. #9
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    A tout hasard essaye : "C:/Transferts/"

    Sinon regarde au niveau des droits du dossier lui même.
    Compare les avec un autre dossier qui marche.
    Peut être tu découvriras quelqus chose !

  10. #10
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 54
    Par défaut
    Gniarggn toujours pas.

    Si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     using (new Impersonation(login, domaine, passw))
                    {
     
                            this.uploadDoc(C:/Transferts/MonDoc.txt);
     
                    }
    J'ai ce retour : OK, le document a été copié : "C:/Transferts/MonDoc.txt"

    Maintenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    string urlDossier = "C:/Transferts/"
    using (new Impersonation(login, domaine, passw))
                    {
                        String[] fichiers = Directory.GetFiles(urlDossier);
                        for (int i = 0; i < fichiers.Length; i++)
                        {
                            this.uploadDoc(fichiers[i]);
                        }
                    }
    Bon, ça, ça renvoie : ERREUR, dossier n'existe pas ou est introuvable.

    Je suis à court d'idées là.



    Alors, je teste l'existance du folder :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    string urlDossier = "C:/Transferts/"
    using (new Impersonation(login, domaine, passw))
                    {
                        if (Directory.Exists(urlDossier))
                        {
                            String[] fichiers = Directory.GetFiles(urlDossier);
                            for (int i = 0; i < fichiers.Length; i++)
                            {
                                this.uploadDocument(urlDoc);
                            }
                        }
                        else
                        { Console.Out.WriteLine("Dossier introuvable !!!"); }
                    }
    Donc, Directory, il ne vois pas mes dossiers protégés..
    Ce qui est plutôt intrigant, sachant que si je demande de me liste le contenu de C:// avec Directory.getDirectories, il me trouve Transferts.

    Ya un remède docteur ?

  11. #11
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Grâce à google j'ai trouvé cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    using (Impersonate Impersonateor = new Impersonate("baduser", "workgroup", "badPassword"))
                    {
                        // This should should never get executed as Impersonate should fail unless you have the user password domain combo as hard coded
                        string[] files = System.IO.Directory.GetFiles("c:\\windows\\");
                        System.Diagnostics.Trace.WriteLine(
                            string.Format("There are {0} files in the windows directory", files.Length.ToString()));
                    }

    Moi j'essayerais bien : "C://Transferts//" ou "C:\\Transferts\\" Quand même.

    Sinon ce code est censé marcher, je l'ai tiré d'ici :
    http://www.codeassociate.com/caapi/h...mpersonate.htm

  12. #12
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 54
    Par défaut
    Je vais devenir chevre


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     using (new Impersonation(login, domaine, passw))
                    {
                        String[] fichiers = Directory.GetFiles("C:/Transferts");
     
                            for (int i = 0; i < fichiers.Length; i++)
                            {
                                this.uploadDocument(fichiers[i]);
                            }
                        }
    Donc pour infos, ça, ça marche...
    Si quelqu'un vois la différence avec le code au dessus...

    C'est moi, ou VS qui a trop bu au 1er de l'an?


  13. #13
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Tu peux aussi demander à un marabou de dinogstiquer ton PC

    C'est vrais que c'est bizzare.
    Je pencherais pour un bug de windows et comme tu as redémarrés ta machine plus de bug.

  14. #14
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 54
    Par défaut
    Non, en fait, c'est plus rigolo que cela.

    Je défini :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string urlDossier = "C:/Transferts"
    ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String[] fichiers = Directory.GetFiles("C:/Transferts");
    Et bien ça, ça marche !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String[] fichiers = Directory.GetFiles(urlDossier);
    Pas ça !!!


  15. #15
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 54
    Par défaut
    Bon, je met ça sur le compte des bulles et passe en résolu.

    Merci pour tout

  16. #16
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Oui mais théoriquement il y aurait plus de chance que cela marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string urlDossier = "C:/Transferts"; 
    String[] fichiers = Directory.GetFiles(urlDossier);
    Que cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String[] fichiers = Directory.GetFiles("C:/Transferts");
    Car moins d'erreur possible (les histoire de guillemets oubliés, de caractère d'échapement, ...)

  17. #17
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 54
    Par défaut
    Non, je confirme, c'était bien les bulles

    Et les bulles, ça emmene à une demie journée de


    Désolé pour le thread inutile et encore merci pour tout.

  18. #18
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Heu en fait j'ai pas compris ce que tu appelé les bulles ?
    Des bulles d'aide ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Windows]lecture des fichier lnk (raccourcis)
    Par Tiaps dans le forum API standards et tierces
    Réponses: 10
    Dernier message: 21/10/2009, 20h27
  2. [jsp]lecture de fichier
    Par antigone dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 04/09/2003, 12h05
  3. [AS400][Intranet][PC] Lecture de "fichiers" AS400
    Par lando dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 16/07/2003, 12h11
  4. Lecture de fichier
    Par Watcha dans le forum x86 16-bits
    Réponses: 13
    Dernier message: 04/03/2003, 21h43
  5. Lecture de fichiers ".WAV"...
    Par 0x4e84 dans le forum Langage
    Réponses: 2
    Dernier message: 03/09/2002, 10h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo