使用 powershell 从 CSV 文件更新用户 AD 属性

Update user AD attributes from CSV file using powershell

我正在尝试使用 powershell 从 CSV 文件更新 AD 用户 attributes:title、physicalDeliveryOfficeName 和部门。我是 Powershell 的新手,所以我需要一些帮助。 (请,并提前致谢) 因此,想法是匹配过滤器是 displayName 属性,我使用的脚本是:

Import-Module ActiveDirectory 
$csv = Import-Csv C:\Temp\AD_import_test.csv 
foreach ($line in $csv) {
$displayName = $line.displayName
Get-ADUser -Filter {displayName -eq $displayName} |
Set-ADUser -Title $($csv.title) -department $($csv.Department) -physicalDeliveryOfficeName $($csv.physicalDeliveryOfficeName) }

但是脚本返回错误:

 Set-ADUser : Cannot convert 'System.Object[]' to the type 'System.String' required by parameter 'Title'. Specified method is not supported.
    At line:6 char:19
    + Set-ADUser -Title $($csv.title) -department $($csv.Department) -physi ...
    +                   ~~~~~~~~~~~~~
        + CategoryInfo          : InvalidArgument: (:) [Set-ADUser], ParameterBindingException
        + FullyQualifiedErrorId : CannotConvertArgument,Microsoft.ActiveDirectory.Management.Commands.SetADUser
 
Set-ADUser : Cannot convert 'System.Object[]' to the type 'System.String' required by parameter 'Title'. Specified method is not supported.
At line:6 char:19
+ Set-ADUser -Title $($csv.title) -department $($csv.Department) -physi ...
+                   ~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Set-ADUser], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgument,Microsoft.ActiveDirectory.Management.Commands.SetADUser 

你的代码对我来说似乎不错,除了 set-aduser 你需要用 $line

替换 $csv
Import-Module ActiveDirectory 
$csv = Import-Csv C:\Temp\AD_import_test.csv 
foreach ($line in $csv) {
$displayName = $line.displayName
Get-ADUser -Filter {displayName -eq $displayName} |
Set-ADUser -Title $($line.title) -department $($line.Department) -physicalDeliveryOfficeName $($line.physicalDeliveryOfficeName) }

您使用了错误的变量来分配这些值。在您的脚本 $csv 中包含整个 .csv 文件,但在您的 foreach 行中,您将每一行加载到 $line 中,这就是您需要设置值的内容。

所以从本质上讲,$($csv.title) 等于所有标题字段,而不仅仅是您感兴趣的字段。这就是为什么您收到错误消息说它是 System.Object[] 而不是 System.String... 因为它不是一个单一值。

我注意到您在“$displayName = $line.displayName”行上的设置是正确的,所以只有 Set-ADUser 行需要更新,如:

Set-ADUser -Title $($line.title) -department $($line.Department) -physicalDeliveryOfficeName $($line.physicalDeliveryOfficeName) }

编辑: 另外,对于这样的东西,一个有用的技巧是添加一些 Write-Output 行来显示变量内容是什么,这样您就可以检查它们是否符合您的预期,例如:

Write-Output $($line.title)

然后在 $line.title 的情况下应该显示单个值,而如果你这样做 $($csv.title) 它会 return 多个值并告诉你在哪里问题是。