Làm cách nào tôi có thể ngăn khóa màn hình được thi hành theo chính sách trong Windows 7?


96

BOFH công ty của chúng tôi áp đặt cài đặt khóa màn hình với độ trễ ngắn vô lý. Thật là bực bội và phản tác dụng.

Có cách nào để ngăn chặn khóa màn hình tự động? Tôi cho rằng không có cách nào để ghi đè cài đặt được thi hành theo chính sách, nhưng có thể có một phần mềm bắt chước hoạt động của người dùng.

Chỉ cần hỏi trước khi tôi thiết lập một bánh xe chuột vĩnh viễn. (hiểu rồi?)


1
Chỉ tò mò "ngắn một cách lố bịch" là gì?
Carl

các cách giải quyết như máy ép phím và máy di chuột sẽ ngăn màn hình bị khóa. Nhưng bạn có chắc chắn muốn làm điều này? Bảo mật CNTT có khả năng chống lại chính sách của công ty và có thể là một hành vi phạm tội có thể xảy ra.
Keltari

7
15 phút. OK, nó không quá ngắn ... trừ khi bạn ở nhà, không ở trong không gian mở và cũng thường xuyên làm việc trên máy tính thứ hai. Giống như tôi, vì vậy khóa màn hình là đáng ghét.
Gabriel R.

Một cách giải quyết khác không phải là chặn trình bảo vệ màn hình, mà là đặt thời gian gia hạn thành vài giờ. . bạn có thể có nhiều giờ mà không cần mật khẩu.
Hennes

1
Thời gian ân hạn không làm việc cho tôi, trong khi kịch bản thì có. Tôi cho rằng chính sách công ty của tôi cũng vô hiệu hóa thời gian ân hạn.
Dane Jacob Hampton

Câu trả lời:


85

Tôi sử dụng một tập lệnh tôi đặt tiêu đề idle.vbs:

Dim objResult

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

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

Cứ sau sáu giây, điều này sẽ nhanh chóng bật khóa trên bàn phím, khiến Windows tin rằng ai đó đang tương tác với bàn phím, ngăn chặn khóa màn hình. Điều này chạy trên các cửa sổ vanilla, bạn không cần các công cụ phát triển hoặc kịch bản để sử dụng nó, chỉ cần tạo một tệp văn bản với .vbs làm phần mở rộng và nhấp đúp vào nó (hoặc đặt nó vào các mục khởi động của bạn).

Chỉnh sửa: bạn có thể đặt tập lệnh này vào các mục khởi động của mình với

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

Để biết thêm thông tin về trình chococài đặt CLI Choclatey ( ), vui lòng xem:

https://chatioatey.org/


@JoshRivers một cách để ngăn chặn tập lệnh này, mà không phải khởi động lại máy tính, cũng sẽ rất tốt.
DeeJayh

2
@DeeJayh Tôi nghĩ bạn chỉ cần tìm ví dụ của wscript.exe trong Trình quản lý tác vụ và tiêu diệt nó. Thường không có nhiều phiên bản chạy thực thi đó. Bạn có thể có thể tạo một giải pháp tự động để chấm dứt ( stackoverflow.com/a/22325745 ) hoặc bằng cách đặt mã trong phần Do While theo dõi thực tế bên ngoài. Giống như có tập lệnh tạo một tệp khi khởi động, sau đó kiểm tra xem tệp có tồn tại trong While không. Bằng cách đó bạn chỉ có thể xóa tệp để làm cho tập lệnh kết thúc. (Tuy nhiên, tôi không bao giờ bỏ thứ đó, vì vậy tôi chỉ chạy tập lệnh và rất hiếm khi giết nó bằng Trình quản lý tác vụ).
JoshRivers

1
Trên Windows 10, một cách dễ dàng để xác định vị trí thư mục khởi động là hiển thị cửa sổ Start-> Run (ví dụ: WindowsKey + R) và sau đó nhập shell:startup. Xem trang web này để biết thêm thông tin thewindowsclub.com/startup-folder-in-windows-8
buzz3791

Để tìm tập lệnh, hãy tìm Microsoft Windows Dựa Script Host trong trình quản lý tác vụ của bạn. Hoặc thêm một tên Tên quy trình và sau đó tìm wscript.exe.
JohnAndrews

Hoạt động tốt trên máy tính xách tay Win10 Surface - thậm chí không có phím NumLock vật lý!
Shahar

87

Nếu Windows Media Player vẫn được cài đặt, bạn có thể phát video trên vòng lặp và thu nhỏ nó (video "Động vật hoang dã" mẫu hoạt động tốt cho việc này). Theo mặc định, miễn là video đang phát, màn hình sẽ không khóa.


3
Cảm ơn bạn! Đây là giải pháp đơn giản nhất, hiệu quả nhất. (Mặc dù tôi đã không thử nó, tôi đã rời công ty một thời gian trước và cố gắng tránh xa Windows.)
Gabriel R.

5
Tôi xác nhận rằng tính năng này hoạt động trên Windows XP bằng tệp MP3 thay vì video.
Alaa Ali

4
Rực rỡ hack!

3
Điều này cũng hoạt động bằng cách sử dụng VLC cho những người thích nó hơn Windows Media Player
ecoe

4
Hoạt động tốt trong Windows 7. Hack đẹp!
Neves

16

Một lựa chọn khác là chương trình Caffeine miễn phí . Nó là miễn phí cho sử dụng thương mại là tốt. Từ trang chủ của chương trình:

Nếu bạn gặp vấn đề với khóa PC hoặc đi ngủ, caffeine sẽ giữ cho nó tỉnh táo. Nó hoạt động bằng cách mô phỏng một lần bấm phím cứ sau 59 giây, do đó máy của bạn nghĩ rằng bạn vẫn đang làm việc với bàn phím, vì vậy sẽ không khóa màn hình hoặc kích hoạt trình bảo vệ màn hình.

Caffeine hoạt động bằng cách mô phỏng một sự kiện khóa F15 cứ sau 59 giây. Trong tất cả các lần nhấn phím có sẵn, F15 có lẽ là ít xâm nhập nhất (tôi chưa bao giờ thấy bàn phím PC có phím đó!) Và ít có khả năng can thiệp vào công việc của bạn.

Giải pháp sẵn có này cũng cho phép bạn kiểm soát thời điểm kích hoạt và vô hiệu hóa nó:

Bấm đúp vào biểu tượng chương trình làm trống bình cà phê, đó là những gì biểu tượng đại diện và tạm thời vô hiệu hóa chương trình. Nhấp đúp vào nó một lần nữa để đổ đầy nồi, và sẽ giữ cho máy của bạn luôn hoạt động.


8
Tôi đang chờ đợi một ngày khi một nhân viên của Chính phủ đặt Caffeine vào máy tính của họ và thật bất ngờ là một thứ như Shift + F15 ra mắt các hạt nhân ...
kazoni

Đẹp dễ dàng "ra khỏi kệ" giải pháp, cảm ơn. Có vẻ như có nhiều tùy chọn dòng lệnh như gcc, nhưng tôi không cần sử dụng bất kỳ tùy chọn nào trong số chúng!
Sam Watkins

Công cụ này hoạt động rất tốt cho tôi! Tôi đã phải cài đặt Visual C ++ 2008 Redistributable để nó hoạt động. microsoft.com/en-us/doad/details.aspx?id=26368
Synck

7

Bạn có thể tạo tập lệnh AutoIt để liên tục nhấn một phím không sử dụng (ví dụ: làm cho nó chuyển đổi khóa num, khóa cuộn), ngủ trong một phút hoặc lâu hơn và lặp lại. Ngoài ra, nếu bạn sử dụng bàn phím nhiều, bạn có thể làm cho nó di chuyển chuột theo pixel hoặc theo bất kỳ hướng nào.

Nếu bạn không muốn nó liên tục chạy, bạn cũng có thể khởi chạy tập lệnh dưới dạng tác vụ theo lịch trình (nếu bạn có quyền truy cập) để khởi chạy sau khi máy tính không hoạt động được một thời gian.

Và đây là một tập lệnh rất đơn giản để thực hiện di chuyển chuột vô hình, nếu bạn không muốn vào cú pháp AutoIt:

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

Kịch bản lệnh này di chuyển con trỏ chuột theo một pixel theo hướng lên trên bên trái và sau đó quay trở lại, sau đó ngủ trong 9 phút ( 540000mili giây). Khi tập lệnh đang chạy, bạn có thể thấy biểu tượng AutoIt trong khay. Bạn có thể dừng nó nhấp chuột phải vào biểu tượng này và chọn tùy chọn tương ứng.

Để tạo tập lệnh, cài đặt AutoIt, nhấp chuột phải vào bất kỳ thư mục nào và chọn New> AutoIt v3 Script, đặt tên cho nó, nhấp chuột phải vào tập lệnh mới này, chọn Edit, dán mã được cung cấp ở trên và lưu. Bạn thậm chí có thể biên dịch nó thành .exe(một lần nữa, từ menu ngữ cảnh) để bắt đầu, ví dụ, từ Bộ lập lịch Windows.


Cảm ơn, tôi sẽ kiểm tra xem, có vẻ đơn giản hơn so với thiết lập lồng bánh xe chuột :)
Gabriel R.

Phiên bản được biên dịch sẵn của Tập lệnh AutoIt này tại đây symantec.com/connect/doads/,
JJS

5

Biên dịch cái này trong Visual Studio hoặc C # Express và chạy nó từ một dấu nhắc lệnh (hoặc nhấp đúp vào nó). Yêu cầu .NET 4.0 trở lên. Nó làm mọi thứ bạn đang tìm kiếm.

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;


        }
    }
}

Xin lỗi .... trong bài viết trên tất cả mọi thứ sau cụm từ "Tìm kiếm." là mã và nên được biên dịch. Nó không định dạng chính xác. Các mã cho thấy một số pInvoke khá mát mẻ cho những người quan tâm. Btw .... sau khi biên dịch, tôi chỉ cần đặt nó vào đường dẫn của mình ở đâu đó như c: \ windows. Bằng cách này, nếu tôi ở dấu nhắc cmd, tôi có thể nhập ImWorkin và tôi rất tốt để đi :)
user205533

1
Bạn có thể sửa đổi câu trả lời của mình bằng cách nhấp vào liên kết chỉnh sửa bên dưới nó.
Dennis

vui lòng chỉnh sửa câu trả lời đầu tiên của bạn và sau đó xóa câu trả lời này.
teylyn

6
WTF hiện lên với "Chỉ một lát, tôi đang tính một vài giá trị!" vòng lặp giả?
KalEl

6
Đáp lại mã c # được đăng thông thường để cung cấp tín dụng cho tác giả. Đó là tôi. Tôi tin rằng tôi đã đăng gần hai năm trước trên stack Overflow tôi tin.


2

Tôi thích sử dụng các tùy chọn dễ dàngtích hợp ( không có phần mềm bổ sung ), như tập lệnh powershell (cảm ơn https://dmitrysotnikov.wordpress.com/2009/06/29/prevent-desktop-lock-or-sc Greensaver-with-powershell / ) sử dụng "f15" làm chìa khóa thành công (thx thành caffeine. Nó thực sự ít can thiệp nhất)

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

Đặt cái này vào myScriptName.ps1 và khởi động nó thông qua lối tắt trên màn hình hoặc dòng lệnh: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -nop "C:\Users\myUser\Desktop\myScriptName.ps1"

CẬP NHẬT: Có thể có một số thay đổi từ quản trị viên, nhưng điều này không còn hiệu quả với tôi nữa Bây giờ tôi phải sử dụng tập lệnh autohotkey từ NBirnel: https://github.com/nbirnel/nos ngủ - công việc này hoàn hảo , bởi vì nó di chuyển chuột (mà không làm xao lãng bất kỳ công việc nào)


Tôi chạy mã nhưng nhận được lỗi sau. Xin tư vấn 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 có lẽ bạn phải xác định đường dẫn đầy đủ để kịch bản của bạn, vì vậy không chỉ là "myScriptName.ps1" nhưng "c: \ path \ to \ myScriptName.ps1"
eli

1

Trong trường hợp của tôi, chỉ một dòng này đã thực hiện thủ thuật:

SendKeys.Send("{CAPSLOCK}");

Chỉ cần đặt nó trong Timer_Ticksự kiện và đặt khoảng thời gian hẹn giờ là 60000ms.


1
ok, khá muộn để tiếp tục câu trả lời này nhưng hãy xem xét việc gửi không chỉ một mà đến hai CAPSLOCK nếu bạn không muốn tôi nói xấu về TRUNG GIAN của một bình luận STACKOVerflow mà không hiểu tại sao (phải mất vài phút để viết nhận xét này)
Gian Paolo

@GianPaolo bạn nói đúng. Đây là những gì tôi đã làm. Tôi nghĩ rằng nó rõ ràng nhưng có lẽ tôi nên sửa đổi câu trả lời.
dùng3540753


-1

Cách chính xác để xử lý nó là:

  • đi vào sổ đăng ký nơi có chính sách
  • đặt giá trị thành bất cứ điều gì bạn muốn
  • và thay đổi quyền đăng ký khóa
  • Chỉ từ chối viết quyền truy cập cho bất cứ ai trừ chính bạn

Khi quản trị viên vô hiệu hóa cài đặt khóa màn hình, chỉnh sửa sổ đăng ký đã bị vô hiệu hóa.
Gabriel R.

@GabrielR. Là quản trị viên, bạn có thể thay đổi ACL trên các khóa đăng ký. Nếu tôi có được sự kiên nhẫn, tôi sẽ liên kết cuộc nói chuyện từ Mark Russinovish, nơi anh ta đề cập đến việc loại bỏ chính sách của nhóm Microsoft đã khóa máy tính xách tay của chính mình. Nếu bạn là quản trị viên, bạn có toàn quyền kiểm soát máy. Nó có thể phải bắt đầu bằng việc sở hữu các khóa đăng ký, sau đó cấp cho bạn toàn quyền kiểm soát, sau đó từ chối bất kỳ ai khác ngoại trừ quyền truy cập đọc.
Ian Boyd

-5

Bạn nên tắt "khóa màn hình" / "chế độ ngủ" từ bảng điều khiển> tùy chọn nguồn> thay đổi cài đặt gói. Cô bấm vào thả xuống cho "Đặt máy tính vào chế độ ngủ" và chọn "không bao giờ".


4
Quản trị viên tên miền có thể có khóa màn hình được thi hành theo chính sách trong Windows.
Gabriel R.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.