【问题标题】:How can I use Powershell to modify an Active Directory users attributes based on Employee ID?如何使用 Powershell 根据员工 ID 修改 Active Directory 用户属性?
【发布时间】:2023-03-22 01:52:01
【问题描述】:

我正在尝试通过他们的EmployeeID,而不是他们的SAMAccountName 更新用户的 AD 属性。我尝试使用 Set-ADUser,但它不起作用,因为我提供的列表不包含帐户 sAMAccountName,因为它来自无法访问此信息的 HR。

有没有办法通过他们唯一的employeeID更新AD用户属性?

我的源数据 .csv 文件包含以下内容:

员工ID;公司;部门;职务;国家;邮政编码;城市;街道地址;经理
2828;TEST1;TEST2;TestXENUser;DE;12345;MUE;米勒街 6;chrtest

我的脚本如下所示:

$Users = Import-CSV C:\05042017\data.csv

$Users | ForEach-Object {

    $EmpID = $_.EmployeeID

    Get-ADUser -Filter "*" -Property EmployeeID | Where {$_.EmployeeID -eq $EmpID} | Set-ADUser -company $EmployeeID.company -department $EmployeeID.department –title $EmployeeID.title –country $EmployeeID.country –postalCode $EmployeeID.postalCode –city $EmployeeID.city –streetAddress $EmployeeID.streetAddress –manager $EmployeeID.manager -WhatIf
}

我认为我在Set-ADUser 命令之后没有正确连接到属性。我自己测试了一些东西,但我似乎无法让它发挥作用。

我如何告诉Set-ADUser 命令从 .csv 文件中获取属性? 我在过去得到了这个工作,但它是这样的:ForEach $user in $Users 而不是:ForEach-Object

【问题讨论】:

    标签: powershell


    【解决方案1】:

    您只需要通过使用get-aduser 并根据EmployeeID 过滤结果来获取代表AD 中用户的对象,然后将其通过管道传递给set-aduser。例如:

    Get-ADUser -Filter "employeeid -eq '$EmpID'" | Set-ADUser <-Attribute> <Value> -WhatIf
    

    您显然需要识别属性和值,并在您满意它正在执行您期望的操作时移除 -whatif 开关。

    基于您的 CSV 文件,其中包含:

    员工ID;公司;部;标题;国家;邮政编码;城市;街道地址;经理

    你可以这样做:

    $Users = Import-CSV C:\05042017\data.csv -Delimiter ';'
    
    ForEach ($User in $Users) {
        Get-ADUser -Filter "employeeid -eq '$($User.EmployeeID)'" | Set-ADUser -company $User.company -department $User.department –title $User.title –country $User.country –postalCode $User.postalCode –city $User.city –streetAddress $User.streetAddress –manager $User.manager -WhatIf
    }
    

    在上面的示例中,我们使用ForEach 循环处理 CSV 文件中的每一行(我们已将其加载到$Users)并创建一个值为$User 的对象。然后我们可以在Set-ADUser 中引用 $User 的属性(使用 . 表示法)来获取我们需要的属性值。

    【讨论】:

    • 您应该编辑您的问题并将其添加到那里,而不是将其作为答案发布。我将根据新信息修改我的答案,我认为ForEach 循环会更简单/更清晰。
    • 我已根据您提供的 CSV 标题修改了我的答案以使用 ForEach。我还通过匹配-filter 参数而不是使用where 来简化获取用户的方式。
    • 出现错误:Get-ADUser : 无法识别搜索过滤器。行:2,字母:15。+ CategoryInfo:NotSpecified:(:) [Get-ADUser],ADException + FullyQualifiedErrorId:Der Suchfilter wurde nicht erkannt,Microsoft.Act iveDirectory.Management.Commands.GetADUser
    • 奇怪,它适用于我的环境。然后尝试恢复到此:Get-ADUser -Filter * -property employeeid | where {$_.employeeid -eq $User.EmployeeID} | Set-ADUser 与在-filter 属性中过滤相比,在大型 AD 中运行这可能需要更长的时间。
    猜你喜欢
    • 2023-03-26
    • 2018-07-31
    • 1970-01-01
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多