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

Windows Forms Discussion :

Authentification Windows sur une machine distante


Sujet :

Windows Forms

  1. #1
    Membre du Club

    Inscrit en
    Mars 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 63
    Points : 65
    Points
    65
    Par défaut Authentification Windows sur une machine distante
    Bonjour à tous,

    Je ne suis pas sûr de poster dans la bonne section, si ce n'est pas le cas, veuillez m'en excuser

    Mon problème: Je cherche à écrire un fichier sur un serveur distant. Le soucis est que lorsque je le fais manuellement (sans code) il faut que je m'authentifie en administrateur pour y accéder.

    Il faut donc que je simule l'identité de l'administrateur dans le programme avant de créer le fichier.

    Le code le plus proche que j'ai trouvé me permet de simuler l'identité d'un user dans un domaine mais pas un user de la machine elle même.

    Est-ce que quelqu'un aurait une idée ?
    Je mets en bas du message le code dont je parle.

    Merci en tout cas,

    Titip


    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    ImpersonateUser iu = new ImpersonateUser();
    iu.Impersonate("domain", "login", "mdp");
    MessageBox.Show(iu.ToString());
    iu.Undo();
     
    //Classe ImpersonateUser 
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Security.Principal;
    using System.Runtime.InteropServices;
    using System.Security.Permissions;
    using System.Windows.Forms;
     
    public class ImpersonateUser
    {
        [DllImport("advapi32.dll", SetLastError = true)]
        public static extern bool LogonUser(
        String lpszUsername,
        String lpszDomain,
        String lpszPassword,
        int dwLogonType,
        int dwLogonProvider,
        ref IntPtr phToken);
        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        public extern static bool CloseHandle(IntPtr handle);
        private static IntPtr tokenHandle = new IntPtr(0);
        private static WindowsImpersonationContext impersonatedUser;
        // If you incorporate this code into a DLL, be sure to demand that it
        // runs with FullTrust.
        [PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]
        public void Impersonate(string domainName, string userName, string password)
        {
            //try
            {
                // Use the unmanaged LogonUser function to get the user token for
                // the specified user, domain, and password.
                const int LOGON32_PROVIDER_DEFAULT = 0;
                // Passing this parameter causes LogonUser to create a primary token.
                const int LOGON32_LOGON_INTERACTIVE = 2;
                tokenHandle = IntPtr.Zero;
                // ---- Step - 1
                // Call LogonUser to obtain a handle to an access token.
                bool returnValue = LogonUser(
                userName,
                domainName,
                password,
                LOGON32_LOGON_INTERACTIVE,
                LOGON32_PROVIDER_DEFAULT,
                ref tokenHandle); // tokenHandle - new security token
                if (false == returnValue)
                {
                    int ret = Marshal.GetLastWin32Error();
                    MessageBox.Show(new System.ComponentModel.Win32Exception(ret).Message);
                    throw new System.ComponentModel.Win32Exception(ret);
                }
                // ---- Step - 2
                WindowsIdentity newId = new WindowsIdentity(tokenHandle);
                // ---- Step - 3
                impersonatedUser = newId.Impersonate();
            }
        }
        // Stops impersonation
        public void Undo()
        {
            impersonatedUser.Undo();
            // Free the tokens.
            if (tokenHandle != IntPtr.Zero)
                CloseHandle(tokenHandle);
        }
    }

  2. #2
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Et si à la place de "domain", tu mets le nom de la machine distante ça donne quoi ?

  3. #3
    Membre du Club

    Inscrit en
    Mars 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 63
    Points : 65
    Points
    65
    Par défaut
    J'ai essayé au lieu de "domain", le nom de la machine, ou son ip et j'obtiens toujours la meme erreur: "Echec d'ouverture de session: nom d'utilisateur ou mot de passe incorrect".

  4. #4
    Membre averti
    Profil pro
    azeazeae
    Inscrit en
    Septembre 2002
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : azeazeae

    Informations forums :
    Inscription : Septembre 2002
    Messages : 114
    Points : 305
    Points
    305
    Par défaut
    Autre piste possible, utiliser la commande run as pour lancer ton programme:
    Via un .bat qui contient un truc du genre par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    runas /savecred /user:domaine\login "executable"
    Pour un compte local je pense qu un /user:loginlocal devrait passer.

  5. #5
    Membre du Club

    Inscrit en
    Mars 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 63
    Points : 65
    Points
    65
    Par défaut
    Je ne peux même pas tester l'idée parce que ce n'est pas véritablement un programme .exe, je généré une dll qui sera utilisée pour la personnalisation d'une application.

    Ah oui, j'ai oublié de vous dire sur quoi je travaille:
    Windows XP pour les postes clients, et Windows server 2003 pour les serveurs

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    c'est dans quel namespace ImpersonateUser ?

  7. #7
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par sperot51 Voir le message
    c'est dans quel namespace ImpersonateUser ?
    Dans aucun. Le code de la classe est dans le code du premier post.

  8. #8
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    D'après ce post
    http://bytes.com/forum/thread269240.html

    Il faudrait que tu utilises une authentification de type 9 au lieu de type 2 comme tu fais.
    const int LOGON32_LOGON_INTERACTIVE = 2;

  9. #9
    Membre du Club

    Inscrit en
    Mars 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 63
    Points : 65
    Points
    65
    Par défaut
    Citation Envoyé par Skyounet Voir le message
    D'après ce post
    http://bytes.com/forum/thread269240.html

    Il faudrait que tu utilises une authentification de type 9 au lieu de type 2 comme tu fais.
    const int LOGON32_LOGON_INTERACTIVE = 2;
    Merci pour ta réponse mais j'ai toujours le même problème :
    La machine distante est dans le même domaine que ma machine cliente. Ce que je cherche à faire, c'est d'accéder à la machine hôte avec ses identifiants administrateurs.


  10. #10
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Est-ce que tu as essayé avec la classe Impersonator donné dans le lien ?

    http://www.codeproject.com/KB/cs/zetaimpersonator.aspx

  11. #11
    Membre du Club

    Inscrit en
    Mars 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 63
    Points : 65
    Points
    65
    Par défaut
    Citation Envoyé par Skyounet Voir le message
    Est-ce que tu as essayé avec la classe Impersonator donné dans le lien ?

    http://www.codeproject.com/KB/cs/zetaimpersonator.aspx
    Merci pour tes réponses, ça ne fonctionne toujours pas, enfin je m'en doutais parce que voici le prototype:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    using ( new Impersonator( "myUsername", "myDomainname", "myPassword" ) )
    {
       ...
     
       <code that executes under the new context>
     
       ...
    }
    C'est toujours par rapport à un domaine et pas à un nom d'hôte.

  12. #12
    Membre du Club

    Inscrit en
    Mars 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 63
    Points : 65
    Points
    65
    Par défaut
    Vu qu'il n'y a plus d'idées, je poste la solution de contournement que je vais probablement adopter. Je vais creer un compte au niveau du domaine à qui je donnerai des droits admin sur la machine distante. Je pourrai donc utiliser les methodes proposées plus haut.

    Si d'autres idées vous viennent à l'esprit, je serai content de les lire

    Merci en tout cas à tous ceux qui ont participé

    titip

Discussions similaires

  1. [C#]Accéder à un répertoire partagé sur une machine distante
    Par spaceclic dans le forum Windows Forms
    Réponses: 15
    Dernier message: 14/05/2007, 15h43
  2. lancer l'orbd sur une machine distante
    Par [kAd] dans le forum CORBA
    Réponses: 4
    Dernier message: 15/02/2005, 13h20
  3. Tuer un processus sur une machine distante
    Par nuke_y dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 16/11/2004, 09h55
  4. Réponses: 8
    Dernier message: 13/07/2004, 09h00
  5. [Débutant] Connexion sur une machine distante protégée
    Par arthix dans le forum Développement
    Réponses: 3
    Dernier message: 28/08/2003, 09h46

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