我知道最好的做法是使用属性值,如Name
、Distinguishedname
等。但是,我正在使用两个系统,并且Active Directory中唯一在两个系统中相同的字段是extensionAttribute1
。下面是代码。错误出在 foreach
循环中,并且不接受变量进行-Identity
。
Function ArchiveLeavers
{
Write-Host "Archiving leavers. Details below..."
$csvLeavers = Import-Csv -Path $fileLeavers
foreach ($user in $csvLeavers)
{
$csvID = $user.ExtensionAttribute1
if (Get-ADUser -filter {extensionAttribute1 -eq $csvID} -SearchBase $LeaverOU)
{
Write-Host ($user.GivenName + ' ' + $user.LastName) " is already in leavers"
}
else
{
ForEach-Object
{
$identity = Get-ADUser -filter {extensionAttribute1 -eq $csvID} | select distinguishedName | Format-Table -HideTableHeaders
write-host ($user.GivenName + ' ' + $user.LastName) " needs moving"
Move-ADObject -Identity $identity -TargetPath $LeaverOU;
Set-ADUser -Add @{extensionAttribute7=$user.ExtensionAttribute7}
Write-Host ($user.GivenName + ' ' + $user.LastName) " has been moved"
}
}
}
}
这是错误:
Move-ADObject : 无法将"System.Object[]"转换为类型 参数"Identity"需要Microsoft.ActiveDirectory.Management.ADObject"。指定 方法不受支持。 行:21 字符:57 +Move-ADObject -Identity $identity -TargetPath $F ... +~~~~~~~~~ + 类别信息 : 无效参数: (:)[Move-ADObject], ParameterBindingException + FullQualifiedErrorId : CannotConvertArgument,Microsoft.ActiveDirectory.Management.Command.MoveADObject
您正在使用格式表,它将$Identity
变量转换为Move-ADObject
不知道的对象,这些对象仅获得SAM,Guid,SID等输入类型。
从管道中删除格式表,更改以下内容:
$identity = Get-ADUser -filter {extensionAttribute1 -eq $csvID} | select distinguishedName | Format-Table -HideTableHeaders
对此:
$identity = Get-ADUser -filter {extensionAttribute1 -eq $csvID}