如何使用Powershell结束AD非活跃用户会话且不禁用对应账号
PowerShell 结束非活跃用户会话实现方案
核心思路
先通过系统原生接口匹配你已筛选出的AD非活跃用户,拉取对应会话ID后执行注销操作,全程不修改AD用户账号属性,不会触发封禁。
方案1:解析quser命令输出(轻量快速)
该方案依赖Windows原生quser命令,无需额外模块,适合小批量场景:
- 首先远程拉取目标主机的所有用户会话列表:
quser /server:<目标主机FQDN/IP>,输出自带会话ID、用户名、会话状态、空闲时长字段,可直接匹配你筛选出的非活跃用户。 - 附PowerShell解析+批量注销的示例代码:
# 填入你已筛选出的非活跃高CPU用户列表 $inactiveUsers = @("user1", "user2", "user3") $targetServers = @("server01", "server02") # 填需要排查的主机列表 foreach ($server in $targetServers) { # 拉取当前主机所有会话 $quserResult = quser /server:$server 2>&1 if ($LASTEXITCODE -ne 0) { continue } foreach ($user in $inactiveUsers) { # 匹配对应用户的会话ID $match = $quserResult | Select-String -Pattern "\s+$user\s+(\d+)\s+" if ($match) { $sessionId = $match.Matches.Groups[1].Value # 执行注销,无输出即为成功 logoff $sessionId /server:$server /v } } }
方案2:CIM接口查询(兼容多语言环境,更稳定)
如果目标主机是非中文/英文系统,quser输出格式会变化导致解析失败,可以用WMI/CIM接口直接查询会话信息:
- 直接调用
Win32_LogonSession类拉取会话,关联对应用户后直接调用注销方法,无需解析文本:
$inactiveUsers = @("user1", "user2", "user3") $targetServers = @("server01", "server02") foreach ($server in $targetServers) { # 拉取所有登录会话 $allSessions = Get-CimInstance -ClassName Win32_LogonSession -ComputerName $server -ErrorAction SilentlyContinue if (-not $allSessions) { continue } foreach ($session in $allSessions) { # 关联会话对应的AD用户 $relatedUser = Get-CimAssociatedInstance -InputObject $session -ResultClassName Win32_UserAccount -ComputerName $server -ErrorAction SilentlyContinue if ($relatedUser.Name -in $inactiveUsers) { # 直接调用注销方法结束会话 Invoke-CimMethod -InputObject $session -MethodName Logoff -ErrorAction SilentlyContinue } } }
权限说明
执行脚本的账号仅需要目标主机的远程管理权限以及用户会话注销权限即可,不需要域管理员权限,也不会修改AD用户的任何属性,用户后续可以正常登录。
内容的提问来源于stack exchange,提问作者Yukta Vichare
相关产品推荐
相关产品推荐

