Задача экономить электричество. Выключать пк если на нем не работают в течение часа. Логика. у нас 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
Две группы одна создает таск вторая удаляет если надо убрать
Сам таск .Скрипт стартует когда включился пк.
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
-Command "& {Start-Process powershell -ArgumentList '-ExecutionPolicy Bypass -File ""C:\ProgramData\Scriptspoweroff\poweroff.ps1""' -Verb RunAs}"
Similar Posts:
- Как сделать групповую (GPO) политику для выключения пк при простои больше двух часов.
- Как сделать задание в планировщики для выключения windows 10 по простою (бездействие)
- Как в always on mssql синхронизировать логины и пароль на вторичной реплики и удалять логины когда удалили на первичной c проверкой хэш паролей
- Как удалить у пользователя все группы кроме domain user
- Как сделать синхронизацию NPS Network Policy Server