$info = Get-ADUser -Filter * -Properties * | ForEach-Object {$_.PSObject.Properties} | Where-Object {$_.value -like "NULL"}
ForEach ($i in $info){
Set-ADUser -Identity $i.BaseObject.SamAccountName -Clear $i.Name
}
以上是我用来查找所有字符串值为“NULL”的 AD 用户字段的代码。我正在尝试清除这些字段。
下面是我经常看到的异常,尽管属性名称显然存在(因为它是直接从 AD 属性名称值中提取的)。
我错过了什么?
Set-ADUser : The specified directory service attribute or value does not exist
Parameter name: OfficePhone
At line:2 char:5
+ Set-ADUser -Identity $i.BaseObject.SamAccountName -Clear $i.Name
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (RHanson:ADUser) [Set-ADUser], ArgumentException
+ FullyQualifiedErrorId : ActiveDirectoryCmdlet:System.ArgumentException,Microsoft.ActiveDirectory.Management.Commands.SetADUser
答案1
直接从文档:
-办公室电话
[…] 要修改对象属性,您必须使用 LDAP 显示名称。 […]
和
-办公室电话
[…] 此属性的 LDAP 显示名称 (ldapDisplayName) 是 telephoneNumber。[…]
以下是电话号码属性:
CN:电话号码
Ldap 显示名称:电话号码
不幸的是,Get-ADUser -Properties *
同时接收两者,OfficePhone
并且telephoneNumber
我不知道如何以编程方式区分真实属性和模块本身内置的属性别名。
作为一种解决方法,您可以通过管道传输它,Get-ADObject
这样就不会对您施加别名属性:
$info = Get-ADUser -Filter * |
Get-ADObject -Properties * |
ForEach-Object {$_.PSObject.Properties} |
Where-Object {$_.value -like "NULL"}
ForEach ($i in $info){
Set-ADUser -Identity $i.BaseObject.SamAccountName -Clear $i.Name
}