none
File.copy avec un répertoir distant RRS feed

  • Question

  • Bonjour,

    Je cherche à envoyer et récupérer des fichiers vers et depuis des répertoires distant situés sur le même réseau à partir d'une application en c# sous développée sur visual studio et déployée sur IIS 7.5

    J'ai tenté de mettre en place une solution avec WindowsIdentity.Impersonate() comme le montre mon code ci-dessous mais sans succès, j'ai aussi tenté de changer l'identité d'emprunt asp.net sans succès non plus..

    Lorsque j’exécute le bout de code ci-dessous sans l'impersonnisation, j'ai droit à un accès refusé.

     public partial class test : System.Web.UI.Page
        {
            [DllImport("advapi32.dll", SetLastError = true)]
            public static extern bool LogonUser(
                string lpszUsername,
                string lpszDomain,
                string lpszPassword,
                int dwLogonType,
                int dwLogonProvider,
                out IntPtr phToken
                );
    
            [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
            public extern static bool CloseHandle(IntPtr handle);
            
            protected void SendRequest(object sender, EventArgs e)
            {
                WindowsImpersonationContext impersonatedUser = null;
                WindowsIdentity newId;
                IntPtr tokenHandle;
    
                //Impersonate
                tokenHandle = IntPtr.Zero;
                bool returnValue = LogonUser("Administrateur", "MACHINE", "password", 2, 0, out tokenHandle);
                if (returnValue)
                {
                    newId = new WindowsIdentity(tokenHandle);
                    using (impersonatedUser = newId.Impersonate())
                    {
                        string source = @"\\192.168.1.14\adm\Koala.jpg";
                        //string source = @"X:\Koala.jpg";
                        string dest = @"D:\Jobs\Koala.jpg";
                        ErrLabel.Text = "Copie distant vers local.";
                        try
                        {
                            File.Copy(source, dest, true);
                            ErrLabel.Text += "<br/>OK.";
                        }
                        catch (Exception ex)
                        {
                            ErrLabel.Text += "La copie n'a pas fonctionné.";
                            ErrLabel.Text += "<br/>" + ex.Message;
                            ErrLabel.Text += "<br/>" + ex.InnerException;
    
                        }
                        ErrLabel.Text += "Copie local vers distant.";
                        try
                        {
                            File.Copy(dest, @"\\192.168.1.14\adm\Koala_cpy.jpg", true);
                            ErrLabel.Text += "<br/>OK.";
                        }
                        catch (Exception ex)
                        {
                            ErrLabel.Text += "La copie n'a pas fonctionné.";
                            ErrLabel.Text += "<br/>" + ex.Message;
                            ErrLabel.Text += "<br/>" + ex.InnerException;
                        }
                    }
                }
                else
                {
                    //do some error handling
                    ErrLabel.Text = "La connexion a échoué.";
                }
    
    
                //Undo impersonation
                if (impersonatedUser != null)
                {
                    impersonatedUser.Undo();
                }
                if (tokenHandle != IntPtr.Zero)
                {
                    CloseHandle(tokenHandle);
                }
    
            }
    }

    Pourriez vous m'aider à trouver d'où viens le problème?
    lundi 1 décembre 2014 13:45

Réponses

Toutes les réponses

  • Bonjour,

    J'ai trouvé le thread IIS7 in integrated mode throws an ObjectDisposedException when trying to access the WindowsIdentity qui ressemble à votre souci. Là, le problème est que IIS7 ferme WindowsIdentity parmi les demandes de sorte que vous devez utiliser une nouvelle windows identity pour chaque demande.

    J'espère que cela vous sera utile.

    Merci de nous tenir au courant.

    Cordialement,

    Nina


    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    mardi 2 décembre 2014 12:05
    Modérateur
  • Bonjour,

    J'ai pu résoudre mon problème en créant un utilisateur windows (même nom, meme mot de passe) sauf "administrateur" sur les 2 machines concernées.

    Le File.Copy marche dans les deux sens en utilisant cet utilisateur par le pool d'application.

    mercredi 3 décembre 2014 16:06