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

C# Discussion :

Comment charger un GUI depuis un service windows?


Sujet :

C#

  1. #1
    Membre actif
    Inscrit en
    Mai 2005
    Messages
    348
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 348
    Points : 281
    Points
    281
    Par défaut Comment charger un GUI depuis un service windows?
    Bonjour à tous,

    La situation est assez simple. D'un coté un service windows, qui tourne donc en tache de fond et qui attend des requêtes.
    à la demande, il est sensé lancer un petit programme. Ce sont en fait des classes encapsulées dans une DLL.
    Le service charge donc l'assembly, créé l'objet et tout va bien jusque là.

    Lors de l'appel de la methode ShowDialog sur l'objet, j'obtiens cette exception:

    Showing a modal dialog box or form when the application is not running in UserInteractive mode is not a valid operation. Specify the ServiceNotification or DefaultDesktopOnly style to display a notification from a service application.
    Alors quelqu'un saurait il comment:
    lancer une application avec gui depuis un service windows?
    "Spécifier" le ServiceNotification ou le DefaultDesktopOnly?

    Je ne pense pas que le problème soit lié à la manière dont je charge l'assembly du programme, ni à comment je le lance. Ce n'est donc pas un problème de code, en tout cas pas avec l'existant. Ce serait plus un problème de code manquant si la configuration du service se fait par là (par le code je veux dire..).

    Toute fois
    Je sais que certains voudront du code alors....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //Charger l'assembly
     Assembly asm = null;
     asm = Assembly.LoadFrom(file);
    Type aftype = asm.GetType("Afficheur");
     
    //Lancer le GUI
    Afficheur mn = (Afficheur)Activator.CreateInstance(aftype);
    mn.ShowDialog();
    mn.Dispose();
    Voilà, je vous remercie tous

  2. #2
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    En fait pour lancer une GUI à partir d'un service windows, il faut autoriser l'utilisateur du service à interagir avec le bureau.
    Tu peux le faire manuellement -> gestionnaire de service -> propriété de ton service -> onglet connexion :
    Si tu utilises le compte système local tu pourras cocher l'option autoriser le service à interagir avec le bureau.
    Attention MS déconseille de le faire. Si tu peux éviter de passer par une GUI lancer par le service, MS préférerait. Bref c'est bien beau mais des fois ce n'est pas possible, c'est le cas pour un service que j'ai dév.
    Par contre je fait le paramètrage à la main donc je ne sais plus si c'est faisable par le code.
    Je te file les liens que j'ai utilisé pour faire mon Service Windows :
    1) Classique, il faut aller à la source
    2) Un autre site très interessant
    3) Grâce à
    4) Et on ne pouvait pas finir sans proposer le tutorial de developpez.com

    Si cela peut t'aider j'en serais ravis

  3. #3
    Membre actif
    Inscrit en
    Mai 2005
    Messages
    348
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 348
    Points : 281
    Points
    281
    Par défaut
    Je te remercie pour ta réponse qui était exactement ce que je cherchais.






    SAUF.... (ben oui sinon ce serait pas drole...) J'ai un autre soucis.

    J'ai déployé mon appli dans windows xp avec le réglage donc et ça marche du feu. Sans soucis, nickel, génial super.

    Par contre, quand je l'ai déployé sur windows server 2003.... tout se passe bien, démarrage aussi nickel tout. Mais quand il est sensé chargé la fenêtre du petit logiciel dont j'ai parlé, il... ne se passe rien !!
    Mais rien de rien. Pas de bugs, pas d'exception, pas de message d'erreur, pas de processus supplémentaire, ni de thread rien! il ne se passe rien!

    Aurais tu un semblant d'explication à ça?

  4. #4
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Deux possibilité à cela :

    1) Tu accèdes au serveur Windows 2003 par le bureau à distance ou un truc du genre. Dans ce cas là il est possible que tu accédes à une session d'ID autre que 0. Et ta petite fenêtre se lance uniquement sur la session d'ID = 0.
    Normalement tu as le moyen de dire ton soft de connection à distance de se connecter sur la session d'ID 0. Si c'est bien se problème tu as de la chance parce que l'autre erreurs possibles ....

    2) Ne te faisons pas languire d'avantage. Ho et puis si laisse moi te parler avant des Rollings Stones .... Nan je plaisante (en plus je ne connais pas grand chose sur eux !!!).
    Bon continuons, la deuxième possibilités c'est la plus chainte -> une règle de sécurité sur ton Windows 2003 Server, prioritaire sur l'option d'interaction avec le bureau, n'autorise pas ton service à lancer la GUI de ton application.
    Dans ce cas là tu es dans la merde car cela peut être n'importe koi comme règle, pas forcément un truc qui dit : "Un service ne peut pas lancer de GUI", cela peut être un truc qui est prévu pour autre chose mais qui à pour effet de bord de ne pas prendre en compte l'option cité plus haut.

    Bref comme j'ai dit c'est la merdre . J'ai eu ce problème et je ne l'ai pas résolu . Ensuite j'ai utilisé une config particulière de Windows Server 2003 distribué dans mon entreprise et avec elle pas de problème

    Sous Xp les règles de sécurité son moins strict

    Bon courage pour trouver la bonne règle et la modifier, enfin si tu en as le droit .

  5. #5
    Membre actif
    Inscrit en
    Mai 2005
    Messages
    348
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 348
    Points : 281
    Points
    281
    Par défaut
    Bon alors je vais tenter de rester optimiste... je ramène le pc sur le bureau...( oui, je l'avais accidentèlement posé sur le bord de la fenêtre.... )

    Alors en fait, il s'agit d'un virtual server windows 2003. L'utilisateur quel qu'il soit (moi compris en tant qu'admin) se connecte via l'outils de Remote Desktop Connection de XP.

    Est ce que ça te permettrait de me dire comment mettre le id dont tu parlais à 0?
    si ça s'applique ici biensur.

  6. #6
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Tu utilises la console mmc comme moi alors
    Bon tout ce que je peut faire c'est te renvoyer à l'aide windows (voir la photo) et à ce site :
    http://www.jurixt.com/xp/xp_02.htm
    Il est assez complet, et là tu comprends enfin ce qu'est le bureau à distance.

  7. #7
    Membre actif
    Inscrit en
    Mai 2005
    Messages
    348
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 348
    Points : 281
    Points
    281
    Par défaut
    bon après ramage et ramage et re-ramage....

    j'ai tenté le lancement d'un nouveau processus plutot que le chargement dans le service.

    Problème classique, si le processus est lancé, son gui lui, n'apparait pas sur le bureau de l'utilisateur.

    Il y aurait il une solution à celà?
    Je peux allouer à mon service tous les droits nécessaires. Tout ce que je veux maintenant, c'est que quand il lance un logiciel, celui-ci s'affiche sur le bureau quelque soit l'utilisateur loggé.

    Merci

  8. #8
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    C'est quelque chose que n'aime pas ms donc alors cela devient difficile.
    Si l'option ne marche pas, le problème viens de ce que j'ai cité plus haut.
    Le service reste le processus père de tous les process qu'il lance, et les process fils de c'est process ont donc un lien de parenté avec le service -> donc pas moyen de contourner de cette manière le problème.

    Peut être en créant une machine virtuelle, à partir du service, qui se connecterais à distance sur ta machine pour lancer ton appli
    Bon ok je part dans un délire

  9. #9
    Membre actif
    Inscrit en
    Mai 2005
    Messages
    348
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 348
    Points : 281
    Points
    281
    Par défaut
    O rage O désespoir...

    Enfin pas encore. Vraiment, j'ai du mal à croire que...
    Enfin, n'il doit bien exister un "composant" dans le système qui est autorisé à intéragir avec le bureau quelque soit l'utilisateur non?

    Prenons l'exemple d'un antivirus. Il pop ses fenêtres quelque soit l'utilisateur non? Comme un firewall d'ailleurs? Comment font ils???
    Ne puis je faire de même avec mon appli?

  10. #10
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Ce sont des applications et non des services.
    En fait ils installent quelque service, les lancent et les pilotent. Mais ce sont des applications qui se lancent uniquement au lancement d'une session. Bien souvent ce n'est qu'une IHM qui offre la configuration de l'outil et le pilotage de ses services.
    Pour piloter leurs services, ils implémentes par exemple des connections http entre le service et l'IHM.
    C'est ce que je vais faire pour piloter l'un de mes services. Un serveur Web dans mon cas.
    Mais si tu veux lancer une application à partir d'un service, tu es un peu coincés. Je ne connais que le moyen que j'ai cité.

  11. #11
    Membre actif
    Inscrit en
    Mai 2005
    Messages
    348
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 348
    Points : 281
    Points
    281
    Par défaut
    Et tu avais raison.
    Un message posté sur la msdn m'est revenu avec une réponse officielle comme quoi, ceci étant une pratique déconseillée par Microsoft, il n'était tout simplement pas possible d'effectuer ce genre de chose.

    J'étais ravis d'apprendre que les têtes bien pensantes de Microsoft avaient déjà réfléchis pour moi et me protégeaient ainsi de mon idiotie en m'interdisant cette pratique.

    Au final, on a du changer l'architecture de l'appli pour palier à ce truc. la joie.

  12. #12
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut

    Quasi 3 ans avant de répondre... Ça a vraiment du être la joie

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

Discussions similaires

  1. Comment lancer Kitchen.bat depuis un service windows sous l'usager système
    Par Jean-Philippe Shields dans le forum kettle/PDI
    Réponses: 1
    Dernier message: 22/06/2012, 17h20
  2. Réponses: 2
    Dernier message: 27/04/2006, 15h22
  3. [C#] Execution d'un fichier VBS depuis un service Windows
    Par 0r3L dans le forum Windows Forms
    Réponses: 2
    Dernier message: 10/11/2005, 22h58
  4. Comment charger un TFrame depuis une dll ?
    Par Millenod dans le forum Langage
    Réponses: 29
    Dernier message: 22/12/2004, 14h48

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