PowerShell脚本获取AD服务器管理员:离线设备RPC错误捕获问题
解决PowerShell中RPC服务器不可用错误无法被try/catch捕获的问题
问题原因
Get-WmiObject抛出的「RPC服务器不可用」属于非终止错误,而PowerShell默认的try/catch仅会捕获终止错误,因此你的try/catch块无法拦截该错误,导致错误信息直接输出,破坏结果格式。
解决方案1:修改现有WMI脚本,强制转换错误类型
给Get-WmiObject添加-ErrorAction Stop参数,将非终止错误强制转为终止错误,让try/catch能够捕获。修改后的脚本如下:
$computers = Get-ADComputer -Filter {OperatingSystem -like "*Server*"} -SearchBase "OU=NAME,DC=domain,DC=com" foreach ($computer in $computers) { try { $admins = Get-WmiObject -Class Win32_GroupUser -ComputerName $computer.Name ` -Filter "GroupComponent=`"Win32_Group.Domain='$($computer.Name)',Name='Administrators'`"" ` -ErrorAction Stop ` # 新增参数,强制转为终止错误 | Select-Object -ExpandProperty PartComponent ` | ForEach-Object { $_.substring($_.lastindexof('=')+1).replace('"','') } Write-Output "$($computer.Name): $($admins -join ', ')" } catch { Write-Output "$($computer.Name): RPC服务器不可用。" } }
解决方案2:改用更现代的Get-CimInstance(推荐)
WMI系列cmdlet已被CIM系列取代,Get-CimInstance的错误处理更灵活,同样通过-ErrorAction Stop参数即可让try/catch捕获错误,代码如下:
$computers = Get-ADComputer -Filter {OperatingSystem -like "*Server*"} -SearchBase "OU=NAME,DC=domain,DC=com" foreach ($computer in $computers) { try { $admins = Get-CimInstance -ClassName Win32_GroupUser -ComputerName $computer.Name ` -Filter "GroupComponent=`"Win32_Group.Domain='$($computer.Name)',Name='Administrators'`"" ` -ErrorAction Stop ` | Select-Object -ExpandProperty PartComponent ` | ForEach-Object { $_.substring($_.lastindexof('=')+1).replace('"','') } Write-Output "$($computer.Name): $($admins -join ', ')" } catch { Write-Output "$($computer.Name): RPC服务器不可用。" } }
效果验证
修改后,离线设备会严格按照你期望的格式输出结果,不会再出现杂乱的错误堆栈信息。
内容的提问来源于stack exchange,提问作者kfausch
相关产品推荐
相关产品推荐

