如何在PowerShell脚本中检测Windows PC状态(解锁、睡眠、休眠、关机)
检测Windows PC活跃状态的PowerShell实现方法
以下是针对需求的分模块检测方案,整合后可确保脚本仅在PC处于活跃状态时执行:
1. 检测会话是否未锁定
方法一:通过会话状态判断(简单直接)
利用quser命令查看当前用户会话状态,Active表示未锁定:
function Test-IsSessionUnlocked { $activeSession = quser 2>$null | Where-Object { $_ -match 'Active' } return $null -ne $activeSession }
方法二:通过空闲时间判断(更精准)
调用user32.dll的GetLastInputInfo获取系统最后输入时间,结合空闲阈值判断(示例设为5分钟,可调整):
function Test-IsSessionUnlocked { $inputInfo = Add-Type -MemberDefinition @" [StructLayout(LayoutKind.Sequential)] public struct LASTINPUTINFO { public uint cbSize; public uint dwTime; } [DllImport("user32.dll")] public static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); "@ -Name User32 -Namespace Win32 -PassThru $lastInput = New-Object Win32.User32+LASTINPUTINFO $lastInput.cbSize = [System.Runtime.InteropServices.Marshal]::SizeOf($lastInput) $null = $inputInfo::GetLastInputInfo([ref]$lastInput) # 计算空闲时间(单位:100纳秒) $idleTime = (Get-Date).Ticks - $lastInput.dwTime * 10000 # 空闲时间小于5分钟则认为会话未锁定 return $idleTime -lt (5*60*10000000) }
2. 检测PC是否未处于睡眠/休眠状态
通过Win32_ComputerSystem的PowerState属性判断,0表示系统正常运行:
function Test-IsNotSleepingOrHibernating { $systemState = Get-CimInstance Win32_ComputerSystem | Select-Object -ExpandProperty PowerState # PowerState取值:0=正常运行,1=休眠,2=睡眠,3=暂停 return $systemState -eq 0 }
3. 检测PC是否未处于关机进程中
利用Win32_OperatingSystem的ShutdownPending属性直接判断系统是否有挂起的关机/重启操作:
function Test-IsNotShuttingDown { $osState = Get-CimInstance Win32_OperatingSystem | Select-Object -ExpandProperty ShutdownPending return -not $osState }
整合检测逻辑
将以上检测函数整合为一个统一的判断函数,在脚本中循环检测直到PC活跃:
function Test-IsPCActive { $isUnlocked = Test-IsSessionUnlocked $isNotSleeping = Test-IsNotSleepingOrHibernating $isNotShuttingDown = Test-IsNotShuttingDown return $isUnlocked -and $isNotSleeping -and $isNotShuttingDown } # 脚本执行前的等待逻辑 while (-not (Test-IsPCActive)) { Write-Host "PC未处于活跃状态,30秒后重试..." Start-Sleep -Seconds 30 } # 后续脚本逻辑 Write-Host "PC已处于活跃状态,开始执行任务..." # 在这里添加你的业务代码
注意事项
- 部分命令需要管理员权限(如
Get-CimInstance的部分操作),建议以管理员身份运行脚本。 - 空闲时间阈值可根据需求调整,若允许用户短暂离开未锁定的情况,可适当增大阈值。
PowerState的取值可能因Windows版本略有差异,建议在目标系统上测试确认。
内容的提问来源于stack exchange,提问作者Rabins Rai
相关产品推荐
相关产品推荐

