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

Windows Discussion :

VEROUILLAGE DE LA MACHINE DE L' UTILISATEUR


Sujet :

Windows

  1. #1
    Membre à l'essai
    Profil pro
    developpeur senior
    Inscrit en
    Octobre 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : developpeur senior

    Informations forums :
    Inscription : Octobre 2004
    Messages : 15
    Points : 24
    Points
    24
    Par défaut VEROUILLAGE DE LA MACHINE DE L' UTILISATEUR
    Bonjour,

    je dois développer une application de quizz mais le client a exigé
    que pendant l' évaluation que l ' utilisateur ne puisse rien faire d autres que l' évaluation.
    le souci est que cette spécification est apparue à une semaine de la livraison alors que le choix d' une application web en html/css/js avait déja été retenue et finalisée.

    mon patron a opté donc pour une application en C# desktop intégrant un component webBrowser embarquant l ' url de l application web
    je voudrais donc au lancement de la dite application

    -Fermer tous les programmes en cours de l' utilisateur sans crasher le système
    -Masquer les icones du bureau
    -Désactiver la barre des taches

    et bien sur les réactiver à la fin de l' évaluation

    Si quelqu' un a des conseils ou déjà fait ce genre de choses , je suis preneur et de préférence une solution en c# ou java

    PS

    j' ai fait des recherches sur google et je cale surtout sur le fait de fermer tous ses programmes sans crasher le système car je ne trouve que des codes
    parcourant en boucle tous les processus actifs et malheureusement les fermant avec le risque de crasher le système

    Cordialement

  2. #2
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 33
    Points : 48
    Points
    48
    Par défaut
    Bonsoir,
    Plutot que de fermer tous les programmes en cours, je propose de jouer avec les fonctions "desktop" pour créer un nouveau desktop (qui est complètement vide par défaut - même pas de shell), et y transférer votre programme. Bien penser à rebasculer vers le desktop d'origine avant de quitter par contre!)
    Faudra pinvoke l'api win 32 par contre (et avoir les droits nécessaires pour le faire sans doute?) (et éventuellement prévoir de désactiver de le ctrl+alt+del?)
    http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

    Après quelques galères (obligé de se déloguer pour quitter le nouveau bureau), voici un exemple minimal, obtenu en modifiant le program.cs d'une appli winform par defaut:
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    using System.Threading;
    namespace WindowsFormsApplication1
    {
        static class Program
        {
            [Flags]
            public enum AccessRight : uint
            {
                DESKTOP_READOBJECTS = 0x00000001,
                DESKTOP_CREATEWINDOW = 0x00000002,
                DESKTOP_CREATEMENU = 0x00000004,
                DESKTOP_HOOKCONTROL = 0x00000008,
                DESKTOP_JOURNALRECORD = 0x00000010,
                DESKTOP_JOURNALPLAYBACK = 0x00000020,
                DESKTOP_ENUMERATE = 0x00000040,
                DESKTOP_WRITEOBJECTS = 0x00000080,
                DESKTOP_SWITCHDESKTOP = 0x00000100,
    
                GENERIC_ALL = (DESKTOP_READOBJECTS | DESKTOP_CREATEWINDOW | DESKTOP_CREATEMENU |
                    DESKTOP_HOOKCONTROL | DESKTOP_JOURNALRECORD | DESKTOP_JOURNALPLAYBACK |
                    DESKTOP_ENUMERATE | DESKTOP_WRITEOBJECTS | DESKTOP_SWITCHDESKTOP)
            };
    
            [Flags]
            public enum AccountHook
            {
                Allow = 1,
                Disallow = 0
            };
    
            public enum HandleInheritance
            {
                Inherit,
                None
            };
    
            [StructLayout(LayoutKind.Sequential)]
            public struct SecAttrib
            {
                public int nLength;
                public IntPtr lpSecurityDescriptor;
                public int bInheritHandle;
            }
    
            [DllImport("user32.dll")]
            public static extern IntPtr OpenDesktop(string lpszDesktop,
                uint dwFlags,
                bool fInherit,
                uint dwDesiredAccess);
    
            [DllImport("user32.dll")]
            public static extern bool SwitchDesktop(IntPtr hDesktop);
    
            [DllImport("user32.dll")]
            public static extern IntPtr CreateDesktop(string lpszDesktop,
                IntPtr lpszDevice,
                IntPtr pDevmode,
                int dwFlags,
                AccessRight dwDesiredAccess,
                IntPtr lpsa);
    
            [DllImport("user32.dll", SetLastError = true)]
            public static extern IntPtr OpenInputDesktop(AccountHook dwFlags, bool fInherit, AccessRight dwDesiredAccess);
    
            [DllImport("user32.dll", EntryPoint = "CloseDesktop", CharSet = CharSet.Unicode, SetLastError = true)]
            [return: MarshalAs(UnmanagedType.Bool)]
            public static extern bool CloseDesktop(IntPtr handle);
    
            [DllImport("user32.dll", SetLastError = true)]
            static extern bool SetThreadDesktop(IntPtr hDesktop);       /// <summary>
            /// Point d'entrée principal de l'application.
            /// </summary>
            [STAThread]
            static void fenetre() // faut que la fenêtre soit créer dans un thread à part, on arrive sur un bureau vide sinon et la seule facon d'en sortir est de se délogguer
            {
                IntPtr hdefault = Program.OpenInputDesktop(Program.AccountHook.Disallow, false, Program.AccessRight.GENERIC_ALL);
                IntPtr hdesk = Program.CreateDesktop("winformtest", IntPtr.Zero, IntPtr.Zero, 0, Program.AccessRight.GENERIC_ALL, IntPtr.Zero);
                if (hdesk != IntPtr.Zero)
                {
                    if (SetThreadDesktop(hdesk)==true)
                        Program.SwitchDesktop(hdesk);
    
                    Application.EnableVisualStyles();
                    Application.SetCompatibleTextRenderingDefault(false);
                    Application.Run(new Form1());
    
                    System.Threading.Thread.Sleep(1000);
                    Program.SwitchDesktop(hdefault);
                    SetThreadDesktop(hdefault);
                }
            }
            static void Main()
            {
                Thread nthread = new Thread(new ThreadStart(Program.fenetre));
                // Start the thread
                nthread.Start();
    
                // Spin for a while waiting for the started thread to become
                // alive:
                while (!nthread.IsAlive) ;
    
                // Put the Main thread to sleep for 1 millisecond to allow oThread
                // to do some work:
                Thread.Sleep(1);
    
                // Wait until oThread finishes. Join also has overloads
                // that take a millisecond interval or a TimeSpan object.
                nthread.Join();
            }
        }
    }
    - fermer la fenêtre fait revenir au bureau par défaut
    - en fait, on peut ctrl + alt + del, mais le gestionnaire de tache est inaccessible car il apparait dans le bureau par defaut!
    - le gestionnaire de tâche ne semble pas pouvoir interagir avec les process d'autre desktop?
    - en cas de problème avec ce bureau, faire ctrl+alt+del pour se déloguer
    - normalement tous les bureaux de la même workstation partage le copier/coller, si c'est problématique, s'inspirer du code pour créer un nouveau worsktation, se déplacer dessus puis créer un nouveau bureau et switcher - bref voir la docs dans le lien ci dessus.

    Donc je pense que cette proposition devrait vous convenir?

Discussions similaires

  1. Réponses: 8
    Dernier message: 30/07/2020, 21h11
  2. Verrouillage de la machine de l'utilisateur
    Par mageec dans le forum C#
    Réponses: 0
    Dernier message: 01/08/2014, 19h40
  3. [WD14] Récuperer des infos de la machine de l'utilisateur
    Par tomenbois dans le forum WinDev
    Réponses: 4
    Dernier message: 06/11/2009, 09h46
  4. Verrouiller la machine quand l'utilisateur est idle
    Par ggnore dans le forum Windows Serveur
    Réponses: 2
    Dernier message: 24/01/2007, 19h30
  5. Réponses: 8
    Dernier message: 13/07/2004, 09h00

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