Windows 7でポリシーによる画面ロックを防ぐにはどうすればよいですか?


96

当社のBOFHは、途方もなく短い遅延で画面ロック設定を課しています。イライラして逆効果です。

自動画面ロックを防ぐ方法はありますか?ポリシーが適用された設定をオーバーライドする方法はないと思いますが、ユーザーアクティビティを模倣するソフトウェアがあるかもしれません。

永久マウスホイールをセットアップする前に尋ねます。(それを得る?)


1
「途方もなく短い」とは何ですか?
カール

画面がロックされないようにするキープレッサーやマウスムーバーなどの回避策があります。しかし、あなたはこれを本当にしたいですか?ITセキュリティを回避することは、企業のポリシーに反する可能性が高く、実行可能な犯罪になる可能性があります。
ケルタリ

7
15分。OK、それはそれほど短くはありません...あなたが家にいて、オープンスペースではなく、そしてしばしば2台目のコンピューターで作業しているのでなければ。私と同じように、画面ロックは不快です。
ガブリエルR.

半回避策の1つは、スクリーンセーバーをブロックするのではなく、猶予期間を数時間に設定することです。(これは、スクリーンセーバーの開始からパスワードの入力が必要になるまでの時間です。通常、これは5秒に設定されています。したがって、スクリーンセーバーが起動したときにマウスをすばやく振ると無効になります。パスワードなしで何時間も
過ごす

1
スクリプトは機能しますが、猶予期間は機能しません。私の企業ポリシーも猶予期間を無効にしていると思います。
デーンジェイコブハンプトン

回答:


85

idle.vbsというタイトルのスクリプトを使用します。

Dim objResult

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

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

これにより、6秒ごとにキーボードのnumlockがすばやく切り替わり、Windowsが誰かがキーボードを操作していると認識し、画面のロックを防ぎます。これはバニラウィンドウで実行されます。開発ツールやスクリプトツールを使用する必要はありません。拡張子が.vbsのテキストファイルを作成し、ダブルクリック(またはスタートアップ項目に配置)するだけです。

編集:このスクリプトをスタートアップアイテムに含めることができます

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

Choclatey(choco)CLIインストーラーの詳細については、以下を参照してください。

https://chocolatey.org/


@JoshRiversは、コンピューターを再起動せずにこのスクリプトを停止する方法もあります。
ディージェイ

2
@DeeJayhタスクマネージャーでwscript.exeのインスタンスを見つけて強制終了できると思います。通常、実行可能ファイルのインスタンスは多くありません。終了(stackoverflow.com/a/22325745)または外部の事実を監視するDo Whileセクションにコードを配置することにより、おそらく自動化されたソリューションを作成できます。スクリプトが起動時にファイルを作成するようにして、Whileにファイルが存在することを確認します。そうすれば、ファイルを削除してスクリプトを終了させることができます。(しかし、私は決してそのことをやめないので、スクリプトを実行するだけで、タスクマネージャーでスクリプトを殺すことはほとんどありません)。
JoshRivers

1
Windows 10では、スタートアップフォルダーを見つける簡単な方法は、[スタート]-> [ファイル名を指定して実行]ウィンドウ(WindowsKey + Rなど)を表示してからを入力することshell:startupです。詳細については、このサイトを参照してくださいthewindowsclub.com/startup-folder-in-windows-8
buzz3791

スクリプトを見つけるには、タスクマネージャーでMicrosoft Windows Based Script Hostを探します。または、プロセス名の列を追加してから、wscript.exeを探します。
ジョンアンドリュース

Win10 Surfaceラップトップで素晴らしい動作-物理的なNumLockキーさえ持っていません!
シャハール

87

Windows Media Playerがまだインストールされている場合は、ループでビデオを再生して最小化できます(このためにサンプルの「Wildlife」ビデオが正常に機能します)。デフォルトでは、ビデオが再生されている限り、画面はロックされません。


3
ありがとうございました!これが最も簡単で効果的なソリューションです。(私はそれを試しませんでした。しばらく前に会社を辞め、Windowsから離れようとしました。)
ガブリエルR.

5
ビデオの代わりにMP3ファイルを使用するWindows XPでこれが機能することを確認します。
アラアアリ

4
素晴らしいハック!

3
これはまた、Windows Media Playerの上でそれを好む人のためにVLCを使用して動作します
ecoe

4
Windows 7で正常に動作します。素晴らしいハック!
16年

16

さらに別のオプションは、フリーウェアのカフェインプログラムです。商用利用も無料です。プログラムのホームページから:

PCのロックまたはスリープ状態に問題がある場合、カフェインはスリープ状態を維持します。59秒ごとに1回キーを押すことをシミュレートすることで機能するため、マシンはまだキーボードで作業していると判断するため、画面をロックしたり、スクリーンセーバーをアクティブにしたりしません。

カフェインは、59秒ごとにF15キーアップイベントをシミュレートすることで機能します。使用可能なすべてのキープレスの中で、F15はおそらく最も邪魔にならず(そのキーを備えたPCキーボードを見たことがない!)、作業に干渉する可能性は最も低くなります。

この既製のソリューションでは、いつ有効化および無効化するかを制御することもできます。

プログラムアイコンをダブルクリックすると、アイコンが表すコーヒーポットが空になり、プログラムが一時的に無効になります。もう一度ダブルクリックすると、ポットが補充され、マシンが起動し続けます。


8
Gov'tの従業員がコンピューターにカフェインを入れて、Shift + F15のようなものが核を発射する
待ってい

素敵で簡単な「既製」ソリューション、ありがとう。gccと同じくらい多くのコマンドラインオプションがあるようですが、使用する必要はありません!
サムワトキンス

このツールは私に最適です!Visual C ++ 2008 Redistributableをインストールして動作させる必要がありました。microsoft.com/en-us/download/details.aspx?id=26368
Synck

7

AutoItスクリプトを作成して、未使用のキーを継続的に押す(たとえば、numロック、スクロールロックを切り替える)、1分程度スリープして、繰り返すことができます。あるいは、キーボードを頻繁に使用する場合は、マウスをピクセル単位で任意の方向に移動させることができます。

継続的に実行したくない場合は、スクリプトをスケジュールされたタスクとして起動し(アクセス権がある場合)、コンピューターがしばらく非アクティブになった後に起動することもできます。

AutoIt構文にしたくない場合、これは目に見えないマウスの移動を実行する非常に簡単なスクリプトです。

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

このスクリプトは、マウスカーソルを左上方向に1ピクセル移動し、その後カーソルを戻し、9分間(540000ミリ秒)スリープします。スクリプトの実行中は、トレイにAutoItアイコンが表示されます。このアイコンを右クリックして対応するオプションを選択すると、停止できます。

スクリプトを作成するには、AutoItをインストールし、任意のフォルダーを右クリックしてNew> を選択しAutoIt v3 Script、名前を付け、この新しいスクリプトを右クリックして、を選択しEdit、上記のコードを貼り付けて保存します。コンパイルして.exe(もう一度、コンテキストメニューから)、たとえばWindowsスケジューラから起動することもできます。


おかげで、私はそれを確認します、マウスホイールケージのセットアップよりも簡単に見える:)
ガブリエルR.

このAutoItスクリプトのプリコンパイルバージョンはこちらsymantec.com/connect/downloads/…–
JJS

5

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;


        }
    }
}

申し訳ありません...上記の投稿で「Looking for。」というフレーズの後のすべてを投稿してください。コードであり、コンパイルする必要があります。正しくフォーマットされませんでした。このコードは、興味のある人のためにかなりクールなpInvokeを示しています。Btw ....コンパイル後、c:\ windowsのような場所にパスに入れます。私は、CMDプロンプトでだ場合は、この方法で私はImWorkinを入力することができると私は:)行ってもいいよ
user205533

1
答えを修正するには、その下の編集リンクをクリックします
デニス

最初の回答を編集してから、この回答を削除してください。
テイリン

6
WTFには、「ちょっと待って、いくつかの値を計算しています!」があります。ダミーループ?
KalEl

6
c#コードに応じて、著者にクレジットを与えるために通常通例のコードが投稿されました。それはたまたま私です。私はこれをほぼ2年前にStack Overflowに投稿しました。


2

powershellスクリプトのように、簡単統合されたオプション(追加ソフトウェアなし)を使用するのが好きです(https://dmitrysotnikov.wordpress.com/2009/06/29/prevent-desktop-lock-or-screensaver-with-powershell/に感謝します))「f15」を成功の鍵として使用します(カフェインへのthx。実際に最も干渉が少ない)

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"

更新: 管理者から何らかの変更があったかもしれませんが、これはもう機能しません。NBirnelのautohotkey-scriptを使用する必要があります:https : //github.com/nbirnel/nosleep-この作業は完璧です。マウスを動かします(作業の注意をそらすことなく)


コードを実行しますが、次のエラーが発生します。アドバイスしてください 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多分、スクリプトへのフルパスを定義する必要があるため、「myScriptName.ps1」だけでなく「c:\ path \ to \ myScriptName.ps1」
eli

1

私の場合、この1行だけでうまくいきました。

SendKeys.Send("{CAPSLOCK}");

Timer_Tickイベントに入れて、タイマー間隔を60000msなどに設定するだけです。


1
[OK]を、それはあなたが私は(それがこのコメントを書くために数分をtooks)理由を理解せずにStackOverflowのコメントの途中で叫んで開始したくない場合は、この答えを再開したが、1つではなく2つのCAPSLOCKを送ることを検討するのは非常に遅くです
ジャンパオロ

@GianPaoloあなたは正しい。これは私がやったことです。はっきりしていると思ったが、答えを修正する必要があるかもしれない。
user3540753


-1

それを処理する正しい方法は次のとおりです。

  • ポリシーがあるレジストリに移動します
  • あなたが望むものに値を設定します
  • レジストリキーのアクセス許可を変更する
  • 自分以外のユーザーへの書き込みアクセスのみを拒否する

管理者が画面ロック設定を無効にすると、レジストリの編集はすでに無効になっています。
ガブリエルR.

ガブリエル 管理者は、レジストリキーのACLを変更できます。忍耐が得られたら、Mark Russinovishの講演にリンクします。彼は、自分のラップトップをロックダウンしたMicrosoftグループポリシーを削除することについて言及しています。管理者であれば、マシンを完全に制御できます。レジストリキーの所有権を取得することから始めて、自分にフルコントロールを付与し、読み取りアクセス以外のすべてを拒否する必要があります。
イアン・ボイド

-5

コントロールパネル>電源オプション>プラン設定の変更から「画面ロック」/「スリープモード」を無効にする必要があります。彼女は「コンピューターをスリープ状態にする」のドロップダウンをクリックし、「決して」を選択しません。


4
ドメイン管理者は、Windowsでポリシーを適用した画面ロックを設定できます。
ガブリエルR.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.