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 :

[2.0][service windows] detection de la session?


Sujet :

C#

  1. #1
    Membre habitué
    Inscrit en
    Février 2004
    Messages
    363
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 363
    Points : 161
    Points
    161
    Par défaut [2.0][service windows] detection de la session?
    Bonjour,

    J'ai fait un petit service windows, et j'aimerais pouvoir detecter si une session est ouverte ou fermée.

    Voici ce que j'ai fait pour le moment :

    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
     
    public partial class timeControlSF2 : ServiceBase
        {
            private static bool sessionOpen = false;
            ...
     
            public timeControlSF2()
            {
                InitializeComponent();
     
                ...
     
                SystemEvents.SessionSwitch += new SessionSwitchEventHandler(SystemEvents_SessionSwitch);
     
            }
            ...
     
    void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
            {
                System.Windows.MessageBox.Show("raison: "+e.Reason.ToString(), "tests",
                       System.Windows.MessageBoxButton.OK,
                       System.Windows.MessageBoxImage.None,
                       System.Windows.MessageBoxResult.OK,
                       System.Windows.MessageBoxOptions.ServiceNotification);
                switch (e.Reason)
                {
                    case SessionSwitchReason.SessionLock: sessionOpen = false; break;
                    case SessionSwitchReason.SessionLogoff: sessionOpen = false;
                        this.mess.Visible = false; this.mess.mess.check = true; break;
                    case SessionSwitchReason.SessionLogon: sessionOpen = true; break;
                    case SessionSwitchReason.SessionUnlock: sessionOpen = true; break;
                }
            }
    Le problème est que mon evenement n'est jamais déclenché, que je verrouille ma session, que je la deverrouille, que je l'ouvre ou la ferme.

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 612
    Points : 338
    Points
    338
    Par défaut
    un service tourne meme si aucune session n'est ouverte?!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.Security.Principal.WindowsIdentity.GetCurrent()
    peut etre que sa pourras t'aider....si retour = null => pas de session courrante??

  3. #3
    Membre habitué
    Inscrit en
    Février 2004
    Messages
    363
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 363
    Points : 161
    Points
    161
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System.Security.Principal.WindowsIdentity.GetCurrent()
    Celà me renvoit le nom d'utilisateur rentré lors de l'enregistrement de mon service.
    Donc ca me renvoit toujours la même chose, même si aucune session utilisateur est ouverte.

  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
    un service tourne meme si aucune session n'est ouverte?!!
    Oui.
    Les services font partis des éléments lancés avant l'ouverture d'une session.
    Sauf bien sur si le démarrage du service est en manuel.

    Le problème est que mon evenement n'est jamais déclenché, que je verrouille ma session, que je la deverrouille, que je l'ouvre ou la ferme.
    Une sessions verrouillée n'est pas fermée, elle est juste verrouillée
    Ferme ta session et rouvre la.

  5. #5
    Membre habitué
    Inscrit en
    Février 2004
    Messages
    363
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 363
    Points : 161
    Points
    161
    Par défaut
    oui, j'ai déjà essayé mais rien n'est détécté, et c'est assez normal.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.Security.Principal.WindowsIdentity.GetCurrent()
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SystemEvents.SessionSwitch
    ne changent pas car ils se basent sur le nom d'utilisateur avec lequel j'ai enregistré mon service, donc même si je n'ai aucune session ouverte visiblement, WindowsIdentity.GetCurrent() me renverra toujours la même chose, et SystemEvents.SessionSwitch ne se déclenchera jamais sur mon service.

    J'ai trouvé la cause du problème mais pas la solution encore. Je cherche encore, si vous avez une solution avant moi, n'hesitez pas, merci!

  6. #6
    Expert éminent
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Points : 7 752
    Points
    7 752
    Par défaut
    On peut le faire en activant l'audit du logon sur la machine et en checkant périodiquement le event log pour voir si des messages de logon (ID dans les 500) apparaissent.
    Je trouve ça un peu trash.

    Sinon je sais pas s'il est possible de créer des logon/logoff script qui envoient des évenements windows à ton service.

  7. #7
    Membre habitué
    Inscrit en
    Février 2004
    Messages
    363
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 363
    Points : 161
    Points
    161
    Par défaut
    j'ai regardé l'observateur d'evenements, et mes logon/logoff ne sont pas detectés.

  8. #8
    Expert éminent
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Points : 7 752
    Points
    7 752
    Par défaut
    ca doit s'activer au niveau des system policies

  9. #9
    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
    Je pense qu'il y a un moyen plus propre en c#, mais si vous ne trouver pas regarder au niveau des objets WMI, je sais que c'est possible.
    Mais je ne connais pas le nom de l'objet à utiliser, peut être celui-ci :
    http://msdn2.microsoft.com/en-us/lib...89(VS.85).aspx

  10. #10
    Membre habitué
    Inscrit en
    Février 2004
    Messages
    363
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 363
    Points : 161
    Points
    161
    Par défaut
    Je viens de tester (en appli console), une requête WMI sur Win32_LogonSession.

    Je recupere plusieurs enregistrement, mais c'est très peu compréhensible. Déjà, pour chaque enregistrement, je ne recupere que 4 Valeurs (AuthentificationPackage, LogonId, LogonType, StartTime), puis les différents LogonType que je recupere sont 0,3,4,5 et 11, pourtant il me semblait que les sessions avec bureau étaient de type 2, et je n'en recupere aucune.

    EDIT:

    J'ai testé en requetant sur Win32_LoggedOnUser, et j'ai pu en sortir que le LogonType 11 est ce qu'il me faut. Cependant, j'ai fait plusieurs tests en verrouillant la session, en redemarrant le poste, en fermant la session puis en la rouvrant, etc.... Et il apparaît que, à moins de redemarrer le poste, toutes mes ouvertures de sessions sont gardées en mémoire, ainsi je me retrouve avec X fois la même session dans Win32_LoggedOnUser, qui est finalement plus un historique qu'un lexique des sessions en cours d'execution.

    Je crois que je vais contourner mon problème et ne pas mettre mon appli en service, mais en appli classique démarrant au demarrage de la session.

    Si vous trouvez, malgré tout, une solution au problème, ça m'interesse.

    Merci encore pour vos réponses.

  11. #11
    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 peux associer des scripts au démarrage d'une session.
    Si tu met en place un tel script s'appliquant à tous les utilisateurs, alors celui-ci peut alerter ton service.
    Mais bon va falloir faire une comme interprocessus.

  12. #12
    Membre habitué
    Inscrit en
    Février 2004
    Messages
    363
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 363
    Points : 161
    Points
    161
    Par défaut
    Citation Envoyé par ced600 Voir le message
    Tu peux associer des scripts au démarrage d'une session.
    Si tu met en place un tel script s'appliquant à tous les utilisateurs, alors celui-ci peut alerter ton service.
    Mais bon va falloir faire une comme interprocessus.

    Sauf qu'il m'en faudrait un de script à la fermeture, et au verrouillage/deverrouillage de la session, ce qui n'est pas possible.
    Si encore, avec WMI, j'avais pu recuperer quelque chose dans la variable Status de Win32_LogonSession, j'aurais pu gerer avec, mais impossible de recuperer ce foutu etat de session.

  13. #13
    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
    Citation Envoyé par bakonu Voir le message
    Sauf qu'il m'en faudrait un de script à la fermeture, et au verrouillage/deverrouillage de la session, ce qui n'est pas possible.
    Si encore, avec WMI, j'avais pu recuperer quelque chose dans la variable Status de Win32_LogonSession, j'aurais pu gerer avec, mais impossible de recuperer ce foutu etat de session.
    Tu peux aussi rajouter un script à la fermeture de la session, quand au verrouilage, je ne sais pas.

    as tu essayé avec cette classe ? :
    http://msdn2.microsoft.com/en-us/lib...22(VS.85).aspx

    Regarde si tu ne peux pas utiliser la dll user32.dll, elle pourrait fournir des méthodes qui te permettrais d'obtenir ce que tu souhaites.

  14. #14
    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
    En utilisant une combo ManagementEventWatcher + Win32_Session, tu dois arriver à ce que tu souhaites faire.

  15. #15
    Membre habitué
    Inscrit en
    Février 2004
    Messages
    363
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 363
    Points : 161
    Points
    161
    Par défaut
    merci pour ta réponse, j'ai testé avec ce code :

    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
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Management;
     
    namespace testWMI
    {
        class Program
        {
            static void Main(string[] args)
            {
                WqlEventQuery query = new WqlEventQuery("__InstanceOperationEvent",
                    new TimeSpan(0, 0, 1),
                    "TargetInstance isa \"Win32_Session\"");
     
                ManagementEventWatcher watcher = new ManagementEventWatcher();
                watcher.Query = query;
                watcher.Options.Timeout = new TimeSpan(0, 10, 0);
     
                Console.WriteLine("session watcher started: ");
     
                watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived);
                watcher.Start();
     
                do{
                    Console.WriteLine("press ESC to escape!");
                }while(Console.ReadKey(true).Key != ConsoleKey.Escape);
     
                watcher.Stop();
            }
     
            static void watcher_EventArrived(object sender, EventArrivedEventArgs e)
            {
                Console.WriteLine(((ManagementBaseObject)e.NewEvent["TargetInstance"]).GetText(TextFormat.Mof));
            }
        }
    }
    je l'ai testé avec Win32_Process et ça a marché (même trop bien, c'est fou ce que nos process bougent), puis sur Win32_LogonSession, et ça n'a pas marché (testé sur un verrouillage/deverrouillage de session).
    J'ai donc testé sur Win32_Session, et ça n'a pas marché non plus (rien ne s'affiche).

  16. #16
    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
    Un verrouillage n'est pas une ouverture de session... Essaie en ouvrant/fermant la session.

  17. #17
    Membre habitué
    Inscrit en
    Février 2004
    Messages
    363
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 363
    Points : 161
    Points
    161
    Par défaut
    oui je sais mais j'ai besoin de detecter le verrouillage/deverrouillage aussi........
    je vais tester quand même avec la fermeture ouverture, on verra ce que ca donne.


    EDIT :

    Après tests, toute ouverture de session déclenche un événement, cependant, quand j'ai fermé ma session, aucun événement n'a été déclenché, c'est quand j'ai redemarré mon post que l'événement de fermeture de session s'est déclenché.

    Puis, lors du déclenchement de mes événements, impossible de récupérer le Status, je ne peux pas faire la difference entre l'ouverture et la fermeture (quoique je peux faire 2 watchers, un pour les créations, un autre pour les suppressions).

Discussions similaires

  1. Ouverture d'une session desktop depuis un service Windows
    Par jesus144 dans le forum Services Windows
    Réponses: 0
    Dernier message: 13/08/2010, 16h56
  2. Réponses: 1
    Dernier message: 24/06/2010, 14h24
  3. Réponses: 1
    Dernier message: 17/05/2010, 17h23
  4. Service Windows arrêté à la fermeture d'une session Windows
    Par dlayla4 dans le forum Windows Forms
    Réponses: 8
    Dernier message: 19/02/2008, 15h53
  5. service windows et detection d'appui sur le bouton "del" du clavier?
    Par Jayceblaster dans le forum Windows Forms
    Réponses: 25
    Dernier message: 06/11/2007, 16h32

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