为什么我不能将成员添加到ADobject

时间:2016-11-16 21:35:43

标签: powershell active-directory

如果我有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指令执行此操作是否有任何危险?

2 个答案:

答案 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

It sure is!

答案 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...