Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C#] Executer une app en tant que tel ou tel user

Sujet résolu
    7 septembre 2017 à 10:19:25

    Bonjour,

    Celà fait 2 jours que j'essaye de faire en sorte que quand je lance une app que j'ai développé, celle-ci se lance avec un utilisateur spécifique.

    J'ai déjà cherché sur le net et j'ai trouvé ceci, mais suite à plusieurs tests ça n'a rien donné... Est-ce que quelqu'un à une solution?

    J'ai également essayer d'utiliser les network credential sans résultat

    Merci d'avance et bonne journée !

    - snow

    • Partager sur Facebook
    • Partager sur Twitter
    N'aies pas peur d'être curieux, qui n'essaie rien n'a rien :)
      7 septembre 2017 à 10:57:23

      Le premier lien donne une méthode "correct".

      Montrez votre code.

      Pouvez-vous indiquer le besoin initial pour que l'on puisse vous donnez d'autres solutions, peut-être plus pertinentes ?

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        7 septembre 2017 à 11:21:27

        La première méthode me donne une exception win32, je ne sais pas pourquoi... (Je continue de chercher mais pour le moment j'ai rien trouvé)

        [EDIT] Si je mets le user / mdp en commentaire le programme fonctionne très bien. J'ai trouvé ceci, mais dans mon cas ça ne m'aide pas parce que ce n'est pas un shortcut que je voudrais éxecuter

        Voilà le test que j'ai déjà fait :

        System.Diagnostics.Process proc = new System.Diagnostics.Process();
        System.Security.SecureString ssPwd = new System.Security.SecureString();
        proc.StartInfo.UseShellExecute = false;
        proc.StartInfo.FileName = @"C:\Program Files\NetBeans 8.2\bin\netbeans.exe"; //c'est un exemple au pif
        proc.StartInfo.Arguments = "";
        proc.StartInfo.Domain = "domain";
        proc.StartInfo.UserName = "user";
        string password = "1234";
        for (int x = 0; x < password.Length; x++)
          {
              ssPwd.AppendChar(password[x]);
          }
        proc.StartInfo.Password = ssPwd;
        proc.Start();

        L'objectif final serait de pouvoir exécuter directement l'app avec un autre user sans passer par une app externe (j'avoue avoir un doute sur la faisabilité de la chose)

        Sans ça je veux bien essayer de passer par une autre app qui lance celle désiré avec un autre user

        -
        Edité par SnowH52 7 septembre 2017 à 11:52:05

        • Partager sur Facebook
        • Partager sur Twitter
        N'aies pas peur d'être curieux, qui n'essaie rien n'a rien :)
          7 septembre 2017 à 14:10:21

          >La première méthode me donne une exception win32

          Montrez-la nous !!!

          >je ne sais pas pourquoi

          C'est dans le message d'erreur qui va avec l'exception, pourtant. o_O

          >pouvoir exécuter directement l'app avec un autre user sans passer par une app externe

          Ça, c'est pas le besoin initial, c'est un moyen pour contourner un problème, c'est quoi le vrai besoin initial.

          >j'avoue avoir un doute sur la faisabilité de la chose

          Pas trop de souci à ce faire, mais il faut vérifier que c'est la bonne méthode de résolution du besoin initial.

          >Sans ça je veux bien essayer de passer par une autre app qui lance celle désiré avec un autre user

          Pourquoi faire simple quand on peut faire compliquer. :o

          P.S.: pourquoi passer par une SecureString quand on laisse le mot de passe en clair dans le code source donc dans le code exécutable ???

          -
          Edité par bacelar 7 septembre 2017 à 14:11:24

          • Partager sur Facebook
          • Partager sur Twitter
          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
            8 septembre 2017 à 8:02:52

            Je désignais par "la première méthode" celle que j'ai mis dans mon message précédent

            Le message d'erreur est le suivant :

            An unhandled exception of type 'System.ComponentModel.Win32Exception' occurred in System.dll
            
            Additional information: The directory name is invalid

            Et pourtant le directory name est correct (j'ai copié collé depuis l'explorateur windows...) et d'autant plus que si je vire les credentials netbeans se lance correctement

            Le besoin initial est de lancer une app avec un user. Je doute que ce soit faisable avec cette classe. Si vous avez une autre solution à me proposer n'hésitez pas ;)

            Je suis parti sur cette solution alternative parce que je n'ai pas trouver une solution autrement.

            Si vous voulez voir tout le code de la classe le voici, attention les yeux ça pique... J'ai codé dans un projet à part pour faire des tests donc c'est pas hyper propre

            class Auth
                {
                    String user;
                    SecureString safePswd;
                    String pass;
            
                    public Auth()
                    {
                        user = "test";
                        pass = "1234";
                        safePswd = new SecureString();
                        foreach (char c in pass)
                        {
                            safePswd.AppendChar(c);
                        }
                        launchApp();
                    }
            
                    public void launchApp()
                    {
                        System.Diagnostics.Process proc = new System.Diagnostics.Process();
                        System.Security.SecureString ssPwd = new System.Security.SecureString();
                        proc.StartInfo.UseShellExecute = false;
                        proc.StartInfo.FileName = @"C:\Program Files\NetBeans 8.2\bin\netbeans.exe";
                        proc.StartInfo.Arguments = "";
                        proc.StartInfo.Domain = "domain";
                        proc.StartInfo.UserName = user;
                        string password = pass;
                        for (int x = 0; x < password.Length; x++)
                        {
                            ssPwd.AppendChar(password[x]);
                        }
                        proc.StartInfo.Password = ssPwd;
                        proc.Start();
                    }
                }


            et pour le reste il n'y a rien de spécial, je crée juste un objet de la classe ci-dessus

            public partial class Form1 : Form
                {
                    Auth a;
                    public Form1()
                    {
                        InitializeComponent();
                        a = new Auth();
                    }
                }



            • Partager sur Facebook
            • Partager sur Twitter
            N'aies pas peur d'être curieux, qui n'essaie rien n'a rien :)
              8 septembre 2017 à 15:48:59

              >Et pourtant le directory name est correct

              Vous avez vérifié dans le même contexte d'exécution que celui du processus créé ?

              Je vous signale que les droits et les systèmes de fichier sont fonction de l'utilisateur, de son type de compte (interactif ou pas), de la session de sécurité associé programme, etc...

              >et d'autant plus que si je vire les credentials netbeans se lance correctement

              Encore plus d'argument pour le vérifier dans le même contexte d'exécution que celui du processus créé.

              >Le besoin initial est de lancer une app avec un user. Je doute que ce soit faisable avec cette classe.

              C'est tout à fait faisable mais entraîne de la complexité non négligeable.

              J'insiste sur le fait que c'est une solution a un problème mais très certaine pas le "vrai" besoin initial.

              Pensez à répondre mentalement au Pourquoi du Pourquoi du Pourquoi etc... (6 fois minimum selon une croyance populaire).

              Votre approche est, pour moi, très très discutable, car vous avez une information extrêmement sensible (le mot de passe d'un utilisateur) extrêmement facile à récupérer, car dans le code binaire du programme.

              >Si vous avez une autre solution à me proposer n'hésitez pas

              Pour ce type d'acrobatie, il est très souvent préférable de passer par des mécanismes de type Service Windows ( un compte y est associé), les tâches planifiées  ( un compte y est associé), ou une approche type serveur IIS qui ont des mécanismes "d'impersonnalisation" pour prendre automatiquement l'identité de la personne qui s'y authentifie (en plus des comptes IIS associés), etc...

              >Je suis parti sur cette solution alternative parce que je n'ai pas trouver une solution autrement.

              Heu, on est d'accord que c'est un peu le pire des arguments, non ? :lol:

              >J'ai codé dans un projet à part pour faire des tests

              Très bien.

              Manque plus qu'à faire les vérifications dans le BON environnement "d'exécution", et aussi de voir le contenu des InnerException et les callstack de chacune.

              Les exceptions, c'est bourré d'information, mais faut prendre le temps de les lire. :-°

              • Partager sur Facebook
              • Partager sur Twitter
              Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                21 septembre 2017 à 12:35:28

                Bonjour,

                Veuillez excuxer mon retard...

                En fait mon client avait mal formulé sa demande car en réalité ce n'était pas nécessaire de lancer toute l'app avec un utilisateur mais juste une partie du code (celle qui lisait les fichiers en particulier). Donc d'un certain point de vu Bacelar avait raison d'une certaine manière...

                DONC, finalement j'ai pu utiliser ceci, ce qui m'a vraiment beaucoup simplifier la tâche.

                Voilà, j'espère que ça sera utile à d'autres...

                Bonne journée 

                • Partager sur Facebook
                • Partager sur Twitter
                N'aies pas peur d'être curieux, qui n'essaie rien n'a rien :)
                  21 septembre 2017 à 13:26:53

                  Merci pour ce retour et le lien vers cet article de fond.

                  Pouvez-vous succinctement le choix que vous avez appliqué dans le contexte de votre projet ?

                  Encore Merci.

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                    26 septembre 2017 à 12:50:55

                    En gros l'application doit lire des fichiers et les modifier.

                    Le "problème" était que ces fichiers ne pouvaient être accéder que par 1 utilisateur en particulier. Donc j'ai simplement effectué la lecture du fichier et l'écriture de celui-ci avec un utilisateur particulier de cette manière : (attention, il faut créé la classe Impersonator avec le code donné dans le lien précédent).

                    using (new Impersonator("user", "domain.net", "1234"))
                    {
                        //lecture / écriture du fichier
                    }

                    Le mot de passe est en claire, certe mais après avoir vérifier les fichiers binaire sont crypté de base et mon client est satisfait de cette solution

                    J'espère que ça sera utile à d'autres.

                    - snow

                    Ps  : si vous désirez le code la classe impersonator merci de me contacter par MP. Je ne le posterai pas publiquement pour des questions de respect envers la créateur de cette classe (et que celui-ci demande à la base une inscription sur son site pour y avoir accès).

                    -
                    Edité par SnowH52 26 septembre 2017 à 12:54:00

                    • Partager sur Facebook
                    • Partager sur Twitter
                    N'aies pas peur d'être curieux, qui n'essaie rien n'a rien :)
                      26 septembre 2017 à 14:40:15

                      > certe mais après avoir vérifier les fichiers binaire sont crypté de base

                      Ça m'étonnerait, je pense que vous avez pas assez bien vue.

                      Sauf contre-mesures type "ofuscating", tout le code est réversible, donc ces données confidentielles sont facilement accessibles.

                      Si la machine d'exécution est en zone hostile, votre sécurité est compromise.

                      >et mon client est satisfait de cette solution

                      J'espère qu'il ne demandera pas un second avis à un consultant sécurité. :-°

                      >J'espère que ça sera utile à d'autres.

                      Merci pour ce retour, le choix me semble assez pertinent, c'est juste la mise en œuvre qui me fait tiquer.

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                        27 septembre 2017 à 13:59:14

                        Alors que me proposez-vous comme implémentation plus safe sans que je doive me prendre la tête?

                        ça ne peut qu'être bénéfique pour moi au final ^^

                        -
                        Edité par SnowH52 27 septembre 2017 à 14:01:56

                        • Partager sur Facebook
                        • Partager sur Twitter
                        N'aies pas peur d'être curieux, qui n'essaie rien n'a rien :)

                        [C#] Executer une app en tant que tel ou tel user

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown