从Csv更新Active Directory字段



今天给自己一个有趣的小项目,但现在它已经成长为一个问题,解决方案逃避我。我有一个巨大的。csv文件,其中包含我们所有员工的sAMAccountNametelephoneNumber属性。我想更新活动通讯录里所有的电话号码。我翻看了我的一些旧脚本,选取了适合我的第一次迭代的部分和部分。

$Users = Import-Csv -Path C:ResultsEmployeeExtsTest.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:ResultsEmployeeExtsTest.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 

我知道这个解决方案应该"别紧张,但我完全逃不掉了!

展开@PaulWain的回答。Active Directory Users and Computers显示"Telephone Number",AD属性是"telephoneNumber",但"Set-ADUser"奇怪地使用了"OfficePhone"参数进行设置。另一个怪现象是由于OfficePhone是"特殊的"。字段,当使用Set-ADUser清除时,您实际上必须使用telephoneNumber作为字段。例如:

$Users = Import-Csv -Path C:ResultsEmployeeExtsTest.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抛出错误。有关更多信息,请参阅我的回答"确定用户是否使用powershell在活动目录中":

另一种方法是一次性修改所有属性,然后使用Set-ADUser -Instance参数一次性设置它们(注意:OfficePhone/telephoneNumber是特殊的,必须像上面的代码一样手动清除,其他字段可以手动清除/设置为空):

$Users = Import-Csv -Path C:ResultsEmployeeExtsTest.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"
}
}

我相信您被显示的内容和属性的实际名称所误导,由于幕后混迭。

试着用这个代替:

set-aduser $user -OfficePhone $telephoneNumber

帮助我完成这一步的最后一个脚本在这里

$Users = Import-Csv -Path C:ResultsEmployeeExts.csv
ForEach ($U in $Users) {
$User = $U.sAMAccountName
$telephoneNumber = $U.telephoneNumber
Set-ADUser $User -OfficePhone $telephoneNumber
}

因为我在一个学区工作,我将来会增加更多的内容来寻找失踪的员工。就目前而言,这个脚本刚刚完美地更新了近1000个AD帐户(除了已经离开的失踪员工)。我要感谢你们所有人的帮助,为我提供了这个答案的一部分。你让我的工作做得更好了。

特别感谢@PaulWain和@HAL9256

相关内容

  • 没有找到相关文章

最新更新