我编写了一个脚本,从人力资源数据库获取数据并填充 AD 中的相关属性,例如部门、职位、经理、位置。
由于人们偶尔会改变职务、部门和/或位置,因此保持 AD 最新状态非常重要,因为我们有依赖此信息有效性的流程,例如基于位置的动态分发组。为了尽量保持流程快速,我只Set-ADuser
为每个用户运行,无论是否有任何变化。
我担心我会不必要地更改修改后的时间戳,因为不断地进行这些更改比验证不需要进行任何更改要快得多。
令我惊讶的是,AD 似乎正在做某物对我来说,这很正常,因为大多数用户修改的时间戳与后续脚本执行时间不匹配。这对我来说似乎是一件好事,因为 AD 正在幕后帮我完成这件事。仅供参考,我有 2 个 DC 可以就此事进行沟通,而且我两次都进行了检查,以确保我不会得出可怕的结论。
我找不到权威的来源来解释这一点,而且我不确定这是 PowerShell 为我完成的工作还是 Active Directory 正在做的事情。
脚本中有两部分对 Active Directory 进行更新。首先更新其员工 ID
foreach($currentUser in $idlessUsers){
Write-Progress @progressParameters -CurrentOperation $currentUser.Name -PercentComplete ($userIndex / $idlessUsers.count * 100)
$matchuser = $hrUsers | Where-Object{$_.givenname -eq $currentUser.givenname -and $_.surname -eq $currentUser.surname}
if($matchuser){
$currentUser | Set-ADUser -EmployeeID $matchuser.employeeid
Write-Host ("{0} employeeid updated to {1}" -f $currentUser.Name, $matchuser.employeeid) -ForegroundColor Green
}
$userIndex++
}
第二个使用 splatting 更改更多信息
foreach($singleADUser in $usersToUpdate){
Write-Progress @progressParameters -CurrentOperation $singleADUser.Name -PercentComplete ($userIndex / $usersToUpdate.count * 100)
# Try and find a match in the $hrUsers
$matchingHRUser = $hrUsers | Where-Object{$_.EmployeeID -eq $singleADUser.EmployeeID}
if($matchingHRUser){
# Get the AD object of this users supervisor
$mathingUserSupervisor = $ADSupervisors | Where-Object{$_.employeeid.trim() -eq $matchingHRUser.supervisorid}
if(!$mathingUserSupervisor){
Write-Host ("Could not find supervisor for {0} using supervisor id: {1}" -f $matchingHRUser.name, $matchingHRUser.supervisorid) -ForegroundColor Red
}
$parameters = @{
Replace = @{l=$matchingHRUser.Location}
Title = $matchingHRUser.title
Department = $matchingHRUser.Department
Manager = $mathingUserSupervisor
}
$singleADUser | Set-ADUser @parameters
} else {
write-host "Cannot find a HR user with ID: '$($singleADUser.EmployeeID)' and Name: $($singleADUser.Name)" -ForegroundColor Red
}
$userIndex++
}