如果我有Microsoft.ActiveDirectory.Management.ADObject类型的对象,我不能使用Add-Member添加note属性,除非我使用-force。如果我不使用force指令,我会收到如下错误:
Add-Member:无法添加名称为" SAMAccountName" 因为具有该名称的成员已存在。要覆盖 无论如何,将force参数添加到命令中。
但是,它还不存在。任何属性名称都会发生这种情况。例如:
$domainAccount | Add-Member -NotePropertyName SAMAccountName -NotePropertyValue $account.name
但是,这有效:
$domainAccount | Add-Member -NotePropertyName SAMAccountName -NotePropertyValue $account.name -force
我无法找到解释此问题的文档。你能解释一下吗?并且,使用-force指令执行此操作是否有任何危险?
答案 0 :(得分:2)
ADObject
类的行为有点笨拙,只需询问属性是否存在,如果不属性,则会导致创建属性。
当Add-Member
检查SAMAccountName
属性是否已存在时,它偶然会导致它被创建。
只需使用-Force
参数开关。
您可以自己重现此行为:
Import-Module ActiveDirectory
$ADObject = New-Object Microsoft.ActiveDirectory.Management.ADObject
# No SamAccountName property will be listed
$ADObject | Get-Member
现在,尝试引用一个不存在的属性,比如“SamAccountName”(ADObject扩展了基本上是字典的ADPropertyValueCollection
类,因此索引到它的属性是完全有效的):
$ADObject["SamAccountName"]
# SamAccountName property will now be listed even though we haven't set it
$ADObject | Get-Member
这不仅限于AD属性名称,任何事情都可以:
"1 This","2 Is","3 Quite","4 Funky","5 Isn't","6 It?" |ForEach-Object {
[void]$ADObject[$_]
}
$ADObject |Get-Member
答案 1 :(得分:0)
Microsoft.ActiveDirectory.Management.ADObject 已具有 SamAccountName 属性。您无需重新创建它。只需要为它定义值,如下所示:
$obj = New-Object Microsoft.ActiveDirectory.Management.ADObject
$obj.SamAccountName = 'AccountName'
$obj | Get-Member
输出:
TypeName: Microsoft.ActiveDirectory.Management.ADObject
Name MemberType Definition
---- ---------- ----------
Contains Method bool Contains(string propertyName)
Equals Method bool Equals(System.Object obj)
GetEnumerator Method System.Collections.IDictionaryEnumerator GetEnumerator()
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
Item ParameterizedProperty Microsoft.ActiveDirectory.Management.ADPropertyValueCollection Item(string propertyN...
SamAccountName Property Microsoft.ActiveDirectory.Management.ADPropertyValueCollection SamAccountName {get;s...