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

从CSV更新AD用户并仅展示变更内容的技术实现求助

仅更新AD用户变更属性的PowerShell解决方案

问题背景

HR系统导出的CSV包含用户数据,需导入更新AD用户,但仅处理实际变更的属性,忽略未变更项。CSV与AD属性的对应规则如下:

  • CSV Work Email → AD userPrincipalName(用户匹配依据)
  • CSV Job Role → AD title
  • CSV Employee Id → AD employeeID
  • CSV Manager Email → AD manager(需转换为用户DN)

原有脚本会强制更新所有属性,无法区分变更项,需优化实现仅更新差异属性并精准记录变更内容。

解决方案脚本

# 导入Active Directory模块
Import-Module ActiveDirectory

# 日志文件配置
$currentDate = Get-Date -Format "dd-MM-yyyy_HH-mm-ss"
$Logfile = "C:\logs\$currentDate.log"

function WriteLog {
    Param ([string]$LogString)
    $Stamp = (Get-Date).ToString("dd/MM/yyyy HH:mm:ss")
    $LogMessage = "$Stamp $LogString"
    Add-Content $LogFile -Value $LogMessage
}

# 读取CSV用户数据
$ADUsers = Import-Csv -Path "C:\csv\users.csv"

# 遍历CSV中每个用户条目
foreach ($User in $ADUsers) {
    $userUPN = $User.'Work Email'
    
    # 定义CSV字段到AD属性的映射关系,预处理manager的DN
    $propertyMap = @{
        'title'       = $User.'Job Role'
        'employeeID'  = $User.'Employee Id'
        'manager'     = if ($User.'Manager Email') {
                            Get-ADUser -Filter "UserPrincipalName -eq '$($User.'Manager Email')'" -ErrorAction SilentlyContinue | Select-Object -ExpandProperty DistinguishedName
                        }
    }

    try {
        # 获取AD中目标用户,加载需要对比的属性
        $adUser = Get-ADUser -Filter "UserPrincipalName -eq '$userUPN'" `
            -SearchBase "OU=UsersAirspan,DC=airspan,DC=com" `
            -Properties title, employeeID, manager `
            -ErrorAction Stop

        # 收集需要更新的属性及变更记录
        $updateParams = @{}
        $changeDetails = @()

        foreach ($propName in $propertyMap.Keys) {
            $csvValue = $propertyMap[$propName]
            $adCurrentValue = $adUser.$propName

            # 特殊处理manager属性的空值对比
            if ($propName -eq 'manager') {
                if ([string]::IsNullOrEmpty($csvValue) -and [string]::IsNullOrEmpty($adCurrentValue)) {
                    continue
                }
                if ($csvValue -ne $adCurrentValue) {
                    $updateParams[$propName] = $csvValue
                    $changeDetails += "$propName : 原值='$adCurrentValue' → 新值='$csvValue'"
                }
            }
            else {
                # 普通属性值对比
                if ($csvValue -ne $adCurrentValue) {
                    $updateParams[$propName] = $csvValue
                    $changeDetails += "$propName : 原值='$adCurrentValue' → 新值='$csvValue'"
                }
            }
        }

        # 存在变更时执行更新并记录日志
        if ($updateParams.Count -gt 0) {
            try {
                Set-ADUser -Identity $adUser @updateParams -ErrorAction Stop
                $logMsg = "用户 $userUPN 已更新:$($changeDetails -join '; ')"
                WriteLog $logMsg
                Write-Host $logMsg -ForegroundColor Green
            }
            catch {
                $errorMsg = "更新用户 $userUPN 失败:$($_.Exception.Message)"
                WriteLog $errorMsg
                Write-Host $errorMsg -ForegroundColor Red
            }
        }
        else {
            $skipMsg = "用户 $userUPN 无属性变更,跳过更新"
            WriteLog $skipMsg
            Write-Host $skipMsg -ForegroundColor Cyan
        }
    }
    catch {
        $warnMsg = "警告:未找到AD用户 $userUPN ,错误信息:$($_.Exception.Message)"
        WriteLog $warnMsg
        Write-Host $warnMsg -ForegroundColor Yellow
    }
}

核心优化说明

  • 属性映射管理:通过哈希表统一维护CSV与AD的属性对应关系,便于后续扩展或修改
  • 精准差异对比:逐属性对比CSV值与AD现有值,仅收集真正有变化的属性,避免无意义的更新操作
  • 动态参数更新:将变更属性打包为哈希表,通过@updateParams传递给Set-ADUser,实现按需更新
  • 审计级日志:记录每个用户的具体变更内容(原值+新值),满足审计需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 12:43:28