2024-12-12

[powershell] 公司電腦 防止系統進入鎖定(睡眠狀態或關閉顯示器)(windwos10使用)

一般來說,公司電腦為了防止資安風險,人離開座位就應該要將電腦鎖定避免他人使用,IT常常會做一個防呆措施,就是當電腦未活動超過5分鐘,就會自動進入鎖定狀態。而我們並非離開座位,只是未觸碰電腦使其進入工作狀態,一言不合就將電腦鎖定,一直打密碼登入十分麻煩。

IT避免使用者調整鎖定時間,一般會用安全性原則和限制使用者權限去防止使用者修改。 windows 裡面會偵測影片撥放、投影片播放等功能,來判斷使用者正在使用電腦,進而禁止休眠狀態啟用。 

影片播放、放映投影片通常是當前視窗執行,不可能一直掛著影片防止系統鎖定,老闆看到會生氣,整天看YT當個薪水小偷實在是不太恰當!

於是大神們用 C++ 去呼叫 SetThreadExecutionStat,讓更新狀態成"系統正在使用中",進而防止系統在應用程式執行時進入睡眠狀態或關閉顯示器。

微軟的範例:https://learn.microsoft.com/zh-tw/windows/win32/api/winbase/nf-winbase-setthreadexecutionstate

#使用SetThreadExecutionState 函式 (winbase.h) 防止系統進入睡眠狀態
#https://learn.microsoft.com/zh-tw/windows/win32/api/winbase/nf-winbase-setthreadexecutionstate
mode con: cols=28 lines=3
Add-Type @"
using System;
using System.Runtime.InteropServices;

public class SleepPreventer
{
// 定義常量

const uint ES_CONTINUOUS = 0x80000000; // 2147483648
// 通知系統,要設定的狀態應該維持有效狀態,直到下一次使用 ES_CONTINUOUS 的呼叫,並清除另一個狀態旗標為止。

const uint ES_SYSTEM_REQUIRED = 0x00000001; // 1
// 藉由重設系統閒置計時器,強制系統處於工作狀態。

const uint ES_DISPLAY_REQUIRED = 0x00000002; // 2
// 藉由重設顯示閒置計時器,強制顯示開啟。

[DllImport("kernel32.dll")]
public static extern uint SetThreadExecutionState(uint esFlags);

public static void PreventSleep()
{
// 使用 SetThreadExecutionState 函數
// 防止系統入休眠模式
SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED);
}
public static void RestoreSleep()
{
// 恢復默認設置
SetThreadExecutionState(ES_CONTINUOUS);
}
}
"@

#執行防止系統入休眠模式
[SleepPreventer]::PreventSleep()

Write-Host "按下 CTRL + C 結束防鎖定..."

# 無限循環,使腳本進入等待狀態
while ($true) {
Start-Sleep -Seconds 60
}

#使用系統管理員權限可查看是否有進入防閒置模式
#powercfg /requests

最後,如果你有系統管理員權限,可以使用管理者權限開啟 CMD 執行 powercfg /requests,查看目前系統是否有載入影片或投影片,來判斷會不會進入閒置狀態。

windwos11的用戶要注意,上述方法無法使用,這篇可能會有解答,我猜是判斷 winbase.h 呼叫方式不同,導致先前工作被遺棄,有待查證(挖坑)

沒有留言:

張貼留言