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

Services Web Discussion :

File.Exist chemin réseau


Sujet :

Services Web

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 37
    Points : 40
    Points
    40
    Par défaut File.Exist chemin réseau
    Bonjour à tous,

    J'expose mon pb, à partir d'un service web je dois vérifier si un fichier existe sur un partage réseau, si il existe je le supprime.
    Le pb c'est que File.exist(\\moncheminreseau") me renvoie faux systématiquement, pourtant cela marche à partir d'une appli client lourd, j'ai beau vérifier toutes les sécurités (j'ai même tout mis disponible pour tout le monde sur mon partage) mais rien à faire.
    Comment je fais? Ai-je raté quelque chose?
    Voici un bout de code pour l'exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    string docASupprimer= @"\\batz\data\fichier.jpg";
    if (File.Exists(docASupprimer))
    {
         File.Delete(docASupprimer);
    }
    Comprends pas.

    Merci pour un peu d'aide

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 240
    Points : 1 646
    Points
    1 646
    Par défaut
    en client lourd tu es loggué en admin ca n'est pas le cas quand tu utilises le web. tu es loggué en tant qu'utilisateur web donc avec des droits restreints.
    essaye de mater l'impersonnation pour résoudre ton problème.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 37
    Points : 40
    Points
    40
    Par défaut
    Merci pour ta réponse rapide rattlehead mais sans succès cela ne marche pas plus.
    Je trouve ça incroyable tout de même!!

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 240
    Points : 1 646
    Points
    1 646
    Par défaut
    ah pourtant j'ai vu dans le forum que l'impersonnation ca te permettait d'avoir temporairement les bons droits.
    tu fais voir ton code.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 37
    Points : 40
    Points
    40
    Par défaut
    Bon voici la méthode concerné, mais je ne pense pas qu'elle te sera d'une grande utilité (je l'ai résumé dans mon premier post):
    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
     
        /// <summary>
        /// Supprime les documents synchronisés du serveur
        /// </summary>
        /// <param name="synchroDoc">Le document synchronisé à supprimer</param>
        [WebMethod]
        public void supprimerSynchroDocument(SynchroDocumentNumerise synchroDoc)
        {
            string repertoireFichier = ConfigurationManager.AppSettings["dirServeurFichier"];
     
            try
            {
                DocumentNumerise doc = CleosContext.CurrentApplicationController.DocumentNumeriseRules.FindById(new Guid(synchroDoc.DocNumerise));
                if (doc != null)
                {
                    string docASupprimer = repertoireFichier + doc.Bien.Proprietaire.Id.ToString()
                        + @"\" + doc.Bien.Id.ToString() + @"\" + (doc.Type.Libelle.Equals("Image") ? "Images" : doc.Type.Libelle) + @"\" + doc.Nom;
                    if (File.Exists(docASupprimer))
                    {
                        File.Delete(docASupprimer);
                        if (doc.Type.Libelle.Equals("Image"))
                        {
                            File.Delete(repertoireFichier + doc.Bien.Proprietaire.Id.ToString()
                            + @"\" + doc.Bien.Id.ToString() + @"\" + (doc.Type.Libelle.Equals("Image") ? "Images" : doc.Type.Libelle) + @"\miniatures\mini"
                            + doc.Nom);
                        }
                    }
                    CleosContext.CurrentApplicationController.DocumentNumeriseRules.Delete(doc);
                    CleosContext.CurrentApplicationController.SynchronisationDocumentNumeriseRules.Delete(synchroDoc);
                }
            }
            catch (HibernateObjectRetrievalFailureException)
            {
                MyLogger.Log(typeof(Cleos2008SW), Cleos2008.UI.Messages.messagesUI.Tentavie_Suppression_Doc_Inexistant, LoggingLevels.Warn);
            }
        }
    Et voici une petite explication pour mieux comprendre le contexte de l'appli :
    - J'ai une serveur IIS et un serveur SQL 2005 Enterprise
    - Sur l'IIS j'ai une appli type service web et un serveur FTP
    - Le serveur SQ 2005 est paramétré pour accepter des synchros avec des SQL Express installés sur des laptops nomades, les synchros peuvent s'effectuer de n'importe ou dans le monde donc par internet
    - Nous avons donc d'abord des synchros de données SQL
    - Dans un deuxième temps et en fonction des données enregistrées sur les laptops, des fichiers peuvent être échangés via FTP
    - Des données sur les échanges de fichiers sont enregistrées dans SQLExpress mais elles ne sont jamais synchronisées automatiquement par le serveur SQL Central, j'ai donc développé toute la partie synchro SQL de tous les documents (création, modification, suppression et délégation) vers le serveur central
    - Pourquoi? Et parce que les fichiers n'appartiennent qu'à la personne qui les a créés et donc sur son laptop et seul lui a le droit d'y accéder, contrairement aux autres informations de l'appli qui sont accessible par tout le monde, sauf si l'utilisater donne délégations à un autre utililsateur alors dans ce cas il faut gérer les modifs, les suppressions etc... Bon c'est un peu le bazard mais on y arrive.
    - Enfin je termine, pour l'instant, la synchro pour un seul utilisateur fonctionne dans le sens Laptop --> Serveur, le doc est bien créé sur le serveur ainsi que dans la base, les modifs sont prise en compte, le doc est bien supprimé sur la base du client et sur la base du serveur lors de la synchro perso, et et et le fichier est supprimé du disque du laptop mais pas du serveur. C'est donc là que le service web intervient et que ça ne marche pas car les fichiers sont placés sur une autre machine.
    Bon j'aurais pu passé par le FTP mais j'aurais dans ce cas du renvoyer une requête au client pour lui demander de supprimer le doc, mais comme mon service web connais déjà le fichier à supprimer et que les deux machines sont dans le même local je peux gagner pas mal de temps (et gain d'argent;-))

    Voili voulou j'espère avoir été clair.

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 240
    Points : 1 646
    Points
    1 646
    Par défaut
    et ce truc ca ne peut pas t'aider?
    http://support.microsoft.com/kb/306158

    au fait pour la concatenation de chaine utilise plutot les StringBuilder.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 37
    Points : 40
    Points
    40
    Par défaut
    OK merci, je vais regarder ça tout à l'heure, et je te/vous tiendrais au courant.
    (oui je sais pour les StringBuilder, c'était prévu. Merci quand même)

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 37
    Points : 40
    Points
    40
    Par défaut
    OK c'est bon.

    C'était effectivement un pb d'impersonation.
    J'ai donc dans le Web.config du service web

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <identity impersonate="true"/>
    avec dans IIS seulement l'authentification intégré windows et utilisateur anonyme désactivé.

    Et comme le serveur de fichier est distant avec un seul compte d'accès aux fichiers qui est pour l'exemple login = MonDomaine\userFichier et le mode passe = p@ss\"w_è-, je change d'identité en cours d'exécution et ensuite je reviens à celui des utilisateurs.

    Voilà en gros le code que j'ai rajouté (grace à de l'aide de rattlehead).
    Code du changement d'identité :
    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
     
    public class ImpersonationCleos
    {
        public const int LOGON32_LOGON_INTERACTIVE = 2;
        public const int LOGON32_PROVIDER_DEFAULT = 0;
     
        static WindowsImpersonationContext impersonationContext;
     
        [DllImport("advapi32.dll", CharSet = CharSet.Auto)]
        public static extern int LogonUser(String lpszUserName, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
        [DllImport("advapi32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto, SetLastError = true)]
        public extern static int DuplicateToken(IntPtr hToken, int impersonationLevel, ref IntPtr hNewToken);
     
        internal static bool impersonateValidUser(String userName, String domain, String password)
        {
            WindowsIdentity tempWindowsIdentity;
            IntPtr token = IntPtr.Zero;
            IntPtr tokenDuplicate = IntPtr.Zero;
     
            if (LogonUser(userName, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref token) != 0)
            {
                if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
                {
                    tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
                    impersonationContext = tempWindowsIdentity.Impersonate();
                    if (impersonationContext != null)
                        return true;
                    else
                        return false;
                }
                else
                    return false;
            }
            else
                return false;
        }
     
        internal static void undoImpersonation()
        {
            impersonationContext.Undo();
        }
    }
    Code qui utilise le changement d'identité :
    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
     
    if (ImpersonationCleos.impersonateValidUser(@"userFichier", "MonDomaine", "p@ss\"w_è-"))
                {
                    // Insérez ici le code qui s'exécute dans le contexte de sécurité de l'utilisateur particulier.
                    if (null != synchroDoc)
                    {
                        DocumentNumerise doc = CleosContext.CurrentApplicationController.DocumentNumeriseRules.FindById(new Guid(synchroDoc.DocNumerise));
                        if (doc != null)
                        {
                            string repertoireFichier = ConfigurationManager.AppSettings["dirServeurFichier"];
                            StringBuilder cheminFichier = new StringBuilder();
                            StringBuilder cheminFichierMiniature = new StringBuilder();
                            cheminFichier.Append(repertoireFichier);
                            cheminFichier.Append(doc.Bien.Proprietaire.Id.ToString())
                                .Append(@"\")
                                .Append(doc.Bien.Id.ToString())
                                .Append(@"\")
                                .Append((doc.Type.Libelle.Equals("Image") ? "Images" : doc.Type.Libelle))
                                .Append(@"\");
                            cheminFichierMiniature.Append(cheminFichier.ToString());
                            cheminFichier.Append(doc.Nom);
     
                            if (File.Exists(cheminFichier.ToString()))
                            {
                                File.Delete(cheminFichier.ToString());
                                if (doc.Type.Libelle.Equals("Image"))
                                {
                                    cheminFichierMiniature.Append(@"\miniatures\mini")
                                        .Append(doc.Nom);
                                    File.Delete(cheminFichierMiniature.ToString());
                                }
                            }
                            CleosContext.CurrentApplicationController.DocumentNumeriseRules.Delete(doc);
                            CleosContext.CurrentApplicationController.SynchronisationDocumentNumeriseRules.Delete(synchroDoc);
                        }
                    }
                    ImpersonationCleos.undoImpersonation();
                }
                else
                {
                    Console.WriteLine("L'emprunt d'identité a échoué.");
                    // L'emprunt d'identité a échoué. Par conséquent, insérez ici un mécanisme de prévention de défaillance.
                }
    Voilà et ça marche.

    Merci rattlehead Super.

    Petite note : j'ai remplacer les concaténations par des StringBuilder et je vais améliorer ce code pour bien gérer les cas d'échec.

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

Discussions similaires

  1. File.Exists (C#) - Retrouver le chemin d'une image.
    Par Nadiya dans le forum ASP.NET
    Réponses: 9
    Dernier message: 07/09/2010, 16h47
  2. file exists chemin relatif
    Par molesqualeux dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 22/02/2010, 17h29
  3. Accélérer IO.File.Exists sur fichier réseau
    Par Papy214 dans le forum C#
    Réponses: 5
    Dernier message: 21/11/2009, 13h00
  4. File.Copy : chemin réseau non trouvé ?
    Par Isythiel dans le forum C#
    Réponses: 5
    Dernier message: 17/07/2009, 10h21
  5. Réponses: 3
    Dernier message: 02/09/2008, 10h22

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