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 :

Logoff utilisateur après X secondes


Sujet :

C#

  1. #1
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2015
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2015
    Messages : 99
    Points : 45
    Points
    45
    Par défaut Logoff utilisateur après X secondes
    Bonjour à tous.

    J'ai développé une application ou des utilisateurs se connectent avec un badge via un lecteur de badge USB.

    Cependant, j'avais besoin de fournir un moyen de déconnexion automatique après X secondes sans activité sur le terminal.

    Je me suis donc servi du projet suivant : https://www.codeproject.com/Articles...56#xx5374356xx

    J'ai intégré la classe Win32.cs à mon projet.

    Cependant, mon problème est le suivant : si je démarre le terminal à 06h du matin et que je souhaite une déconnexion automatique après 2 minutes, le premier utilisateur va se connecter à 06h15, il y aura 13mn que la dernière action sur le PC se sera déroulée. Donc il va déconnecter directement la personne. Ce qui est correct.

    Pour palier à ce problème et comme solution d'urgence j'ai simulé un clic de souris en haut à gauche au moment de la connexion de l'utilisateur : le dernier événement est donc lorsque l'utilisateur passe son badge et le timer peut vraiment commencer.

    Afin de faire plus propre et moins bidouille, j'aimerais savoir s'il est possible avec la classe Win32.cs du projet ci-dessus, réinitialiser le timer au moment de la connexion de la personne. En plus clair : assigner la date de dernière événement de la classe = DateTime.Now (au moment de la connexion)

    Merci.

    Juste pour info voici le code du timer : (pour info, iTimer = 10)

    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
     
    private void tmrLogoff_Tick(object sender, EventArgs e)
            {
               // Je vérifie qu'un matricule est connecté. Si aucun matricule est 
               // connecté alors inutile de lancer une déconnexion
               if (strMatricule != "" && strMatricule != null)
                {
                    // Lorsque le temps depuis la dernière action sur le PC est 
                    // plus grand (en secondes) que la valeur du temps après
                    // lequel je souhaite déconnecté mon utilisateur
                    // alors je le déconnecte.
                    if (Win32_API.Win32.GetIdleTime() > iTimerLogoff * 1000)
                    {
                        LogoffUser();
                    }
                }
             }

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour,

    Peut-être ajouter simplement un test avant la deconnexion : Si le user est connecté depuis plus de X minutes et que inactivité depuix X minutes alors déconnexion.

  3. #3
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2015
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2015
    Messages : 99
    Points : 45
    Points
    45
    Par défaut
    Toujours avec la base de la classe que j'utilise ?

    Il faut donc un 2ème timer ? Comment voir le truc ? Car il faut bien que le user ne soit pas déconnecté s'il touche l'écran sauf SI il ne le touche plus pendant X minutes.

    Merci

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Dans le même timer. Tu stockes quelque part son heure de connexion et dans ton timer, tu testes que CurrentTime - ConnectTime >= X minutes (en plus de ton test sur l'inactivité) pour savoir si tu dois le déconnecter. Donc s'il est connecté depuis moins de X minutes : pas de deconnexion. Si connecté depuis plus de X minutes et pas d'activité depuis plus de X minutes => Déconnexion.

  5. #5
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    C'est pas juste une mauvaise utilisation du timer? Genre il faudrait que le timer se lance uniquement lors de la connexion... Et se désactive quand l'utilisateur est déconnecté.

  6. #6
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    J'y ai bien pensé mais ça ne changerait rien. L'inactivité est testée via l'api GetLastInputInfo(). Que le timer soit arrêté ou pas, l'api retournera le même résultat au déclenchement.

  7. #7
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2015
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2015
    Messages : 99
    Points : 45
    Points
    45
    Par défaut
    Citation Envoyé par ebastien Voir le message
    Dans le même timer. Tu stockes quelque part son heure de connexion et dans ton timer, tu testes que CurrentTime - ConnectTime >= X minutes (en plus de ton test sur l'inactivité) pour savoir si tu dois le déconnecter. Donc s'il est connecté depuis moins de X minutes : pas de deconnexion. Si connecté depuis plus de X minutes et pas d'activité depuis plus de X minutes => Déconnexion.
    J'ai utilisé cette solution !

    Je déclare 2 variables en globale : une de type date et une pour calculer la différence de temps après
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     // Variable de date pour l'heure de connexion test de déconnexion auto
            DateTime dtHeureConnexion;
            TimeSpan tsHConnexionDtNow;
    À la connexion de l'utilisateur avec son badge, dans l'événement, j'assigne la variable dtHeureConnexion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dtHeureConnexion = DateTime.Now;
    Et dans le timer, je calcule la différence de temps dans le TimeSpan déclaré plus haut, je mets les secondes dans une double et je rajoute un && dans le 2ème If

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    private void tmrLogoff_Tick(object sender, EventArgs e)
            {
                if (strMatricule != "" && strMatricule != null)
                {
                    tsHConnexionDtNow = DateTime.Now - dtHeureConnexion;
                    double dblTotalSeconds = tsHConnexionDtNow.Seconds;
     
                    if (Win32_API.Win32.GetIdleTime() > iTimerLogoff * 1000 && dblTotalSeconds > iTimerLogoff)
                    {
                        Reinit();
                    }
                }
            }
    C'est au top !! Merci.

  8. #8
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2015
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2015
    Messages : 99
    Points : 45
    Points
    45
    Par défaut
    Bonjour

    Je suis confronté à un nouveau problème avec la classe Win32.api jointe ci-dessus.

    En effet, sur les PC Windows x64, pour obtenir le temps en secondes je fais ceci Win32_API.Win32.GetIdleTime() / 1000 : divisé par 1000

    Or, sur les PC Windows x86, pour obtenir le temps en secondes je dois faire ceci Win32_API.Win32.GetIdleTime() / 3600 : divisé par 3600

    Hormis tester : Si x86, / 3600 ET SI x64 / 1000, voyez-vous une autre solution ?

    Merci.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2017
    Messages : 10
    Points : 14
    Points
    14
    Par défaut
    non je ne vois pas d'autres solutions mais tu eux faire quelquechose du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int divisor = Environment.Is64BitOperatingSystem ? 1000 : 3600; 
    var idleTime =Win32_API.Win32.GetIdleTime() / divisor;
    Cordialement, Teo

  10. #10
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Cela ne serrait pas plus simple de s'abonner à l'évènement de changement de session pour remettre le compteur à 0 ?
    https://stackoverflow.com/questions/...gon-and-logoff

    Ou lancer ce programme, de déconnexion, à l’ouverture du profil utilisateur, il démarrerai donc avec un compteur à 0.
    Et puis ce n'est peut être pas son rôle au programme d'authentification de surveiller/déconnecter les utilisateurs inactif.

    Une autre idée, mais qui modifierait légèrement le système, serait de remplacer l'écran de veille par l'exécution d'un programme ou une ligne de commande de déconnexion.
    Il n'y à aucun développement à faire pour cette solution, on délègue la surveillance d'activité à Windows et on paramètre la durée au niveau de l'écran de veille.

    De plus si GetIdleTime remonte ce que je pense cela sera dépendant du nombre de processeur ... c'est ingérable.

Discussions similaires

  1. Renvoi de page après x secondes
    Par Him dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 12/10/2006, 17h54
  2. [PHP-JS] Afficher echo après X secondes
    Par @lexx dans le forum Langage
    Réponses: 7
    Dernier message: 19/08/2006, 16h25
  3. Redirection après qq secondes
    Par BnA dans le forum Web
    Réponses: 2
    Dernier message: 13/05/2006, 15h17
  4. Fermer la fenetre après 5 secondes
    Par Sniper37 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 05/01/2006, 11h24
  5. Réponses: 6
    Dernier message: 25/08/2004, 09h50

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