因此,我在帮助解决有关 ServerFault 的问题时遇到了一些奇怪的行为。
如果我得到一个类型的对象Microsoft.ActiveDirectory.Management.ADUser
,例如 through Get-ADUser
,每当我尝试添加NoteProperty
using时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 上看到了这种行为。
这是因为 AD 对象很“特殊”,并且在涉及扩展属性时它们的行为很奇怪。您可以在这个问题中阅读更多相关信息,它与管道绑定混淆。
在这种情况下,我认为是由于Add-Member
测试特定属性的存在(在 AD 对象上该属性始终为 true,即使该属性是您刚刚编写的并且没有值)。
您在测试各种属性名称并分配给它们时自己已经看到了这一点。
不过,您应该能够使用Add-Member -Force
它来使其工作。
归档时间: |
|
查看次数: |
1859 次 |
最近记录: |