¿Cómo puedo evitar un bloqueo de pantalla impuesto por la política en Windows 7?

96

Nuestro BOFH corporativo impone la configuración de bloqueo de pantalla con un retraso ridículamente corto. Es frustrante y contraproducente.

¿Hay alguna manera de evitar el bloqueo automático de pantalla? Supongo que no hay forma de anular la configuración implementada por la política, pero tal vez hay un software que imita la actividad del usuario.

Solo pregunto antes de configurar una perpetua rueda del mouse. (¿Consíguelo?)

Gabriel R.
fuente
1
¿Es curioso lo que es "ridículamente corto"?
Carl
No son soluciones temporales como prensas clave y los motores de ratón que va a evitar que la pantalla de bloqueo. ¿Pero estás seguro de que quieres hacer esto? Eludir la seguridad de TI es más que probable que vaya en contra de la política de la compañía, y podría ser un delito que se puede disparar.
Keltari
77
15 minutos. OK, no es tan corto ... a menos que estés en casa, no en un espacio abierto, y también a menudo trabajando en una segunda computadora. Como soy yo, entonces el bloqueo de pantalla es desagradable.
Gabriel R.
Una solución alternativa es no bloquear el protector de pantalla, sino establecer el período de gracia en unas pocas horas. (Ese es el tiempo entre el inicio del protector de pantalla y el tiempo que necesita para ingresar una contraseña. Por lo general, esto se establece en 5 segundos. Por lo tanto, una sacudida rápida con el mouse cuando el protector de pantalla solo se activa lo desactiva. Sin embargo, con un valor más alto puedes tener horas sin contraseña.
Hennes
1
El período de gracia no funciona para mí, mientras que el guión sí. Supongo que mi política corporativa también deshabilita el período de gracia.
Dane Jacob Hampton

Respuestas:

85

Uso un script que titulo idle.vbs:

Dim objResult

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

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

Cada seis segundos, esto alterna rápidamente el bloqueo numérico en el teclado, haciendo que Windows crea que alguien está interactuando con el teclado, evitando el bloqueo de la pantalla. Esto se ejecuta en Windows, no necesita herramientas de desarrollo o scripts para usarlo, solo haga un archivo de texto con .vbs como extensión y haga doble clic en él (o colóquelo en los elementos de inicio).

Editar: puede poner este script en sus elementos de inicio con

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

Para obtener más información sobre el chocoinstalador de CLI Choclatey ( ), consulte:

https://chocolatey.org/

JoshRivers
fuente
@JoshRivers, una forma de detener este script, sin tener que reiniciar la computadora, también sería bueno.
DeeJayh
2
@DeeJayh Creo que puedes encontrar la instancia de wscript.exe en el Administrador de tareas y matarla. Por lo general, no hay muchas instancias de ejecución de ese ejecutable. Probablemente podría hacer una solución automatizada para la terminación ( stackoverflow.com/a/22325745 ) o poniendo código en la sección Do While que vigila un hecho externo. Como hacer que el script cree un archivo al inicio, luego verifique que el archivo exista en While. De esa manera, simplemente podría eliminar el archivo para hacer que finalice el script. (Sin embargo, nunca dejé la cosa, así que solo ejecuto el script y rara vez lo mato con el Administrador de tareas).
JoshRivers
1
En Windows 10, una manera fácil de localizar la carpeta de inicio es mostrar la ventana Inicio-> Ejecutar (por ejemplo, WindowsKey + R) y luego escribir shell:startup. Consulte este sitio para obtener más información thewindowsclub.com/startup-folder-in-windows-8
buzz3791
Para encontrar el script, busque el Host de script basado en Microsoft Windows en su administrador de tareas. O agregue una columna Nombre del proceso y luego busque wscript.exe.
JohnAndrews
Funciona muy bien en una computadora portátil Win10 Surface, ¡que ni siquiera tiene una tecla NumLock física!
Shahar
87

Si Windows Media Player aún está instalado, puede reproducir un video en bucle y minimizarlo (los videos de muestra "Vida Silvestre" funcionan bien para esto). Por defecto, mientras se reproduce un video, la pantalla no se bloqueará.

omaha_brad
fuente
3
¡Gracias! Esta es la solución más simple y efectiva. (Sin embargo, no lo intenté, dejé la compañía hace un tiempo e intenté mantenerme alejado de Windows).
Gabriel R.
55
Confirmo que esto funciona en Windows XP usando un archivo MP3 en lugar de un video.
Alaa Ali
44
Hack brillante!
3
Esto también funciona usando VLC para aquellos que lo prefieren a Windows Media Player
ecoe
44
Funciona bien en Windows 7. ¡Buen truco!
neves
16

Otra opción es el programa gratuito de cafeína . También es gratuito para uso comercial. Desde la página de inicio del programa:

Si tiene problemas con el bloqueo o la suspensión de su PC, la cafeína lo mantendrá despierto. Funciona simulando presionar una tecla cada 59 segundos, por lo que su máquina cree que todavía está trabajando en el teclado, por lo que no bloqueará la pantalla ni activará el protector de pantalla.

La cafeína funciona simulando un evento de activación de teclas F15 cada 59 segundos. De todas las pulsaciones de teclas disponibles, F15 es probablemente la menos intrusiva (¡nunca he visto un teclado de PC con esa tecla!), Y es menos probable que interfiera con su trabajo.

Esta solución estándar también le permite controlar cuándo habilitarla y deshabilitarla:

Al hacer doble clic en el icono del programa, se vacía la cafetera, que es lo que representa el icono, y desactiva temporalmente el programa. Al hacer doble clic nuevamente, se vuelve a llenar el bote y mantendrá su máquina despierta.

Ilya Kurnosov
fuente
8
Estoy esperando el día en que un empleado del gobierno ponga cafeína en su computadora y sucede que algo como Shift + F15 lanza las armas nucleares ...
kazoni
Buena solución fácil de usar, gracias. Parece tener tantas opciones de línea de comandos como gcc, ¡pero no necesito usar ninguna de ellas!
Sam Watkins el
¡La herramienta funciona muy bien para mí! Tuve que instalar Visual C ++ 2008 Redistributable para que funcione. microsoft.com/en-us/download/details.aspx?id=26368
Sincronice el
7

Puede crear una secuencia de comandos AutoIt para presionar continuamente una tecla no utilizada (por ejemplo, activar o desactivar el bloqueo numérico, el bloqueo de desplazamiento), dormir durante un minuto más o menos y repetir. Alternativamente, si usa mucho el teclado, puede hacer que mueva el mouse un píxel más o menos en cualquier dirección.

Si no desea que se ejecute continuamente, también puede iniciar el script como una tarea programada (si tiene acceso) para que se inicie después de que la computadora haya estado inactiva durante algún tiempo.

Y este es un script muy simple para realizar un movimiento invisible del mouse, si no desea entrar en la sintaxis de AutoIt:

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

Este script mueve el cursor del mouse un píxel en la dirección superior izquierda y luego lo devuelve, luego duerme durante 9 minutos ( 540000milisegundos). Cuando se ejecuta el script, puede ver el ícono AutoIt en la bandeja. Puede detenerlo haciendo clic derecho en este icono y eligiendo la opción correspondiente.

Para crear un script, instale AutoIt, haga clic con el botón derecho en cualquier carpeta y elija New> AutoIt v3 Script, asígnele un nombre, haga clic con el botón derecho en este nuevo script, elija Edit, pegue el código proporcionado anteriormente y guárdelo. Incluso puede compilarlo .exe(de nuevo, desde el menú contextual) para comenzar, por ejemplo, desde el Programador de Windows.

Gran descubrimiento o desarrollo, progreso, ruptura, penetracion
fuente
Gracias, lo comprobaré, parece más simple que la configuración de la jaula de la rueda del mouse :)
Gabriel R.
Versión precompilada de este AutoIt Script aquí symantec.com/connect/downloads/…
JJS
5

Compile esto en Visual Studio o C # Express y ejecútelo desde el símbolo del sistema (o haga doble clic en él). Requiere .NET 4.0 o superior. Hace todo lo que buscas.

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;


        }
    }
}
usuario205533
fuente
Lo siento ... en el post anterior todo después de la frase "Buscando". es código y debe compilarse. No se formateó correctamente. El código demuestra algunos pInvoke bastante interesantes para los interesados. Por cierto ... después de compilado, lo puse en mi camino en algún lugar como c: \ windows. De esta manera, si estoy en un indicador de cmd, puedo escribir ImWorkin y estoy listo para ir :)
user205533
1
Puede modificar su respuesta haciendo clic en el enlace de edición debajo de él.
Dennis
edite su primera respuesta y luego elimine esta.
teylyn
66
WTF está arriba con el "¡Solo un momento, estoy calculando algunos valores!" bucle ficticio?
KalEl
66
En respuesta al código c # publicado, generalmente es habitual dar crédito al autor. Ese pasa a ser yo. Publiqué esto hace casi dos años en la pila Overflow, creo.
2

Me gusta usar opciones fáciles e integradas ( sin software adicional ), como un script de PowerShell (gracias https://dmitrysotnikov.wordpress.com/2009/06/29/prevent-desktop-lock-or-screensaver-with-powershell/ ) que usa "f15" como la clave del éxito (gracias a la cafeína. De hecho, es lo que menos interfiere)

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}")
}

Ponga esto en myScriptName.ps1 e inícielo a través del acceso directo del escritorio o la línea de comandos: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -nop "C:\Users\myUser\Desktop\myScriptName.ps1"

ACTUALIZACIÓN: Tal vez hubo algún cambio por parte del administrador, pero esto ya no funciona para mí. Ahora tengo que usar un script de autohotkey de NBirnel: https://github.com/nbirnel/nosleep , este trabajo es perfecto , porque mueve el mouse (sin distraer ningún trabajo)

eli
fuente
Ejecuto el código pero obtengo el siguiente error. Por favor avise 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 quizás tenga que definir la ruta completa a su script, así que no solo "myScriptName.ps1" sino "c: \ path \ to \ myScriptName.ps1"
eli
1

En mi caso, solo esta línea hizo el truco:

SendKeys.Send("{CAPSLOCK}");

Simplemente Timer_Tickcolóquelo en el evento y configure el intervalo del temporizador en, por ejemplo, 60000 ms.

usuario3540753
fuente
1
ok, es bastante tarde para reanudar esta respuesta, pero considera enviar no uno sino dos MAYÚSCULAS si no quieres que grite en el medio de un comentario de STACKOVerflow sin entender por qué (toma un par de minutos escribir este comentario)
Gian Paolo
@GianPaolo tienes razón. Esto es lo que hice. Pensé que estaba claro, pero tal vez debería modificar la respuesta.
user3540753
-1

La forma correcta de manejarlo es:

  • ir al registro donde está la política
  • establece el valor a lo que quieras
  • y alterar los permisos de clave de registro
  • solo negar acceso de escritura a cualquier persona excepto a usted
Ian Boyd
fuente
Cuando los administradores deshabilitan la configuración de bloqueo de pantalla, la edición del registro ya está deshabilitada.
Gabriel R.
@GabrielR. Como administrador, puede modificar la ACL en las claves de registro. Si tengo paciencia, vincularé la charla de Mark Russinovish donde menciona deshacerse de la política de grupo de Microsoft que bloqueó su propia computadora portátil. Si es administrador, tiene el control total de la máquina. Es probable que tenga que comenzar por tomar posesión de las claves de registro, luego otorgarse el control total y luego negarle a cualquier otra persona cualquier cosa excepto el acceso de lectura.
Ian Boyd el
-5

Debe desactivar el "bloqueo de pantalla" / "modo de suspensión" desde el panel de control> opciones de energía> cambiar la configuración del plan. Haga clic en el menú desplegable para "Poner la computadora en suspensión" y seleccione "nunca".

RAJESH BANSAL
fuente
44
Los administradores de dominio pueden tener un bloqueo de pantalla impuesto por la política en Windows.
Gabriel R.