正在从Csv更新Active Directory字段

sigwle7e  于 2023-01-15  发布在  其他
关注(0)|答案(3)|浏览(109)

我想今天给自己一个有趣的小项目,但现在它已经变成了一个问题,解决方案也找不到了。我有一个巨大的.Csv文件,其中包含所有员工的sAMAccountNametelephoneNumber属性。我想更新我们Active Directory中的所有电话号码。我正在浏览一些旧脚本,采取零件和零件,将工作,这我的第一次迭代让我也在这里。

$Users = Import-Csv -Path C:\Results\EmployeeExtsTest.csv

ForEach ($User in $Users) {
    $User = $User.sAMAccountName
    $telephoneNumber = $User.telephoneNumber
    Get-ADUser -Identity $User | Set-ADUser -telephoneNumber $telephoneNumber
    }

那时我发现PowerShell没有-telephoneNumber属性,所以我做了一些挖掘,然后来到这里。

$Users = Import-Csv -Path C:\Results\EmployeeExtsTest.csv

ForEach ($User in $Users) {
    $User = $User.sAMAccountName
    $telephoneNumber = $User.telephoneNumber
    Get-ADUser -Identity $User | Set-ADUser -Add @{telephoneNumber=$telephoneNumber}
    }

一开始我和我的用户一起测试了它,我一直得到下面的结果。

Set-ADUser : Cannot validate argument on parameter 'Add'. The argument is null or an element of the argument collection contains a null value.
At line:6 char:50
+ ... -Identity $User | Set-ADUser -Add @{telephoneNumber=$telephoneNumber}
+                                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Set-ADUser], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.ActiveDirectory.Management.Commands.SetADUser

我知道它正确地阅读了我的.Csv,因为我可以很好地调用它。

sAMAccountName telephoneNumber
-------------- ---------------
zgroven        1121

我知道这个解决方案“应该”很容易,但它完全逃避我!

uz75evzq

uz75evzq1#

要详细说明@PaulWain答案。Active Directory用户和计算机显示Telephone Number,AD属性为telephoneNumber,但Set-ADUser奇怪地使用参数OfficePhone来设置它。由于OfficePhone是一个“特殊”字段,因此另一个怪癖是,当使用Set-ADUser清除时,您实际上必须使用telephoneNumber作为字段。例如:

$Users = Import-Csv -Path C:\Results\EmployeeExtsTest.csv
  
ForEach ($UserEntry in $Users) {
  $User = Get-ADUser -Filter "samAccountName -like '$($UserEntry.sAMAccountName)'" -Properties *

  #Check to see if the user exists
  if($User)
  {
    #Check to see if the Office Phone number has been cleared in CSV
    if ([string]::IsNullOrEmpty($UserEntry.telephoneNumber))
    {
      #Clear the user's OfficePhone (telephoneNumber) in Active Directory
      Set-ADUser -Identity $User -Clear telephoneNumber
    }
    else
    {                                               
      #Update the user in Active Directory
      Set-ADUser -Identity $User -OfficePhone $UserEntry.telephoneNumber
    }
  }
  else
  {
    Write-Host "User $($UserEntry.sAMAccountName) does not exist in Active Directory"
  }
}

我在脚本中添加的一个内容是在Get-ADUser上使用-Filter参数,这样我就可以验证用户是否存在,而Get-ADUser不会抛出错误。
另一种方法是一次修改所有属性,然后使用Set-ADUser -Instance参数一次设置所有属性(注意:OfficePhone/telephoneNumber是特殊的,必须像上面的代码一样手工清除,其他字段可以手工清除/置空):

$Users = Import-Csv -Path C:\Results\EmployeeExtsTest.csv

ForEach ($UserEntry in $Users) {
  $User = Get-ADUser -Filter "samAccountName -like '$($UserEntry.sAMAccountName)'" -Properties *

  #Check to see if the user exists
  if($User)
  {
    #Check to see if the Office Phone number has been cleared in CSV
    if ([string]::IsNullOrEmpty($UserEntry.telephoneNumber))
    {
      #Clear the user's OfficePhone (telephoneNumber) in Active Directory
      Set-ADUser -Identity $User -Clear telephoneNumber
    }
    else
    {                                               
      #Modify Local instance of the user's properties
      $User.OfficePhone = $UserEntry.telephoneNumber
    }

    #Modify Local instance of other user's properties
    $User.GivenName = $UserEntry.GivenName
    $User.Surname = $UserEntry.Surname

    #..... etc.....

    #Update the user in Active Directory
    Set-ADUser -Instance $User
  }
  else
  {
    Write-Host "User $($UserEntry.sAMAccountName) does not exist in Active Directory"
  }
}
91zkwejq

91zkwejq2#

我相信,由于幕后的别名,您正在被显示的内容和属性的实际名称所误导。
请尝试使用此选项:

set-aduser $user -OfficePhone $telephoneNumber
h9a6wy2h

h9a6wy2h3#

帮我度过难关的最后一个剧本在这里

$Users = Import-Csv -Path C:\Results\EmployeeExts.csv

ForEach ($U in $Users) {
    $User = $U.sAMAccountName
    $telephoneNumber = $U.telephoneNumber
    Set-ADUser $User -OfficePhone $telephoneNumber
    }

因为我在一个学区工作,所以我将来会添加更多的内容来寻找失踪的员工。现在这个脚本已经完美地更新了近1000个广告帐户(除了已经离开的失踪员工)。我想感谢你们所有人帮助我得到了这个答案。你们让我在工作中做得更好。
特别感谢@PaulWain和@HAL9256

相关问题