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