題 如何防止Windows 7中的策略強制屏幕鎖定?


我們的企業BOFH強加了屏幕鎖定設置,延遲時間非常短暫。這令人沮喪,適得其反。

有沒有辦法防止自動屏幕鎖定?我認為沒有辦法覆蓋策略強制設置,但可能有一個模仿用戶活動的軟件。

在我設置一個永久鼠標滾輪之前問一下。 (得到它?)


77
2017-08-30 08:32


起源


只是好奇什麼“荒謬的短”是什麼? - Carl
那裡 是 解決方案,如關鍵壓腳和鼠標移動器,將阻止屏幕鎖定。但你確定要這麼做嗎?規避IT安全很可能違反公司政策,並且可能是一種可以起訴的攻擊。 - Keltari
15分鐘。好吧,它不是那麼短......除非你在家裡,不是在開放空間,而且經常在第二台電腦上工作。像我一樣,屏幕鎖定是令人討厭的。 - Gabriel R.
一個半解決方法是不阻止屏幕保護程序,而是將寬限期設置為幾個小時。 (這是屏幕保護程序啟動和輸入密碼所需時間之間的時間。通常設置為5秒。因此,當屏幕保護程序啟動時,用鼠標快速搖動可以禁用它。但是值較高你可以有幾個小時沒有密碼。 - Hennes
寬限期 對我來說不起作用 劇本 確實。我假設我的公司政策也禁用了寬限期。 - Dane Jacob Hampton


答案:


我使用腳本我標題idle.vbs:

Dim objResult

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

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

每六秒鐘,這會快速切換鍵盤上的numlock,導致Windows認為有人正在與鍵盤交互,從而阻止屏幕鎖定。這在vanilla窗口上運行,您不需要開發或腳本工具來使用它,只需創建一個帶.vbs作為擴展名的文本文件並雙擊它(或將其放在啟動項中)。

編輯:您可以將此腳本放在啟動項中

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

有關Choclatey的更多信息(choco)CLI安裝程序請參閱:

https://chocolatey.org/


66
2017-11-05 18:54



@JoshRivers一種方法來停止這個腳本,而不必重新啟動計算機,也會很好。 - DeeJayh
@DeeJayh我想你可以在任務管理器中找到wscript.exe的實例並將其刪除。通常沒有很多可執行文件的實例在運行。您可以製作終止的自動解決方案(stackoverflow.com/a/22325745)或者通過將代碼放入Do While部分來監視外部事實。就像腳本在啟動時創建文件一樣,然後檢查文件是否存在於While中。這樣你就可以刪除文件以使腳本終止。 (但我從不放棄這個東西,所以我只是運行腳本,很少用任務管理器殺掉它)。 - JoshRivers
在Windows 10上,找到啟動文件夾的簡單方法是顯示“開始” - >“運行”窗口(例如WindowsKey + R),然後鍵入 shell:startup。有關詳細信息,請訪問此站點 thewindowsclub.com/startup-folder-in-windows-8 - buzz3791
要在任務管理器中查找腳本,請查找基於Microsoft Windows的腳本宿主。或者添加列Process Name,然後查找wscript.exe。 - JohnAndrews


如果仍然安裝了Windows Media Player,您可以循環播放視頻並將其最小化(示例“野生動物”視頻可以正常工作)。默認情況下,只要正在播放視頻,屏幕就不會鎖定。


74
2018-04-10 17:22



謝謝!這是最簡單,最有效的解決方案。 (雖然我沒試過,但是我剛離開公司,試圖遠離Windows。) - Gabriel R.
我確認這適用於使用MP3文件而不是視頻的Windows XP。 - Alaa Ali
精彩的黑客!
對於那些喜歡VLC而不是Windows Media Player的人來說,這也適用 - ecoe
偉大的黑客。我建立了一個小的空白視頻和批處理腳本來啟動它。文件在 box.net 和博客文章 我的個人網站 - Eric Cloninger


另一種選擇是免費軟件 咖啡因 程序。它也可以免費用於商業用途。從該計劃的主頁:

如果你的電腦鎖定或睡覺有問題,咖啡因會讓它保持清醒。它的工作原理是每59秒模擬一次按鍵,因此您的機器認為您仍然在鍵盤上工作,因此不會鎖定屏幕或激活屏幕保護程序。

咖啡因的工作方式是每59秒模擬一次F15按鍵事件。在所有可用的按鍵中,F15可能是最不具侵入性的(我從未見過帶有該鍵的PC鍵盤!),並且最不可能干擾您的工作。

這種現成的解決方案還允許您控制何時啟用它並禁用它:

雙擊程序圖標會清空咖啡壺,這就是圖標所代表的內容,並暫時禁用該程序。再次雙擊它會重新填充鍋,並保持機器清醒。


10
2018-06-24 17:31



我正在等待Gov't員工將咖啡因放在他們的電腦上的那一天,就像Shift + F15這樣的東西推出核武器...... - kazoni
很好的“現成”解決方案,謝謝。似乎有與gcc一樣多的命令行選項,但我不需要使用它們中的任何一個! - Sam Watkins


你可以創建一個 AutoIt的 腳本要么連續按下未使用的鍵(例如,使其切換數字鎖定,滾動鎖定),睡眠一分鐘左右,然後重複。或者,如果您經常使用鍵盤,則可以將鼠標向任意方向移動一個像素左右。

如果您不希望它繼續運行,您還可以將腳本作為計劃任務啟動(如果您有權訪問),以便在計算機處於非活動狀態一段時間後啟動。

如果您不想進入AutoIt語法,這是一個非常簡單的腳本來執行不可見的鼠標移動:

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

此腳本將鼠標光標向左上方向移動一個像素,然後將其返回,然後休眠9分鐘(540000 毫秒)。腳本運行時,您可以在托盤中看到AutoIt圖標。您可以停止右鍵單擊此圖標並選擇相應的選項。

要製作腳本,請安裝AutoIt,右鍵單擊任何文件夾並選擇 New > AutoIt v3 Script,命名它,右鍵單擊這個新腳本,選擇 Edit,粘貼上面提供的代碼並保存。你甚至可以編譯它 .exe (再次,從上下文菜單),例如,從Windows Scheduler啟動。


7
2017-08-30 14:59



謝謝,我會檢查出來,看起來比鼠標輪籠設置簡單:) - Gabriel R.
此AutoIt腳本的預編譯版本 symantec.com/connect/downloads/... - JJS


在Visual Studio或C#Express中編譯它並從命令提示符運行它(或雙擊它)。需要.NET 4.0或更高版本。它可以滿足您的一切需求。

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? Kenneth.gore@gmail.com");
            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;


        }
    }
}

5
2018-03-09 03:28



對不起....在上面的帖子中寫著“尋找”之後的所有內容。是代碼,應該編譯。它格式不正確。該代碼為那些感興趣的人展示了一些非常酷的pInvoke。順便說一句....編譯後,我只是把它放在我的路徑,如c:\ windows。這樣,如果我在cmd提示符下,我可以輸入ImWorkin,我很高興去:) - user205533
您可以單擊以修改答案 編輯 它下面的鏈接。 - Dennis
請編輯您的第一個答案,然後刪除此答案。 - teylyn
WTF與“只是片刻,我正在計算一些價值!”虛擬循環? - KalEl
為了回應c#代碼,通常習慣性地將其歸功於作者。那恰好是我。我差不多兩年前在堆棧上發布這個溢出我相信。


有一個名為“Timeout Blocker”的安卓應用程序會間隔振動,你可以將鼠標放在它上面。它說不要在工作中使用它。 https://play.google.com/store/apps/details?id=com.isomerprogramming.application.timeoutblocker&hl=en


5
2018-06-06 21:36





在我的情況下,只有這一行做了伎倆:

SendKeys.Send("{CAPSLOCK}");

把它放進去吧 Timer_Tick 事件並將定時器間隔設置為例如60000毫秒。


1
2017-12-30 08:17



好吧,現在恢復這個答案已經很晚了,但是如果你不想讓我在STACKOVerflow評論的中間發表評論而不理解為什麼(考慮這篇評論花了幾分鐘),那麼考慮發送一個而不是兩個CAPSLOCK - Gian Paolo
@GianPaolo你是對的。這就是我所做的。我覺得很清楚,但也許我應該修改答案。 - user3540753


Mouse Jiggler可能是一個選項: https://mousejiggler.codeplex.com/


1
2018-05-23 06:00



這很棒:) - sunil


我喜歡用 簡單 和 集成 選項(沒有其他軟件),像powershell腳本(謝謝 https://dmitrysotnikov.wordpress.com/2009/06/29/prevent-desktop-lock-or-screensaver-with-powershell/)使用“f15”作為成功的關鍵(對咖啡因而言,它確實是最不干擾的)

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

將其放入myScriptName.ps1並通過桌面快捷方式或命令行啟動它: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -nop "C:\Users\myUser\Desktop\myScriptName.ps1"


1
2018-01-16 14:55