PowerShell对比两个OU的AD用户仅输出差异的实现求助
问题修复方案
原有代码核心问题
- 直接对
$user_GC.GABCustomUser3和$user_PL.mail两个数组做等值判断不符合需求,该判断仅会校验两个数组整体是否完全一致,不会逐个比对GC侧新用户属性是否存在于PL侧用户的mail列表中 - 比对逻辑和遍历顺序错误,没有对每个GC侧新用户做单独校验就直接生成了全部新用户对象
- 新增用户属性用到了
Organization,但原Get-ADUser查询参数里没有拉取该属性,会返回空值
修正后代码
$dateforlookup = (Get-Date).AddDays(-1) $DC_GC = "test1.com" $DC_PL = "test2.com" $OU_GC = "some OU1" $OU_PL = "some OU2" # 获取GC侧近1天新增用户,补全Organization属性拉取 $user_GC = Get-ADUser -Server $DC_GC -SearchBase $OU_GC -Filter * -Properties GivenName,Surname,GABCustomUser3,whenCreated,Title,Department,Organization | Where {$_.whenCreated -gt $dateforlookup} # 获取PL侧所有用户的mail属性,存入哈希集合大幅提高比对效率 $user_PL = Get-ADUser -Server $DC_PL -SearchBase $OU_PL -Filter * -Properties mail $plMailSet = [System.Collections.Generic.HashSet[string]]::new([string[]]$user_PL.mail) $output = @() # 逐个校验GC侧新用户 foreach ($user in $user_GC) { # 仅当GABCustomUser3非空、且不存在于PL侧mail列表中时,才生成新用户对象 if (-not [string]::IsNullOrWhiteSpace($user.GABCustomUser3) -and -not $plMailSet.Contains($user.GABCustomUser3)) { $properties = @{ 'FirstName' = $user.GivenName 'LastName' = $user.Surname.Substring(0,1)+($user.Surname.Substring(1).ToLower()) 'Email' = $user.GABCustomUser3 'Department' = $user.Department 'JobTitle' = $user.Title 'Organization' = $user.Organization 'GUID'= ($user.GivenName.ToLower()).Substring(0,1)+'.'+$user.Surname.ToLower() } $output += New-Object -Type psobject -Property $properties } } if ($output.Count -gt 0) { Write-Host "共找到$($output.Count)个需要创建的新用户" # 后续可接新用户创建逻辑 } else { Write-Host "无需要创建的新用户" }
可选优化
如果需要mail比对不区分大小写,可将哈希集合初始化代码替换为:
$plMailSet = [System.Collections.Generic.HashSet[string]]::new([string[]]$user_PL.mail, [System.StringComparer]::OrdinalIgnoreCase)
内容的提问来源于stack exchange,提问作者skwierczyk1
相关产品推荐
相关产品推荐

