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

PS5使用quser查询AD服务器用户会话时捕获错误码的方法

PowerShell捕获quser外部命令报错的解决方法

核心原因

quser是Windows自带的外部可执行程序,不属于PowerShell原生Cmdlet,因此PowerShell的-ErrorAction参数、try/catch默认错误捕获逻辑对其不生效:它的报错信息会输出到标准错误流(stderr),默认不会进入PowerShell的错误流,也不会赋值给变量、不会改变$?的返回值。

解决方法

方法1:重定向错误流+检查退出码

通过2>&1将quser的stderr流重定向到标准输出流,所有输出(正常结果+报错信息)都会被存入变量,同时可以通过$LASTEXITCODE变量判断quser执行是否成功(成功返回0,失败返回非0),无需匹配各类错误文本:

# 捕获quser所有输出,包含报错信息
$quserOutput = quser /server:$server 2>&1

# 判断执行是否失败
if ($LASTEXITCODE -ne 0) {
    # 自定义错误日志写入逻辑
    $logMsg = "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] 服务器 $server 查询失败,退出码:$LASTEXITCODE,错误信息:$quserOutput"
    Add-Content -Path ./ad_user_query.log -Value $logMsg
    # 跳过后续会话ID提取,进入下一台服务器遍历
    continue
}

# 无报错时正常提取会话ID
$sessionID = (($quserOutput | Where-Object { $_ -match $username }) -split ' +')[2]

方法2:适配try/catch捕获逻辑

如果需要统一用try/catch处理脚本所有错误,可以在检测到quser执行失败时手动抛出异常:

try {
    $quserOutput = quser /server:$server 2>&1
    if ($LASTEXITCODE -ne 0) {
        throw "quser查询异常:$quserOutput"
    }
    $sessionID = (($quserOutput | Where-Object { $_ -match $username }) -split ' +')[2]
}
catch {
    # 直接捕获所有异常写入日志
    $logMsg = "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] 服务器 $server 处理失败:$_"
    Add-Content -Path ./ad_user_query.log -Value $logMsg
}

内容的提问来源于stack exchange,提问作者jcanker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:45:03