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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 23:36:21