Comment puis-je empêcher un verrouillage d'écran imposé par une stratégie dans Windows 7?

96

Notre entreprise BOFH impose le réglage du verrouillage de l’écran dans un délai ridiculement court. C'est frustrant et contre-productif.

Est-il possible d'empêcher le verrouillage automatique de l'écran? Je suppose qu'il n'y a aucun moyen de remplacer le paramètre appliqué par la stratégie, mais il existe peut-être un logiciel qui imite l'activité de l'utilisateur.

Il suffit de demander avant de configurer une molette de la souris perpétuelle. (tu piges?)

Gabriel R.
la source
1
Juste curieux de savoir ce qu'est "ridiculement court"?
Carl
Il existe des solutions de contournement telles que des presseurs de touches et des souris qui empêchent le verrouillage de l'écran. Mais êtes-vous sûr de vouloir faire cela? Contourner la sécurité informatique est très probablement contraire à la politique de l'entreprise et pourrait constituer une infraction passible de sanctions.
Keltari
7
15 minutes. D'accord, ce n'est pas si court ... sauf si vous êtes à la maison, pas dans un espace ouvert et travaillez souvent aussi sur un deuxième ordinateur. Comme je le suis, le verrouillage de l'écran est odieux.
Gabriel R.
Une solution semi consiste à ne pas bloquer l'économiseur d'écran, mais à définir le délai de grâce à quelques heures. (C’est le temps qui s’écoule entre le démarrage de l’économiseur d’écran et le moment où vous devez entrer un mot de passe. Généralement, il est réglé sur 5 secondes. Un secouement rapide avec la souris lorsque l’économiseur d’écran se déclenche, le désactive. Cependant, avec une valeur plus élevée vous pouvez avoir des heures sans mot de passe
Hennes
1
La période de grâce ne fonctionne pas pour moi, alors que le script fonctionne. Je suppose que ma stratégie d'entreprise désactive également le délai de grâce.
Dane Jacob Hampton

Réponses:

85

J'utilise un script I title idle.vbs:

Dim objResult

Set objShell = WScript.CreateObject("WScript.Shell")    

Do While True
  objResult = objShell.sendkeys("{NUMLOCK}{NUMLOCK}")
  Wscript.Sleep (6000)
Loop

Toutes les six secondes, cette touche bascule rapidement le pavé numérique, ce qui fait croire à Windows que quelqu'un interagit avec le clavier, ce qui empêche le verrouillage de l'écran. Cela fonctionne sur des fenêtres à la vanille, vous n'avez pas besoin d'outils de développement ou de script pour l'utiliser, créez simplement un fichier texte avec l'extension .vbs et double-cliquez dessus (ou placez-le dans vos éléments de démarrage).

Edit: vous pouvez mettre ce script dans vos éléments de démarrage avec

 choco install IdleVbs -source https://www.myget.org/F/joshrivers-utility/

Pour plus d'informations sur le programme d'installation de Choclatey ( choco), veuillez consulter:

https://chocolatey.org/

JoshRivers
la source
Un moyen d'arrêter ce script sans avoir à redémarrer l'ordinateur serait également bien.
DeeJayh
2
@DeeJayh Je pense que vous pouvez simplement trouver l'instance de wscript.exe dans le Gestionnaire des tâches et la tuer. Il n'y a généralement pas beaucoup d'instances de cet exécutable en cours d'exécution. Vous pouvez probablement créer une solution automatisée pour la résiliation ( stackoverflow.com/a/22325745 ) ou en insérant du code dans la section Do While qui surveille un fait externe. Comme si le script créait un fichier au démarrage, puis vérifiez que le fichier existe dans While. De cette façon, vous pouvez simplement supprimer le fichier pour que le script se termine. (Je n'ai jamais quitté la chose, cependant, donc je viens de lancer le script et très rarement le tuer avec le gestionnaire de tâches).
JoshRivers
1
Sous Windows 10, un moyen facile de localiser le dossier de démarrage consiste à afficher la fenêtre Démarrer-> Exécuter (par exemple, WindowsKey + R), puis à taper shell:startup. Voir ce site pour plus d'informations thewindowsclub.com/startup-folder-in-windows-8
buzz3791
Pour rechercher le script, recherchez Microsoft Windows Script Script dans votre gestionnaire de tâches. Ou ajoutez une colonne Nom du processus, puis recherchez wscript.exe.
JohnAndrews
Fonctionne très bien sur un ordinateur portable Win10 Surface - sans clé physique NumLock!
Shahar
87

Si Windows Media Player est toujours installé, vous pouvez lire une vidéo en boucle et la réduire (les exemples de vidéos "Faune" fonctionnent bien pour cela). Par défaut, tant qu'une vidéo est en cours de lecture, l'écran ne se verrouille pas.

omaha_brad
la source
3
Je vous remercie! C'est la solution la plus simple et la plus efficace. (Je ne l'ai pas essayé cependant, j'ai quitté la société il y a quelque temps et j'essaie de rester à l'écart de Windows.)
Gabriel R.
5
Je confirme que cela fonctionne sur Windows XP en utilisant un fichier MP3 au lieu d'une vidéo.
Alaa Ali
4
Hack brillant!
3
Cela fonctionne également avec VLC pour ceux qui le préfèrent avec Windows Media Player
ecoe
4
Fonctionne bien sous Windows 7. Bon bidouillage!
Neves
16

Une autre option est le programme freeware Caffeine . Il est également gratuit pour un usage commercial. À partir de la page d'accueil du programme:

Si vous avez des problèmes de verrouillage ou d’endormissement de votre ordinateur, la caféine le gardera éveillé. Il fonctionne en simulant une pression de touche une fois toutes les 59 secondes. Votre ordinateur pense que vous travaillez toujours au clavier. Ne verrouillez pas l'écran et n'activez pas l'économiseur d'écran.

La caféine simule un événement clé F15 toutes les 59 secondes. Parmi tous les appuis disponibles, F15 est probablement le moins intrusif (je n'ai jamais vu de clavier de PC avec cette touche!) Et le moins susceptible d'interférer avec votre travail.

Cette solution standard vous permet également de contrôler quand l'activer et de la désactiver:

Double-cliquez sur l'icône du programme pour vider la cafetière (ce que représente l'icône) et désactiver temporairement le programme. Double-cliquez à nouveau pour remplir le pot et garder votre machine en veille.

Ilya Kurnosov
la source
8
J'attends le jour où un employé du gouvernement met Caffeine sur son ordinateur et il se trouve que quelque chose comme Shift + F15 lance les armes nucléaires ...
kazoni
Belle solution facile à utiliser, merci. Il semble y avoir autant d'options de ligne de commande que gcc, mais je n'ai pas besoin de les utiliser!
Sam Watkins
L'outil fonctionne très bien pour moi! Je devais installer Visual C ++ 2008 Redistributable pour le faire fonctionner. microsoft.com/en-us/download/details.aspx?id=26368
Synck
7

Vous pouvez créer un script AutoIt pour appuyer continuellement sur une touche inutilisée (par exemple, lui permettre d'activer ou de désactiver le verrouillage du pavé numérique, le verrouillage du défilement), de passer en mode veille environ une minute et de répéter l'opération. Alternativement, si vous utilisez beaucoup le clavier, vous pouvez le faire bouger la souris d'un pixel ou plus dans n'importe quelle direction.

Si vous ne souhaitez pas qu'il continue à fonctionner, vous pouvez également lancer le script en tant que tâche planifiée (si vous y avez accès) pour le lancer après que l'ordinateur soit resté inactif pendant un certain temps.

Et ceci est un script très simple pour effectuer un mouvement de souris invisible, si vous ne voulez pas entrer dans la syntaxe AutoIt:

While True
   Local $pos = MouseGetPos()
   MouseMove($pos[0]-1, $pos[1]-1, 0)
   MouseMove($pos[0], $pos[1], 0)
   Sleep(540000)
WEnd

Ce script déplace le curseur de la souris d’un pixel vers le haut et à gauche, puis le restitue en arrière, puis attend 9 minutes (en 540000millisecondes). Lorsque le script est en cours d'exécution, vous pouvez voir l'icône AutoIt dans la barre d'état. Vous pouvez l'arrêter en cliquant avec le bouton droit de la souris sur cette icône et en choisissant l'option correspondante.

Pour créer un script, installez AutoIt, cliquez avec le bouton droit de la souris sur n'importe quel dossier et choisissez New> AutoIt v3 Script, nommez-le, cliquez avec le bouton droit sur ce nouveau script, choisissez Edit, collez le code fourni ci-dessus et enregistrez. Vous pouvez même le compiler pour .exe(à nouveau, à partir du menu contextuel) pour démarrer, par exemple, à partir du planificateur Windows.

Percée
la source
Merci, je vais y jeter un coup d'œil, semble plus simple qu'une configuration de cage à roulette de souris :)
Gabriel R.
Version précompilée de ce script AutoIt ici symantec.com/connect/downloads/…
JJS
5

Compilez ceci dans Visual Studio ou C # Express et exécutez-le à partir d'une invite de commande (ou double-cliquez dessus). Nécessite .NET 4.0 ou supérieur. Il fait tout ce que vous recherchez.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Threading;
using System.Runtime.InteropServices;
using System.Windows.Forms; 

namespace ImWorkin
{
    class Program
    {
        [FlagsAttribute]
        public enum EXECUTION_STATE : uint
        {
            ES_SYSTEM_REQUIRED = 0x00000001,
            ES_DISPLAY_REQUIRED = 0x00000002,
            ES_CONTINUOUS = 0x80000000
        }
        public SYSTEMTIMEOUTS TimeOuts
        {
            get { return sysTimeouts; }
        }
        public struct SYSTEMTIMEOUTS
        {
            public int BATTERYIDLETIMEOUT;
            public int EXTERNALIDLETIMEOUT;
            public int WAKEUPIDLETIMEOUT;
        }

        [DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        [DllImport("USER32.DLL")]
        public static extern bool SetForegroundWindow(IntPtr hWnd);

        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        static extern EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE flags);

        [DllImport("user32.dll", SetLastError = true, EntryPoint ="SystemParametersInfo")]
        internal static extern int SystemParametersInfo(int uiAction, int uiParam, ref int pvParam, int fWinIni);

        private static System.Threading.Timer preventSleepTimer = null;
        public const int SPI_GETBATTERYIDLETIMEOUT = 252;
        public const int SPI_GETEXTERNALIDLETIMEOUT = 254;
        public const int SPI_GETWAKEUPIDLETIMEOUT = 256;
        public static int Counter = 0;
        public static int timeOutinMS = 0;
        public static int batteryIdleTimer;
        public static int externalIdleTimer;
        public static int wakeupIdleTimer;
        public static SYSTEMTIMEOUTS sysTimeouts;


        static void Main(string[] args)
        {
            Console.WriteLine("You are about to be workin!! Just a moment...I need to calculate a few values.");
            string dots = string.Empty;
            for (int i =2; i < 60; i++)
            {
                dots = "";
                for (int ii = 0; ii < i; ii++)
                {
                    dots = dots + ".";
                }
                Thread.Sleep(100);
                Console.Clear();
                Console.WriteLine("You are about to be workin!! Just a moment...I need to calculate a few values.");
                Console.WriteLine(dots);
            }


            GetSystemTimeOuts();


            if (timeOutinMS < sysTimeouts.BATTERYIDLETIMEOUT)
                timeOutinMS = sysTimeouts.BATTERYIDLETIMEOUT;
            if (timeOutinMS < sysTimeouts.EXTERNALIDLETIMEOUT)
                timeOutinMS = sysTimeouts.EXTERNALIDLETIMEOUT;
            if (timeOutinMS < sysTimeouts.WAKEUPIDLETIMEOUT)
                timeOutinMS = sysTimeouts.WAKEUPIDLETIMEOUT;

            if (timeOutinMS == 0)
                timeOutinMS = 30;

            DisableDeviceSleep();
            Console.WriteLine("");
            Console.WriteLine("");
            Console.WriteLine("OK. I have calculated your computers timeout periods and set the   ");
            Console.WriteLine("necessary hooks. Your computer will not shut off the monitor, will");
            Console.WriteLine("show active in any chat programs,the screensaver is disabled and ");
            Console.WriteLine("the computer will not lock! Anyone looking at you eaither locally ");
            Console.WriteLine("or remotely will think you are hard at work.");
            Console.WriteLine("");
            Console.WriteLine("Now go do something fun...I got your back ;)");
            Console.WriteLine("Oh yeah....if you close this window OR press `q' in this ");
            Console.WriteLine("window you are going to have to actually work.");
            Console.WriteLine("");
            Console.WriteLine("");
            Console.WriteLine("This text will disappear in a 30 seconds. Just in case someone comes ");
            Console.WriteLine("by and reads your screen!");
            Console.WriteLine("");
            Console.WriteLine("");
            Console.WriteLine("Need custom coding? [email protected]");
            while (Console.KeyAvailable == false)
            {
                Thread.Sleep(250);
                ConsoleKeyInfo cki = Console.ReadKey(true);

                if (cki.KeyChar == 'q')
                    break;
            }

        }


        public static void DisableDeviceSleep()
        {
           SetThreadExecutionState(EXECUTION_STATE.ES_SYSTEM_REQUIRED | EXECUTION_STATE.ES_DISPLAY_REQUIRED | EXECUTION_STATE.ES_CONTINUOUS);
           preventSleepTimer = new System.Threading.Timer(new TimerCallback(PokeDeviceToKeepAwake), null, 0, timeOutinMS * 1000);
        }

        public static void EnableDeviceSleep()
        {

           preventSleepTimer.Dispose();
           preventSleepTimer = null;

        }

        private static void PokeDeviceToKeepAwake(object extra)
        {

            Counter++;
            try
            {
                   SetThreadExecutionState(EXECUTION_STATE.ES_SYSTEM_REQUIRED | EXECUTION_STATE.ES_DISPLAY_REQUIRED | EXECUTION_STATE.ES_CONTINUOUS);
                   IntPtr Handle = FindWindow("SysListView32", "FolderView");

                   if (Handle == IntPtr.Zero)
                   {
                       SetForegroundWindow(Handle);
                       SendKeys.SendWait("%1");
                   }

                   if (Counter > 1)
                       Console.Clear();
            } 
            catch 
            {

            }
        }

        public static void GetSystemTimeOuts()  
        {
            sysTimeouts.BATTERYIDLETIMEOUT = -2;
            sysTimeouts.EXTERNALIDLETIMEOUT = -2;
            sysTimeouts.WAKEUPIDLETIMEOUT = -2;


            if (SystemParametersInfo(SPI_GETBATTERYIDLETIMEOUT, 0, ref batteryIdleTimer, 0) == 1)
                sysTimeouts.BATTERYIDLETIMEOUT = batteryIdleTimer;
            else
                sysTimeouts.BATTERYIDLETIMEOUT = -1;

            if (SystemParametersInfo(SPI_GETEXTERNALIDLETIMEOUT, 0, ref externalIdleTimer, 0) == 1)
                sysTimeouts.EXTERNALIDLETIMEOUT = externalIdleTimer;
            else
                sysTimeouts.EXTERNALIDLETIMEOUT = -1;



            if (SystemParametersInfo(SPI_GETWAKEUPIDLETIMEOUT, 0, ref wakeupIdleTimer, 0) == 1)
                sysTimeouts.WAKEUPIDLETIMEOUT = wakeupIdleTimer;
            else
                sysTimeouts.WAKEUPIDLETIMEOUT = -1;


        }
    }
}
utilisateur205533
la source
Désolé .... dans le post ci-dessus tout ce qui est après la phrase "Looking for". est du code et devrait être compilé. Il n'a pas formaté correctement. Le code illustre quelques pInvoke assez cool pour ceux qui sont intéressés. Btw .... après compilé, je viens de le mettre dans mon chemin quelque part comme c: \ windows. De cette façon, si je suis à l'invite de commande, je peux taper ImWorkin et je suis prêt à partir :)
user205533
1
Vous pouvez modifier votre réponse en cliquant sur le lien modifier en dessous.
Dennis
modifiez votre première réponse, puis supprimez-la.
Teylyn
6
WTF est en haut du "Juste un instant, je calcule quelques valeurs!" boucle factice?
Kalel
6
En réponse au code c # posté, il est généralement d'usage de donner crédit à l'auteur. Cela arrive à moi. Je l'ai posté il y a presque deux ans sur stack Overflow, je crois.
2

J'aime utiliser des options simples et intégrées ( sans logiciel supplémentaire ), comme un script PowerShell (merci https://dmitrysotnikov.wordpress.com/2009/06/29/prevent-desktop-lock-or-screensaver-with-powershell/ ) qui utilise le "f15" comme la clé du succès (merci à la caféine. C'est effectivement le moins dérangeant)

param($minutes = 180)

write "... screen will be awake for $minutes"

 $myshell = New-Object -com "Wscript.Shell"

 for ($i = 0; $i -lt $minutes; $i++) {
 write "... screen will be awake for" ($minutes-$i)
 Start-Sleep -Seconds 60    
 $myshell.sendkeys("{F15}")
}

Placez ceci dans myScriptName.ps1 et démarrez-le via le raccourci sur le bureau ou la ligne de commande: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -nop "C:\Users\myUser\Desktop\myScriptName.ps1"

UPDATE: L’administrateur a peut - être changé, mais cela ne fonctionne plus pour moi. Maintenant, je dois utiliser un script autohotkey de NBirnel: https://github.com/nbirnel/nosleep - ce travail est parfait , car déplace la souris (sans gêner le travail)

Eli
la source
Je lance le code mais j'obtiens l'erreur suivante. S'il vous plaît aviser c:\Powershell>powershell -nop myScriptName.ps1 myScriptName.ps1 : The term 'myScriptName.ps1' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. At line:1 char:1 + myScriptName.ps1 + ~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (myScriptName.ps1:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException c:\Powershell>
Sabrina
@Sabrina vous avez peut - être définir le chemin complet à votre script, donc pas seulement « myScriptName.ps1 » mais « c: \ chemin \ \ myScriptName.ps1 »
eli
1

Dans mon cas, seule cette ligne a fait l'affaire:

SendKeys.Send("{CAPSLOCK}");

Il suffit de le mettre dans l' Timer_Tickévénement et de définir l'intervalle du minuteur sur 60000ms, par exemple.

utilisateur3540753
la source
1
ok, il est assez tard pour résumer cette réponse, mais envisagez d’envoyer non pas un mais deux majuscules si vous ne voulez pas que je stoppe ma colère au milieu d’un commentaire, sans comprendre pourquoi (il a fallu quelques minutes pour écrire ce commentaire)
Gian Paolo
@ GianPaolo tu as raison. C'est ce que j'ai fait. Je pensais que c'était clair, mais je devrais peut-être modifier la réponse.
user3540753
-1

La bonne façon de le gérer est de:

  • aller dans le registre où la politique est
  • définir la valeur à ce que vous voulez
  • et modifier les autorisations de clé de registre
  • refuser uniquement l' accès en écriture à quiconque sauf à vous-même
Ian Boyd
la source
Lorsque les administrateurs désactivent les paramètres de verrouillage de l'écran, la modification du registre est déjà désactivée.
Gabriel R.
@ GabrielR. En tant qu'administrateur, vous pouvez modifier la liste de contrôle d'accès sur les clés de registre. Si j'ai la patience, je relierai le discours de Mark Russinovish où il mentionne se débarrasser de la stratégie de groupe Microsoft qui a verrouillé son propre ordinateur portable. Si vous êtes administrateur, vous avez le contrôle total de la machine. Il doit probablement commencer par s'approprier les clés de registre, puis vous accorder un contrôle total, puis refuser à quiconque autre chose que l'accès en lecture.
Ian Boyd
-5

Vous devez désactiver le "verrouillage de l'écran" / "mode veille" dans le panneau de configuration> Options d'alimentation> Modifier les paramètres du programme. Son en cliquez sur le menu déroulant pour "mettre l'ordinateur en veille" et sélectionnez "jamais".

RAJESH BANSAL
la source
4
Les administrateurs de domaine peuvent avoir un verrou d'écran imposé par une stratégie dans Windows.
Gabriel R.