为什么 Add-Member 认为每个可能的属性都已存在(在 Microsoft.ActiveDirectory.Management.ADUser 对象上)?

Per*_*rgk 5 powershell

因此,我在帮助解决有关 ServerFault 的问题时遇到了一些奇怪的行为。

如果我得到一个类型的对象Microsoft.ActiveDirectory.Management.ADUser,例如 through Get-ADUser,每当我尝试添加NotePropertyusing时Add-Member,都会遇到以下情况:

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
Run Code Online (Sandbox Code Playgroud)

使用-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>
Run Code Online (Sandbox Code Playgroud)

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

bri*_*ist 5

这是因为 AD 对象很“特殊”,并且在涉及扩展属性时它们的行为很奇怪。您可以在这个问题中阅读更多相关信息,它与管道绑定混淆。

在这种情况下,我认为是由于Add-Member测试特定属性的存在(在 AD 对象上该属性始终为 true,即使该属性是您刚刚编写的并且没有值)。

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

不过,您应该能够使用Add-Member -Force它来使其工作。