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

ASP.NET Discussion :

Problème lors du déploiement d'un DirectoryInfo


Sujet :

ASP.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 26
    Par défaut Problème lors du déploiement d'un DirectoryInfo
    Bonjour à tous,
    Voilà j'ai un problème sur le site intranet que je suis en train de développer.
    En gros j'ai un serveur (qui hébergera ma page) et un autre serveur qui contient des répertoires qui m'intéresse.
    Je veux en fait récupérer la liste de ces répertoires pour pouvoir choisir lequel copier sur un autre pc.

    Voilà ce que j'ai comme bout de code:
    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
     
    public List<String> getListRelease()
        {
            try
            {
                DirectoryInfo directoryRelease = new DirectoryInfo(m_strDirectoryPath);
                List<String> listRelease = new List<String>();
     
                m_directoryInfoTab = directoryRelease.GetDirectories();
     
                for (int iIndex = 0; iIndex < m_directoryInfoTab.Length; iIndex++)
                {
                    listRelease.Add(m_directoryInfoTab[iIndex].Name);
                }
     
                return listRelease;
            }
            catch (Exception)
            {
                return null;
            }
        }
    En fait mon problème c'est que quand je test sur mon pc de développement ça passe nickel mais dés que je déploie sur le serveur ça plante sur la méthode GetDirectories() et je pars dans mon Exception et du coup ma liste est null.
    D'ailleurs c'est pas pratique pour débugger une fois que l'application est déployée

    m_strDirectoryPath contient une string du type \\serveur\répertoire... mais le problème ne vient pas de là le serveur est bien accessible.
    J'ai aussi essayé en mettant m_strDirectoryPath = "C:\\" et j'ai le même soucis. J'ai mit les droits en lecture écriture et browse pour tous les utilisateurs sur mon site...

    Merci d'avance pour vos avis.

  2. #2
    Rédacteur
    Avatar de Paul Musso
    Profil pro
    Inscrit en
    Août 2008
    Messages
    368
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2008
    Messages : 368
    Par défaut
    Bonjour,

    Cela vient surement du compte qui est utilisé pour exécuter ton site web. Regarde dans les pool d'application de IIS. Par défaut, c'est le compte Service réseau qui est utilisé.

    Tu as plusieurs choix qui s'offrent à toi. Soit tu changes le compte utilisé par le pool d'application. Cela peut poser des soucis au niveau de l'authentification, à tester.

    Ensuite, tu peux créer un compte de service que tu vas utiliser pour changer l'identité du compte mais par programmation (impersonation). Au niveau NTFS, il faut lui donner bien sur les droits adéquats sur les dossiers cibles.

    Dernier choix, tu peux aussi aussi donner les droits pour au compte service réseau sur les dossiers cibles. Cette dernière technique n'est pas conseillée, cela peut créer des trous au niveau de la sécurité. Par contre, pour être sûr que ton problème vient de là, teste la quand même.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 26
    Par défaut
    Merci pour ta réponse.
    En fait j'ai déjà essayé de changer le compte utilisé pour l'exécution du site web, j'ai essayé en administrateur mais le problème reste le même.
    J'ai oublié de préciser que j'utilise Windows Server 2003 sur le pc qui héberge peut être y a-t-il des manipulations à faire en plus? J'ai regardé sur google mais j'ai rien trouvé...

    J'ai essayé aussi ta troisième proposition pour voir si cela modifiait quelque chose mais malheureusement j'ai toujours ma liste qui est null.

  4. #4
    Rédacteur
    Avatar de Paul Musso
    Profil pro
    Inscrit en
    Août 2008
    Messages
    368
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2008
    Messages : 368
    Par défaut
    Ok, je pense que la solution 2 devrait résoudre ton problème :

    Voici une classe qui te permet de faire 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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    public class Impersonator
    {
        [DllImport("advapi32", SetLastError = true)]
        private static extern bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, out IntPtr token);
     
        [DllImport("advapi32", CharSet = CharSet.Auto)]
        private static extern bool CloseHandle(IntPtr handle);
     
        private string _userName;
        private string _password;
        private string _domain;
        private WindowsImpersonationContext _impContext;
     
        public Impersonator(string userName, string domain, string password)
        {
            _userName = userName;
            _password = password;
            _domain = domain;
        }
     
        private WindowsIdentity Logon()
        {
            WindowsIdentity winIdentity = null;
            try
            {
                IntPtr handle = new IntPtr(0);
                bool logOnSuccess = false;
                logOnSuccess = LogonUser(_userName, _domain, _password, 3, 0, out handle);
                if (!logOnSuccess)
                {
                    int errorCode = Marshal.GetLastWin32Error();
                    throw new Exception("User logon failed. Error code : " + errorCode);
                }
                winIdentity = new WindowsIdentity(handle);
                CloseHandle(handle);
            }
            catch{}
            return winIdentity;
        }
     
        public void Impersonate()
        {
            try
            {
                _impContext = Logon().Impersonate();
            }
            catch { }
        }
     
        public void UndoImpersonate()
        {
            try
            {
                _impContext.Undo();
            }
            catch { }
        }
    }
    Rajoute là dans ton code et voici un exemple d'utilisation :

    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
    try
    {
        Impersonator impersonator = new Impersonator("Identifiant AD ou local", "Nom de domaine", "Mot de passe}");
        impersonator.Impersonate();
     
        try
        {
             // Ton code
        }
        catch { }
        finally
        {
            impersonator.UndoImpersonate();
        }
    }
    catch { }
    Utilise un compte dont tu es sûr qu'il a les droits sur les dossiers cibles.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 26
    Par défaut
    Je suis en train d'essayer ta solution mais j'ai une erreur

    MESSAGE ISS:

    Erreur de compilation
    Description : Une erreur s'est produite lors de la compilation d'une ressource requise pour répondre à cette demande. Veuillez consulter ci-dessous les détails relatifs à l'erreur en question, puis modifier votre code source de manière appropriée.

    Message d'erreur du compilateur: CS0246: The type or namespace name 'DllImport' could not be found (are you missing a using directive or an assembly reference?)

    Erreur source:

    Ligne 15 : public class CImpersonator
    Ligne 16 : {
    Ligne 17 : [DllImport("advapi32", SetLastError = true)]
    Ligne 18 : private static extern bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, out IntPtr token);
    Ligne 19 :



    Je précise que je code depuis seulement quelques semaines en C# donc désolé si c'est une erreur bête

    D'ailleurs ça correspond à quoi cette ligne?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [DllImport("advapi32", SetLastError = true)]

  6. #6
    Rédacteur
    Avatar de Paul Musso
    Profil pro
    Inscrit en
    Août 2008
    Messages
    368
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2008
    Messages : 368
    Par défaut
    Il doit te manquer des using, en voici 3 qui résoudront ton problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    using System;
    using System.Runtime.InteropServices;
    using System.Security.Principal;
    Comme c'est une question récurrante, j'ai fait un petit billet sur mon blog que tu trouveras dans ma signature.

    Pour les ajouter automatiquement, dans Visual Studio, laisse le curseur sur DllImport, normalement tu verra apparaître une icone et un menu qui te permet de rajouter le using nécessaire. Si Visual Studio n'arrive pas à résoudre le type, c'est qu'il manque une référence dans le projet. Mais cela ne devrait pas être le cas pour toi.

    DllImport sert à déclarer une méthode d'une dll écrite en code natif (non managé).

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

Discussions similaires

  1. Problème lors du déploiement avec Maven
    Par _cece dans le forum SpagoBI
    Réponses: 2
    Dernier message: 25/09/2008, 19h49
  2. [C#][ASP.NET] Problème lors du déploiement d'une DLL
    Par dinbougre dans le forum Framework .NET
    Réponses: 2
    Dernier message: 21/02/2008, 10h14
  3. [MOSS2007] Problème lors du déploiement des services partagés
    Par morpheus002 dans le forum SharePoint
    Réponses: 4
    Dernier message: 20/01/2008, 18h45
  4. Problème lors du déploiement.
    Par D3V1L J4M dans le forum SAP Crystal Reports
    Réponses: 0
    Dernier message: 05/12/2007, 15h39

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