根据 EmployeeID 属性从 CSV 更新 AD 用户

Posted

技术标签:

【中文标题】根据 EmployeeID 属性从 CSV 更新 AD 用户【英文标题】:Update AD User From CSV Based on EmployeeID Attribute 【发布时间】:2017-03-16 19:22:19 【问题描述】:

我正在尝试根据员工 ID 号更新 AD 用户。对于我们的组织来说,这是一个可靠的关键领域。

在这种情况下,每个用户都是用一个employeeID 属性创建的。我对用户的初始创建(New-ADuser)使用相同的 csv(仅设置较少的属性),因为我是用户的更新(Set-ADUser)。

其中大部分内容非常简单,主要来自here。我成功导入了我的 csv,并且可以打印我的变量。我的结果消息表明,当我执行 If/Else 时,“未找到具有 ID 的用户,或找到多个用户”,这两者都不正确。我相信我的问题出在这一行:

$UserID = Get-ADUser employeeID=$EmployeeId

这里是整个脚本。我在这里做错了什么?

# Import AD Module
Import-Module ActiveDirectory

# Import CSV into variable $userscsv
$ADUsers = Import-Csv -Path C:\Scripting\CSVs\UpdateADUsers.csv


foreach ($User in $ADUsers)

#Retrieve info from CSV
$Title = $User.Title
$Department = $User.department
$Office = $User.Office
$EmployeeId = $User.EmployeeId
$Manager = $User.manager
$Company = $User.Orglevel02

#get user DN
$UserDN = Get-ADUser -LDAPFilter "EmployeeId=$EmployeeId"

If ($UserDN.Count -eq 1)
 
        # Use the Set-ADUser cmdlet to assign the new attribute values.
        Set-ADUser -Identity $UserDN -Replace @title=$Title;physicalDeliveryOfficeName=$Office;manager=$Manager
    
    Else "User with ID $ID either not found, or more than one user found."

【问题讨论】:

您使用的是employeeID而不是employeeNumber,对吗? 正确。属性编辑器之旅告诉我。 【参考方案1】:
$UserDN = Get-ADUser -LDAPFilter "(EmployeeId=*$EmployeeId*)"

【讨论】:

我最初尝试使用该语法,减去 * 通配符。结果仍然相同,表示未找到 ID 为 1234567 的用户,或找到多个用户。 添加 write-host $UserDN.count 以查看它是没有还是不止一个。还值得在 ​​$employeeid 上做一个 write-host,以确保它确实包含您认为的内容。 试试(EmployeeId=*$EmployeeId*),因为AD中可能有一些空白字符? 从 R 中的 HRIS 系统创建导出 CSV 时,我消除了所有内容周围的空白。当然可以,但无论如何我都包括了 ___ 。至于 write-host $UserDN.count,响应如下: 'code' If False # 使用 Set-ADUser cmdlet 分配新的属性值。 Set-ADUser -Identity $UserDN -Replace @title=$Title;physicalDeliveryOfficeName=$Office;manager=$Manager 'code' AD 字段中会不会有空格?【参考方案2】:

Marks answer 包含过滤器所需的主要修正。

您的每个搜索条件至少必须包含在一组括号中。就像ldapexplorer.com上给出的例子一样

Equality: (attribute=abc)     , e.g. (&(objectclass=user)(displayName=Foeckeler)

您当前的示例语法错误,因为它缺少大括号,但并不构成 cmdlet 失败,因此,没有返回任何 ($null)。您在 cmets 对此有回应

我最初尝试使用该语法,减去 * 通配符。结果仍然相同,表明未找到 ID 为 1234567 的用户,或找到多个用户。

如果您在其中硬编码一个员工 ID 以进行测试怎么办?

Get-ADUser -LDAPFilter "(EmployeeId=12345)"

如果可行,则说明您的源文件有问题。前导或尾随空格或隐藏字符?无论哪种方式,请查看源以确定是否必须使用.Trim() 进行测试,因为您最初可能看不到问题。

Get-ADUser -LDAPFilter "(EmployeeId=$($EmployeeID.Trim()))"

【讨论】:

我面前没有那个系统,因为它是在网络上的某个地方进行测试和抽象的,但是在稍微更改语法后,我能够在某一时刻对 ID 进行硬编码。我什至可以回去为用户绘制 EmployeeID。明天更多,当我可以进入那个系统时。 @Scottieie Care 要分享吗? 通过更多搜索,我发现了一个代码 sn-p 在这里纠正了我的问题:[link] (serverfault.com/questions/707776/…)。我最终使用了 $_.psobject.properties,我相信它可以获取每个用户的 AD 属性,将 AD 中的 EID 与 CSV 中的 EID 进行比较。然后继续使用 Set-ADUser 设置新属性。 过滤器在后台所做的所有事情都是转换为 ldap 过滤器。这应该与您已经在做的事情没有什么不同,只是您刚刚给出的示例与原始帖子的变量名称不同。 @Mark 我正在研究如何在 SO 中链接的语法。迷你降价让我望而却步。我在堆栈溢出中得到一个 F。这个过滤器似乎有效:'$user = Get-ADUser -Filter employeeID -eq $eid'

以上是关于根据 EmployeeID 属性从 CSV 更新 AD 用户的主要内容,如果未能解决你的问题,请参考以下文章

csv的带雇员编号的csv中的SamAccountName

AD用户属性项目添加

从另一个表的行批量更新一个表

从 LibreOffice 创建一个文本/csv 文件

使用游标更新Temp表中的记录

如何根据字段合并两个 CSV 文件并在每条记录上保持相同数量的属性?