Powershell 为什么添加成员认为所有可能的属性都已经存在(在Microsoft.ActiveDirectory.Management.ADUser对象上)?

Powershell 为什么添加成员认为所有可能的属性都已经存在(在Microsoft.ActiveDirectory.Management.ADUser对象上)?,powershell,Powershell,所以,我在一家医院帮忙,我遇到了一些奇怪的行为 如果我获得Microsoft.ActiveDirectory.Management.ADUser类型的对象,例如通过get ADUser,每当我尝试使用add Member添加NoteProperty时,您会遇到以下情况: PS C:\Users\someuser> $u = get-aduser someuser PS C:\Users\someuser> $u | add-member ldskfjlkdsfj dfklsjdflk

所以,我在一家医院帮忙,我遇到了一些奇怪的行为

如果我获得Microsoft.ActiveDirectory.Management.ADUser类型的对象,例如通过
get ADUser
,每当我尝试使用
add Member
添加
NoteProperty
时,您会遇到以下情况:

PS C:\Users\someuser> $u = get-aduser someuser
PS C:\Users\someuser> $u | add-member ldskfjlkdsfj dfklsjdflkdsjf
add-member : Cannot add a member with the name "ldskfjlkdsfj" because a member with that
name already exists. To overwrite the member anyway, add the Force parameter to your
command.
At line:1 char:6
+ $u | add-member ldskfjlkdsfj dfklsjdflkdsjf
+      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (CN=someuser,...example,DC=com:PSObject) [Add-Member], InvalidOperationException
    + FullyQualifiedErrorId : MemberAlreadyExists,Microsoft.PowerShell.Commands.AddMemberCommand
使用
-Force
参数确实允许我“覆盖”这个伪属性,但是这个对象的什么使它看起来好像已经拥有了所有属性

尝试访问任何属性(即使是以前未添加的属性)只会返回任何内容,而不是像我预期的那样抛出异常。设置属性是可能的,但对于“常规”PowerShell对象,我认为不应该这样

PS C:\Users\someuser> $u = get-aduser someuser
PS C:\Users\someuser> $u.bogus
PS C:\Users\someuser> $u.fishy
PS C:\Users\someuser> $u.fishy = "fish"
PS C:\Users\someuser> $u.fishy
fish
PS C:\Users\someuser>

我不确定这是否重要,但我在装有PowerShell 4.0的Windows Server 2012 R2上看到了这种行为。

这是因为AD对象是“特殊”的,它们在扩展属性上的行为很奇怪。您可以这样做,因为它会干扰管道绑定

在这种情况下,我认为这是由于
addmember
测试特定属性的存在性(在AD对象上,即使该属性是您刚刚创建的并且没有任何值,该属性也始终为真)

您自己在测试各种属性名称并分配给它们时也看到了这一点


您应该能够使用
Add Member-Force
使其工作。

我对问题的位置有点犹豫,关于这是属于ServerFault还是StackOverflow,最后我认为它属于这里,因为这是一个一般的PowerShell编程问题,最初的问题是关于如何使用PowerShell来完成系统管理任务。我认为它属于这里。