PowerShell脚本遇ADWS连接错误终止,需实现错误捕获
PowerShell AD脚本网络错误捕获方案
针对AD服务器连接不稳定导致脚本终止的问题,以下是添加错误处理后的完整脚本,同时优化了部分逻辑提升效率:
$ScriptDir = Split-Path $script:MyInvocation.MyCommand.Path $Date = Get-Date -Format yyyy_MM_dd_THHmm Start-Transcript -Path "$ScriptDir\Logs.log" -Append $List = Import-Csv "$ScriptDir\Accounts.csv" $TotalCount = $List.Count # 改用Count而非Length,适配集合类型 $CurrentCount = 0 Write-Host 'Total Count: '$TotalCount # 提前获取所有AD组列表,避免循环内重复调用 try { $ADGroups = Get-ADGroup -Filter * -ErrorAction Stop | Select-Object Name } catch [Microsoft.ActiveDirectory.Management.ADServerDownException] { Write-Host "无法连接AD服务器获取组列表,脚本终止" -ForegroundColor Red Stop-Transcript exit 1 } catch { Write-Host "获取AD组列表时发生未知错误: $_" -ForegroundColor Red Stop-Transcript exit 1 } ForEach ($user in $List) { $Groups = $User.Group $UserSam = $User.SamAccountName $ADUser = $null $ExistingGroups = $null # 捕获Get-ADUser的连接错误 try { $ADUser = Get-ADUser -Filter "SamAccountName -eq '$UserSam'" -ErrorAction Stop | Select-Object SamAccountName } catch [Microsoft.ActiveDirectory.Management.ADServerDownException] { Write-Host "连接AD服务器失败,跳过用户 $UserSam : $_" -ForegroundColor Red $CurrentCount++ $Percentage = [math]::Round($CurrentCount/$TotalCount*100) Write-Progress -Activity "Building report in progress" -Status "$Percentage% Complete" -PercentComplete $Percentage Continue } catch { Write-Host "查询用户 $UserSam 时发生未知错误: $_" -ForegroundColor Red $CurrentCount++ $Percentage = [math]::Round($CurrentCount/$TotalCount*100) Write-Progress -Activity "Building report in progress" -Status "$Percentage% Complete" -PercentComplete $Percentage Continue } # 用户不存在于AD if ($ADUser -eq $null) { Write-Host "$UserSam does not exist in AD" -ForegroundColor DarkCyan $CurrentCount++ $Percentage = [math]::Round($CurrentCount/$TotalCount*100) Write-Progress -Activity "Building report in progress" -Status "$Percentage% Complete" -PercentComplete $Percentage Continue } # CSV中未指定用户组 if ([string]::IsNullOrEmpty($Groups)) { Write-Host "$UserSam has no group specified in CSV file" -ForegroundColor Yellow $CurrentCount++ $Percentage = [math]::Round($CurrentCount/$TotalCount*100) Write-Progress -Activity "Building report in progress" -Status "$Percentage% Complete" -PercentComplete $Percentage Continue } # 捕获用户组成员查询的连接错误 try { $ExistingGroups = Get-ADPrincipalGroupMembership $UserSam -ErrorAction Stop | Select-Object Name } catch [Microsoft.ActiveDirectory.Management.ADServerDownException] { Write-Host "连接AD服务器失败,无法查询用户 $UserSam 的组成员: $_" -ForegroundColor Red $CurrentCount++ $Percentage = [math]::Round($CurrentCount/$TotalCount*100) Write-Progress -Activity "Building report in progress" -Status "$Percentage% Complete" -PercentComplete $Percentage Continue } catch { Write-Host "查询用户 $UserSam 组成员时发生未知错误: $_" -ForegroundColor Red $CurrentCount++ $Percentage = [math]::Round($CurrentCount/$TotalCount*100) Write-Progress -Activity "Building report in progress" -Status "$Percentage% Complete" -PercentComplete $Percentage Continue } foreach ($Group in $Groups.Split(';')) { # 组不存在于AD if ($ADGroups.Name -notcontains $Group) { Write-Host "$Group group does not exist in AD" -ForegroundColor Gray Continue } # 用户已在组中 if ($ExistingGroups.Name -contains $Group) { Write-Host "$UserSam already exists in group $Group." -ForeGroundColor Yellow } else { # 用户不在组中 Write-Host "User $UserSam doesn't exist in $Group AD group" -ForegroundColor Red } } $CurrentCount++ $Percentage = [math]::Round($CurrentCount/$TotalCount*100) Write-Progress -Activity "Building report in progress" -Status "$Percentage% Complete" -PercentComplete $Percentage } Stop-Transcript Write-Output 'Script complete.'
关键改动说明
- 提前获取AD组列表:将
Get-ADGroup移到循环外,避免每次处理用户都重复查询AD,减少网络请求次数和出错概率 - 精准捕获AD连接异常:针对
ADServerDownException类型做专门处理,区分网络连接错误和其他类型错误 - 强制错误终止行为:给所有AD命令添加
-ErrorAction Stop,确保原本的非终止错误转为终止错误,进入catch块处理 - 错误后继续执行:捕获到连接错误时,记录错误信息后使用
Continue跳过当前用户,脚本继续处理下一个条目 - 逻辑优化:将
$Groups -eq $null改为[string]::IsNullOrEmpty($Groups),更严谨处理空字符串;将$ExistingGroups.Name -eq $Group改为-contains,适配多组匹配场景
内容的提问来源于stack exchange,提问作者NOBODY519
相关产品推荐
相关产品推荐

