Wie kann ich eine durch Richtlinien erzwungene Bildschirmsperre in Windows 7 verhindern?

96

Unser Unternehmens-BOFH legt die Bildschirmsperre mit einer lächerlich kurzen Verzögerung fest. Es ist frustrierend und kontraproduktiv.

Gibt es eine Möglichkeit, die automatische Bildschirmsperre zu verhindern? Ich würde annehmen, dass es keine Möglichkeit gibt, die durch Richtlinien erzwungene Einstellung zu überschreiben, aber vielleicht gibt es eine Software, die die Benutzeraktivität nachahmt.

Einfach fragen, bevor ich ein Mausrad einrichte. (Kapiert?)

Gabriel R.
quelle
1
Nur neugierig, was "lächerlich kurz" ist?
Carl
Es gibt Problemumgehungen wie Tastendrucker und Mausbewegungen, die verhindern, dass der Bildschirm gesperrt wird. Aber sind Sie sicher, dass Sie dies tun möchten? Die Umgehung der IT-Sicherheit verstößt höchstwahrscheinlich gegen die Unternehmensrichtlinien und kann eine strafbare Handlung darstellen.
Keltari
7
15 Minuten. OK, es ist nicht so kurz ... es sei denn, Sie sind zu Hause, nicht auf freiem Feld und arbeiten häufig an einem zweiten Computer. Wie ich, so ist die Bildschirmsperre widerlich.
Gabriel R.
Eine Problemumgehung besteht darin, den Bildschirmschoner nicht zu blockieren, sondern die Schonfrist auf einige Stunden festzulegen. (Dies ist die Zeit zwischen dem Start des Bildschirmschoners und der Eingabe eines Passworts. Normalerweise ist diese Zeit auf 5 Sekunden eingestellt. Ein schnelles Schütteln mit der Maus, wenn der Bildschirmschoner nur einschaltet, deaktiviert ihn. Allerdings mit einem höheren Wert Sie können Stunden ohne Passwort haben.
Hennes
1
Die Kulanzfrist funktioniert bei mir nicht, während das Skript dies tut. Ich gehe davon aus, dass meine Unternehmensrichtlinie auch die Nachfrist deaktiviert.
Däne Jacob Hampton

Antworten:

85

Ich benutze ein Skript mit dem Titel idle.vbs:

Dim objResult

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

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

Auf diese Weise wird die Tastensperre schnell alle sechs Sekunden umgeschaltet, sodass Windows glaubt, dass jemand mit der Tastatur interagiert, wodurch die Bildschirmsperre verhindert wird. Dies läuft unter Vanille-Fenstern. Sie benötigen keine Entwicklungs- oder Skript-Tools, um es zu verwenden. Erstellen Sie einfach eine Textdatei mit der Erweiterung .vbs und doppelklicken Sie darauf (oder platzieren Sie sie in Ihren Startelementen).

Bearbeiten: Mit können Sie dieses Skript in Ihre Startobjekte einfügen

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

Weitere Informationen zum Choclatey ( choco) CLI-Installationsprogramm finden Sie unter:

https://chocolatey.org/

JoshRivers
quelle
@JoshRivers eine Möglichkeit, dieses Skript zu stoppen, ohne den Computer neu starten zu müssen, wäre auch schön.
DeeJayh
2
@DeeJayh Ich denke, Sie können nur die Instanz von wscript.exe im Task-Manager finden und töten. Normalerweise werden nicht viele Instanzen dieser ausführbaren Datei ausgeführt. Möglicherweise können Sie eine automatisierte Lösung für die Terminierung erstellen ( stackoverflow.com/a/22325745 ) oder Code in den Abschnitt "Do While" einfügen, der auf externe Fakten achtet . Lassen Sie das Skript beim Start eine Datei erstellen und überprüfen Sie, ob die Datei in While vorhanden ist. Auf diese Weise können Sie einfach die Datei löschen, um das Skript zu beenden. (Ich habe die Sache jedoch nie beendet, daher starte ich das Skript nur und beende es sehr selten mit dem Task-Manager.)
JoshRivers
1
Unter Windows 10 können Sie den Startordner auf einfache Weise finden, indem Sie das Start-> Ausführen-Fenster (z. B. WindowsKey + R) anzeigen und dann eingeben shell:startup. Weitere Informationen finden
buzz3791
Um das Skript zu finden, suchen Sie in Ihrem Task-Manager nach Microsoft Windows Based Script Host. Oder fügen Sie eine Spalte Prozessname hinzu und suchen Sie nach wscript.exe.
John Andrews
Funktioniert hervorragend auf einem Win10 Surface-Laptop - der nicht einmal einen physischen NumLock-Schlüssel hat!
Shahar
87

Wenn Windows Media Player noch installiert ist, können Sie ein Video in einer Schleife abspielen und minimieren (die Beispielvideos "Wildlife" funktionieren hierfür einwandfrei). Standardmäßig wird der Bildschirm nicht gesperrt, solange ein Video abgespielt wird.

omaha_brad
quelle
3
Danke! Dies ist die einfachste und effektivste Lösung. (Ich habe es aber nicht ausprobiert, ich habe die Firma vor einiger Zeit verlassen und versucht, mich von Windows fernzuhalten.)
Gabriel R.
5
Ich bestätige, dass dies unter Windows XP mit einer MP3-Datei anstelle eines Videos funktioniert.
Alaa Ali
4
Genialer Hack!
3
Dies funktioniert auch mit VLC für diejenigen, die es Windows Media Player
vorziehen
4
Funktioniert gut in Windows 7. Schöner Hack!
Neves
16

Eine weitere Option ist das Freeware- Programm Caffeine . Es ist auch für die kommerzielle Nutzung kostenlos. Von der Homepage des Programms:

Wenn Sie Probleme haben, Ihren PC zu sperren oder schlafen zu gehen, hält Koffein ihn wach. Es simuliert alle 59 Sekunden einen Tastendruck, sodass Ihr Computer den Eindruck hat, dass Sie immer noch an der Tastatur arbeiten. Es wird also weder der Bildschirm gesperrt noch der Bildschirmschoner aktiviert.

Koffein simuliert alle 59 Sekunden ein F15-Tastendruckereignis. Von allen verfügbaren Tastendrücken ist F15 wahrscheinlich am wenigsten aufdringlich (ich habe noch nie eine PC-Tastatur mit dieser Taste gesehen!) Und beeinträchtigt Ihre Arbeit am wenigsten.

Mit dieser Standardlösung können Sie auch steuern, wann sie aktiviert und deaktiviert werden soll:

Durch Doppelklicken auf das Programmsymbol wird die Kaffeekanne geleert, für die das Symbol steht, und das Programm wird vorübergehend deaktiviert. Ein erneuter Doppelklick füllt den Topf wieder auf und hält Ihre Maschine wach.

Ilya Kurnosov
quelle
8
Ich warte auf den Tag, an dem ein Gov't-Mitarbeiter Koffein auf seinen Computer setzt, und es passiert einfach so, dass Shift + F15 die Atomwaffen startet ...
kazoni
Schöne, einfache Lösung "von der Stange", danke. Scheint ungefähr so ​​viele Befehlszeilenoptionen wie gcc zu haben, aber ich muss keine von ihnen verwenden!
Sam Watkins
Das Tool funktioniert großartig für mich! Ich musste Visual C ++ 2008 Redistributable installieren, damit es funktioniert. microsoft.com/en-us/download/details.aspx?id=26368
Synchronisieren Sie den
7

Sie können ein AutoIt- Skript erstellen, um eine nicht verwendete Taste fortlaufend zu drücken (z. B. die Num-Taste oder die Bildlauf-Taste umschalten), eine Minute lang in den Energiesparmodus zu wechseln und den Vorgang zu wiederholen. Wenn Sie die Tastatur häufig verwenden, können Sie sie auch dazu bringen, die Maus um etwa ein Pixel in eine beliebige Richtung zu bewegen.

Wenn Sie nicht möchten, dass es kontinuierlich ausgeführt wird, können Sie das Skript auch als geplante Aufgabe starten (sofern Sie über Zugriff verfügen), um es zu starten, nachdem der Computer einige Zeit inaktiv war.

Und dies ist ein sehr einfaches Skript, um eine unsichtbare Mausbewegung auszuführen, wenn Sie nicht in die AutoIt-Syntax einsteigen möchten:

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

Dieses Skript bewegt den Mauszeiger um ein Pixel nach links oben und gibt ihn anschließend wieder zurück. Anschließend wird der Ruhezustand für 9 Minuten ( 540000Millisekunden) aktiviert. Wenn das Skript ausgeführt wird, sehen Sie das AutoIt-Symbol in der Taskleiste. Sie können es stoppen, indem Sie mit der rechten Maustaste auf dieses Symbol klicken und die entsprechende Option auswählen.

Um ein Skript zu erstellen, installieren Sie AutoIt, klicken Sie mit der rechten Maustaste in einen Ordner und wählen Sie New> AutoIt v3 Script, benennen Sie ihn, klicken Sie mit der rechten Maustaste auf dieses neue Skript, wählen Sie Edit, fügen Sie den oben angegebenen Code ein und speichern Sie. Sie können es sogar kompilieren .exe(erneut über das Kontextmenü), um beispielsweise Windows Scheduler zu starten.

Durchbruch
quelle
Danke, ich werde es überprüfen, scheint einfacher als ein
Gabriel R.
Vorkompilierte Version dieses AutoIt- Skripts
JJS
5

Kompilieren Sie dies in Visual Studio oder C # Express und führen Sie es an einer Eingabeaufforderung aus (oder doppelklicken Sie darauf). Benötigt .NET 4.0 oder höher. Es macht alles, was Sie suchen.

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;


        }
    }
}
user205533
quelle
Sorry .... im obigen Beitrag steht alles nach dem Satz "Auf der Suche nach." ist Code und sollte kompiliert werden. Es wurde nicht richtig formatiert. Der Code zeigt einige ziemlich coole pInvoke für die Interessierten. Übrigens ... nachdem ich es kompiliert habe, habe ich es einfach irgendwo in meinen Pfad gesetzt, wie z. B. c: \ windows. Auf diese Weise kann ich, wenn ich an einer Eingabeaufforderung bin, ImWorkin eingeben und loslegen :)
user205533
1
Sie können Ihre Antwort ändern, indem Sie auf den Bearbeitungslink darunter klicken .
Dennis
Bitte bearbeite deine erste Antwort und lösche diese.
Teylyn
6
WTF ist mit dem "Moment, ich berechne ein paar Werte!" Dummy-Schleife?
KalEl
6
Als Antwort auf den C # -Code wird üblicherweise dem Autor eine Gutschrift ausgestellt. Das bin zufällig ich. Ich habe dies vor fast zwei Jahren auf Stack Overflow gepostet, glaube ich.
2

Ich verwende gerne einfache und integrierte Optionen ( keine zusätzliche Software ) wie ein Powershell-Skript (danke https://dmitrysotnikov.wordpress.com/2009/06/29/prevent-desktop-lock-or-screensaver-with-powershell/ ), die das "f15" als Schlüssel zum Erfolg verwendet (danke an Koffein. Es ist in der Tat am wenigsten störend)

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

Fügen Sie dies in eine myScriptName.ps1 ein und starten Sie sie über die Desktop-Verknüpfung oder die Befehlszeile: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -nop "C:\Users\myUser\Desktop\myScriptName.ps1"

UPDATE: Vielleicht gab es eine Änderung vom Administrator, aber das funktioniert nicht mehr für mich. Jetzt muss ich ein Autohotkey-Skript von NBirnel verwenden: https://github.com/nbirnel/nosleep - das funktioniert perfekt , weil es bewegt die Maus (ohne die Arbeit abzulenken)

eli
quelle
Ich führe den Code aus, erhalte jedoch den folgenden Fehler. Bitte informieren Sie 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 Vielleicht musst du den vollständigen Pfad zu deinem Skript definieren, also nicht nur "myScriptName.ps1", sondern "c: \ path \ to \ myScriptName.ps1"
eli
1

In meinem Fall hat nur diese eine Zeile den Trick gemacht:

SendKeys.Send("{CAPSLOCK}");

Timer_TickSetzen Sie es einfach in das Ereignis und setzen Sie das Timer-Intervall auf z. B. 60000 ms.

user3540753
quelle
1
ok, es ist ziemlich spät, diese Antwort fortzusetzen, aber überlege, nicht nur eine, sondern zwei CAPSLOCK zu senden, wenn du nicht willst, dass ich mitten in einem STACKOVerflow-Kommentar schreie, ohne zu verstehen, warum (es dauerte ein paar Minuten, diesen Kommentar zu schreiben)
Gian Paolo
@ GianPaolo du hast recht. Das habe ich getan. Ich dachte, es ist klar, aber vielleicht sollte ich die Antwort ändern.
user3540753
-1

Der richtige Umgang damit ist:

  • Gehen Sie in die Registrierung, in der sich die Richtlinie befindet
  • Stellen Sie den Wert auf einen beliebigen Wert ein
  • und ändern Sie die Registrierungsschlüsselberechtigungen
  • nur Verweigern Sie jedem außer Ihnen den Schreibzugriff
Ian Boyd
quelle
Wenn die Administratoren die Einstellungen für die Bildschirmsperre deaktivieren, ist die Bearbeitung der Registrierung bereits deaktiviert.
Gabriel R.
@ GabrielR. Als Administrator können Sie die ACL für die Registrierungsschlüssel ändern. Wenn ich die Geduld habe, verknüpfe ich den Vortrag von Mark Russinovish, in dem er erwähnt, dass er die Microsoft-Gruppenrichtlinie, die seinen eigenen Laptop gesperrt hat, loswird. Als Administrator haben Sie die volle Kontrolle über das Gerät. Es muss wahrscheinlich damit beginnen, den Besitz der Registrierungsschlüssel zu übernehmen, sich dann die volle Kontrolle zu verschaffen und dann irgendjemand anderem etwas außer dem Lesezugriff zu verweigern.
Ian Boyd
-5

Sie sollten die "Bildschirmsperre" / "Energiesparmodus" in der Systemsteuerung> Energieoptionen> Planeinstellungen ändern deaktivieren. Klicken Sie in der Dropdown-Liste auf "Computer in den Ruhezustand versetzen" und wählen Sie "Nie".

Rajesh Banal
quelle
4
Domänenadministratoren können in Windows eine durch Richtlinien erzwungene Bildschirmsperre haben.
Gabriel R.