none
lancement d'un exécutable a partir du code c# RRS feed

  • Question

  • bonjour,

    depuis quelque temps je sollicité beaucoup le forum. je m'en excuse.

    bon mon problème n'ai pas exactement le lancement d'un programme externe puisque j'arrive a le faire voila le code pour ceux qui ne savent pas :

    ProcessStartInfo infoExecutable = new ProcessStartInfo(chemin); //les info du fichier à executer
    infoExecutable.UseShellExecute = false; // true pour afficher la fentre d'execution. false pour la cacher
    Process executable = Process.Start(infoExecutable); // executer le programme
    executable.WaitForExit(); //attente jusqu’à la fin de l'execution du programme (attente synchrone : il ne fait rien jusqu’à la fin de l’exécution du fichier externe)

    mon problème réside est que le fichier externe (à lancer) doit bénéficier de droits supplémentaires lors de son exécution pour lire et écrire sur des fichiers

    j'ai trouvé une solution mais elle ne marche si on remplit plusieurs paramètres que moi je ne connais pas et parfois même l'utilisateur.

    ProcessStartInfo infoExecutable = new ProcessStartInfo(chemin);
    infoExecutable.Domain = "";
    infoExecutable.Password = new SecureString();
    infoExecutable.UserName = "";
    infoExecutable.UseShellExecute = false;
    Process executable = Process.Start(infoExecutable);
    executable.WaitForExit();

    est ce que quelqu'un peut m'aider svp??
    • Modifié ahmedmahdi mercredi 20 février 2013 08:55
    mercredi 20 février 2013 08:54

Réponses

Toutes les réponses

  • Bonjour,

    si tu veux démarrer un processus externe avec des droits supplémentaires, je pense qu'il faudra nécessairement que tu connaisse le username/password de l'utilisateur avec lequel tu vas lancer le processus.

    Si tu ne le connais pas, peut-être peux-tu créer un utilisateur générique pour lancer ton processus avec les droits qu'il te faut.

    Pour ce qui est du lancement lui-même, je pense que ta solution est la bonne. Renseigne bien les propriété de ta classe ProcessStartInfo et ça devrait marcher.

    • La propriété "Domain" n'est nécessaire que si tu utilise un Active Directory. En quel cas, c'est le domaine auquel ton utilisateur appartient.
    • La propriété "Password" est le mot de passe de ton utilisateur. Tu peux l'initialiser en utilisant la méthode AppendChar() pour chaque caractère de ton mot de passe.
    mercredi 20 février 2013 10:44
  • merci pour ta réponse.

    mais moi je ne vais pas lui demander d’écrire son nom d'utilisateur et son mot de passe à chaque écriture (je ne peux pas les sauvegardé pour un soucis de sécurité). il y a surement un moyen pour lancer une application en mode Admin.

    je vais mettre plus de détail sur l'application externe :

    • quand je la lance seule (depuis l'explorateur windows) l'application marche sans problème.
    • quand je fait le process.start(), elle bug (l'application externe).

    Comme tu le vois il n'y a pas beaucoup de droits a donner (je rappel que cette application[externe] lit un fichier[txt] et écrit sur un autre fichier[txt])

    mercredi 20 février 2013 12:50
  • oui, il y'en a si on part sur l'idée de l'admin. Tu peux :

    • Créer une tâche planifiée qui exécutera ton process pour toi avec les droits d'admin. Tu lancera donc la tâche dans ton code C#, elle se charge du reste.
    • La même chose mais avec un service
    • Mettre en place un "manifest" dans ton application externe (si tu as la main dessus) en spécifiant dedans qu'elle nécessite une élévation de privilèges.

    Par contre, il faudra vérifier si l'UAC ne pose pas de problème.

    Ensuite, quand tu dis que l'application bug, qu'est ce que ça signifie exactement ? Tu as un message d'erreur / un log ?

    mercredi 20 février 2013 15:11
  • en faite je ne peux ni modifier ni toucher a l'application externe. je doit juste remplir un fichier avec les données d'entrées. Ensuite a la fin de son exécution, je lit le fichier résultat qu'elle génère.

    • quand je la lance manuellement (double clic sur la souris) elle marche nickel et elle génère les résultats.
    • quand je la lance avec le code c# elle se lance mais elle ne génère pas de résultat (donc elle bug probablement parce qu'elle n'a pas les droits suffisant)

    pour la dernière question .l'application externe (DOS) est un fichier exe qui lance un traitement (que je ne connais pas donc je ne peux pas le recréer ou faire autrement que la lancer) sur un fichier d'entrée pour des résultats. mais celle-ci ne génère aucun résultat.

    mercredi 20 février 2013 15:31
  • Dans ce cas, essaye de passer par une tâche planifiée que tu appellera dans ton code C#. Tu pourras la configurer pour qu'elle exécute ton application externe avec les droits d'administrateur.

    jeudi 21 février 2013 08:16
  • Bonjour

    À la première vue ce n'est pas un problème des droits :

    Normalement, avec double click souris ou avec Process.Start l’appli c’est démarrée avec les mêmes droites. Se dirais que c’est un problème avec les répertoires.

    Avec double click, le répertoire courent c’est le répertoire de l’appli dos, mais avec Process.Start sera, le plus probable, le répertoire de l’application qui lance l’appli DOS.

    Pour debug, essayez de mettre infoExecutable.UseShellExecute = true;

    Comme ça vous avez voir les eventuelles messages d’erreur de l’appli.

    Cordialement,


    Aurel BERA, Microsoft
    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.

    jeudi 21 février 2013 08:21
  • bonjour à tous,

    @Aurel Bera

    j'ai mit le infoExecutable.UseShellExecute = true, mais j'ai toujours le même résultat

    en fait quand l'application bug ou termine son exécution elle s’arrête et pas de message d'erreur. le seule moyen de savoir si elle a bogué ou non c'est de regardé le fichier résultat.

    @fiscaMMC

    Oui mais je doit créer moi même sur la machine la tâche planifié, alors que cette application va être utiliser par des personnes que je n'ai pas accès à leur machine.

    autre détail cette application est exécuter par une autre application (je vous rassure pas au meme moment) codé en VB6 et elle marche sans problème.

    le code d’exécution est :

    ShellExecute Me.hWnd, "Open", PathAppli, vbNullString, Pathwork, SW_HIDE
    


    jeudi 21 février 2013 08:50
  • Bonjour à tous,

    using System.Runtime.InteropServices;
    
    [DllImport("shell32.dll", EntryPoint = "ShellExecute")]
    public static extern long ShellExecute(int hwnd, string cmd, string file, string param1, string param2, int swmode);
    
    /// swmode 0=sw_hide, 5=SW Show
    
    public static string Test()
    {
    
    	ShellExecute (0, "open", "notepad", "", "", 5)
    }
    


    ZGuideTV.NET - administrator/developer

    • Marqué comme réponse ahmedmahdi jeudi 21 février 2013 10:25
    jeudi 21 février 2013 09:34
  • ReBonjour

    L'exemple que vous avez en VB6 me fait penser que vous ne cherchez le fichier de sortie dans le bon répertoire.

    Dans l'exemple VB6 vous spécifiez ahmedmahdi "Pathwork" - le répertoire de travail, ou, par default l'appli dos écrit les fichiers de sortie / lire les fichiers d'entrée selon le cas.

     En .net vous ne spécifiez ça,  et on ne sait pas où l’appli DOS écrit le fichier OUT.
    Essayez de chercher le fichier directement dans le répertoire ou l’appli dos se trouve.

    Cordialement,  


    Aurel BERA, Microsoft
    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.

    • Marqué comme réponse ahmedmahdi jeudi 21 février 2013 10:25
    jeudi 21 février 2013 09:43
  • @Pascal Hubert

    merci pour le code

    @Aurel Bera

    en effet, le fait de spécifier

    infoExecutable.WorkingDirectory=chemin; //le chemin du repertoire du fichier executable

    résous le problème.

    merci encore pour toute vos aide.

    une dernière question mais juste pour connaitre le fonctionnement.

    pourquoi dans le premier cas le code lançait le fichier mais ce dernier ne s’exécute pas correctement alors que le deuxième cas il s’exécute normalement??

    c'est une question pour avoir plus d'informations et ne plus me trompé


    • Modifié ahmedmahdi jeudi 21 février 2013 10:26
    • Marqué comme réponse ahmedmahdi jeudi 21 février 2013 10:26
    jeudi 21 février 2013 10:24