Перейти к содержимому

Как сделать gpo выключение windows 10 пк по бездействию в течение часа.

Задача экономить электричество. Выключать пк если на нем не работают в течение часа. Логика. у нас gpo которая блокирует экран по бездействию . От этого отталкивается скрипт проверяет заблокирован экран . если да то ведет отсчет от этого.

Сам скрипт проверки

# Определение порогов времени простоя (в секундах)
$shutdownIdleTimeLocked = 3600  # 1 час (3600 секунд) при заблокированном экране
$shutdownIdleTimeSystem = 3600  # 2 часа (7200 секунд) при отсутствии пользователя

# Путь к лог-файлу
$logPath = "C:\ProgramData\Scriptspoweroff"
$logFile = "$logPath\IdleShutdown.log"

# Создание папки для логов, если она не существует
if (-not (Test-Path -Path $logPath)) {
    New-Item -ItemType Directory -Path $logPath | Out-Null
}

# Функция для получения времени простоя системы через API (P/Invoke)
Add-Type @"
using System;
using System.Runtime.InteropServices;

public class IdleTimeFinder {
    [DllImport("user32.dll")]
    public static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);

    [StructLayout(LayoutKind.Sequential)]
    public struct LASTINPUTINFO {
        public uint cbSize;
        public uint dwTime;
    }

    public static uint GetIdleTime() {
        LASTINPUTINFO lii = new LASTINPUTINFO();
        lii.cbSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(LASTINPUTINFO));
        if (GetLastInputInfo(ref lii)) {
            return ((uint)Environment.TickCount - lii.dwTime) / 1000; // Время простоя в секундах
        }
        return 0;
    }
}
"@

# Функция для проверки, заблокирован ли экран
function Is-ScreenLocked {
    $lockedSessions = Get-Process -Name "LogonUI" -ErrorAction SilentlyContinue
    return ($lockedSessions -ne $null)
}

# Переменная для хранения времени начала блокировки экрана
$screenLockStartTime = $null

# Бесконечный цикл для проверки времени простоя
while ($true) {
    # Получение текущего времени простоя
    $idleTime = [IdleTimeFinder]::GetIdleTime()

    # Проверка, есть ли активные пользователи
    $activeUsers = Get-WmiObject -Class Win32_ComputerSystem | Select-Object -ExpandProperty UserName
    $userStatus = if ($activeUsers) { "Пользователь активен: $activeUsers" } else { "Пользователь отсутствует" }

    # Проверка, заблокирован ли экран
    $isLocked = Is-ScreenLocked
    if ($isLocked) {
        $userStatus = "Экран заблокирован"

        # Если экран только что заблокирован, сохраняем время начала блокировки
        if ($screenLockStartTime -eq $null) {
            $screenLockStartTime = Get-Date
        }

        # Вычисляем время блокировки экрана (в минутах)
        $lockedDuration = (New-TimeSpan -Start $screenLockStartTime -End (Get-Date)).TotalMinutes
    } else {
        $screenLockStartTime = $null  # Сбрасываем время блокировки, если экран разблокирован
        $lockedDuration = 0
    }

    # Логирование времени простоя и статуса пользователя
    if ($isLocked) {
        $logMessage = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') | Время простоя: $idleTime сек. | $userStatus | Экран заблокирован уже $([math]::Round($lockedDuration)) минут"
    } else {
        $logMessage = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') | Время простоя: $idleTime сек. | $userStatus"
    }
    Add-Content -Path $logFile -Value $logMessage

    # Условие для выключения при заблокированном экране
    if ($isLocked -and $lockedDuration -ge ($shutdownIdleTimeLocked / 60)) {
        # Логирование события выключения
        $shutdownMessage = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') | Экран заблокирован уже $([math]::Round($lockedDuration)) минут. Выполняется выключение..."
        Add-Content -Path $logFile -Value $shutdownMessage

        # Выключение системы
        shutdown.exe /s /t 0
        break  # Завершение скрипта после выключения
    }

    # Условие для выключения при отсутствии пользователя
    if (-not $activeUsers -and $idleTime -ge $shutdownIdleTimeSystem) {
        # Логирование события выключения
        $shutdownMessage = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') | Система бездействует более $shutdownIdleTimeSystem секунд. Выполняется выключение..."
        Add-Content -Path $logFile -Value $shutdownMessage

        # Выключение системы
        shutdown.exe /s /t 0
        break  # Завершение скрипта после выключения
    }

    # Пауза перед следующей проверкой (например, 300 секунд или 5 минут)
    Start-Sleep -Seconds 300
}

 

Gpo

Две группы одна создает таск вторая удаляет если надо убрать

Как сделать gpo выключение windows 10 пк по бездействию в течение часа.

Как сделать gpo выключение windows 10 пк по бездействию в течение часа.

Сам таск .Скрипт стартует когда включился пк.

Как сделать gpo выключение windows 10 пк по бездействию в течение часа.

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

-Command "& {Start-Process powershell -ArgumentList '-ExecutionPolicy Bypass -File ""C:\ProgramData\Scriptspoweroff\poweroff.ps1""' -Verb RunAs}"

Как сделать gpo выключение windows 10 пк по бездействию в течение часа.

Similar Posts:

Метки:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Яндекс.Метрика