You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 01:17:46