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
相关产品推荐
相关产品推荐

