首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Powershell管道属性绑定失败

Powershell管道属性绑定失败
EN

Stack Overflow用户
提问于 2015-07-07 20:27:11
回答 1查看 1.8K关注 0票数 0

我遇到了一个我搞不懂的特殊问题。我试图将Get-ADUser -Identity Test-User -Property SamAccountName的值绑定到定制的cmdlet。这是我以前做过很多次的事情,但由于一些奇怪的原因,它现在已经失败了。为了降低复杂性,我编写了一个测试函数来最小化复杂性。这一职能是:

代码语言:javascript
复制
function Test-Binding{
    [cmdletbinding()]
    Param
    (
        [Parameter(Mandatory=$true,
                   ValueFromPipelineByPropertyName=$True)]
        [Alias("SamAccountName")]
        [string]
        $Identity
    )

    return $Identity
}

在执行Get-ADUser -Identity Test-user | Test-Binding时,我会得到以下错误:

代码语言:javascript
复制
Test-Binding : Cannot bind argument to parameter 'Identity' because it is an empty string.
At line:1 char:76
+ Trace-Command parameterbinding -Expression {Get-ADUser -Identity Test-User | Test- ...
+                                                                            ~~~~~
    + CategoryInfo          : InvalidData: (CN=Test-User...,DC=contoso,DC=com:PSObject) [Test-Binding], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Test-Binding

在查看了我的代码并查看了之前成功的脚本之后,我的下一步是运行跟踪。在跟踪中,绑定在第一次尝试中是成功的,但是powershell随后尝试继续将其绑定到其他输入值,直到它退出为止。这是垃圾场:

代码语言:javascript
复制
DEBUG: ParameterBinding Information: 0 : BIND NAMED cmd line args [Get-ADUser]
DEBUG: ParameterBinding Information: 0 : BIND POSITIONAL cmd line args [Get-ADUser]
DEBUG: ParameterBinding Information: 0 : BIND cmd line args to DYNAMIC parameters.
DEBUG: ParameterBinding Information: 0 :     DYNAMIC parameter object: [Microsoft.ActiveDirectory.Management.Commands.GetADUserParameterSet]
DEBUG: ParameterBinding Information: 0 :     BIND NAMED args to DYNAMIC parameters
DEBUG: ParameterBinding Information: 0 :         BIND arg [Test-User] to parameter [Identity]
DEBUG: ParameterBinding Information: 0 :             COERCE arg to [Microsoft.ActiveDirectory.Management.ADUser]
DEBUG: ParameterBinding Information: 0 :                 Trying to convert argument value from System.String to Microsoft.ActiveDirectory.Management.ADUser
DEBUG: ParameterBinding Information: 0 :                 CONVERT arg type to param type using LanguagePrimitives.ConvertTo
DEBUG: ParameterBinding Information: 0 :                 CONVERT SUCCESSFUL using LanguagePrimitives.ConvertTo: [Test-User]
DEBUG: ParameterBinding Information: 0 :             Executing VALIDATION metadata: [Microsoft.ActiveDirectory.Management.Commands.ValidateNotNullOrEmptyADEntityAttribute
]
DEBUG: ParameterBinding Information: 0 :             Executing VALIDATION metadata: [System.Management.Automation.ValidateNotNullAttribute]
DEBUG: ParameterBinding Information: 0 :             BIND arg [Test-User] to param [Identity] SUCCESSFUL
DEBUG: ParameterBinding Information: 0 :     BIND POSITIONAL args to DYNAMIC parameters
DEBUG: ParameterBinding Information: 0 : MANDATORY PARAMETER CHECK on cmdlet [Get-ADUser]
DEBUG: ParameterBinding Information: 0 : BIND NAMED cmd line args [Test-Binding]
DEBUG: ParameterBinding Information: 0 : BIND POSITIONAL cmd line args [Test-Binding]
DEBUG: ParameterBinding Information: 0 : MANDATORY PARAMETER CHECK on cmdlet [Test-Binding]
DEBUG: ParameterBinding Information: 0 :     BIND arg [] to parameter [Identity]
DEBUG: ParameterBinding Information: 0 :         Executing DATA GENERATION metadata: [System.Management.Automation.ArgumentTypeConverterAttribute]
DEBUG: ParameterBinding Information: 0 :             result returned from DATA GENERATION: 
DEBUG: ParameterBinding Information: 0 :         COERCE arg to [System.String]
DEBUG: ParameterBinding Information: 0 :             Parameter and arg types the same, no coercion is needed.
DEBUG: ParameterBinding Information: 0 :         BIND arg [] to param [Identity] SUCCESSFUL
DEBUG: ParameterBinding Information: 0 : CALLING BeginProcessing
DEBUG: ParameterBinding Information: 0 : CALLING BeginProcessing
DEBUG: ParameterBinding Information: 0 : BIND PIPELINE object to parameters: [Test-Binding]
DEBUG: ParameterBinding Information: 0 :     PIPELINE object TYPE = [Microsoft.ActiveDirectory.Management.ADUser]
DEBUG: ParameterBinding Information: 0 :     RESTORING pipeline parameter's original values
DEBUG: ParameterBinding Information: 0 :     Parameter [Identity] PIPELINE INPUT ValueFromPipelineByPropertyName NO COERCION
DEBUG: ParameterBinding Information: 0 :     BIND arg [Microsoft.ActiveDirectory.Management.ADPropertyValueCollection] to parameter [Identity]
DEBUG: ParameterBinding Information: 0 :         Executing DATA GENERATION metadata: [System.Management.Automation.ArgumentTypeConverterAttribute]
DEBUG: ParameterBinding Information: 0 :             result returned from DATA GENERATION: Microsoft.ActiveDirectory.Management.ADPropertyValueCollection
DEBUG: ParameterBinding Information: 0 :         BIND arg [Microsoft.ActiveDirectory.Management.ADPropertyValueCollection] to param [Identity] SKIPPED
DEBUG: ParameterBinding Information: 0 :     Parameter [Identity] PIPELINE INPUT ValueFromPipelineByPropertyName WITH COERCION
DEBUG: ParameterBinding Information: 0 :     BIND arg [Microsoft.ActiveDirectory.Management.ADPropertyValueCollection] to parameter [Identity]
DEBUG: ParameterBinding Information: 0 :         Executing DATA GENERATION metadata: [System.Management.Automation.ArgumentTypeConverterAttribute]
DEBUG: ParameterBinding Information: 0 :             result returned from DATA GENERATION: 
DEBUG: ParameterBinding Information: 0 :         COERCE arg to [System.String]
DEBUG: ParameterBinding Information: 0 :             Parameter and arg types the same, no coercion is needed.
DEBUG: ParameterBinding Information: 0 :         ERROR: Argument cannot be an empty string
DEBUG: ParameterBinding Information: 0 : BIND PIPELINE object to parameters: [Out-Default]
DEBUG: ParameterBinding Information: 0 :     PIPELINE object TYPE = [System.Management.Automation.ErrorRecord]
DEBUG: ParameterBinding Information: 0 :     RESTORING pipeline parameter's original values
DEBUG: ParameterBinding Information: 0 :     Parameter [InputObject] PIPELINE INPUT ValueFromPipeline NO COERCION
DEBUG: ParameterBinding Information: 0 :     BIND arg [Cannot bind argument to parameter 'Identity' because it is an empty string.] to parameter [InputObject]
DEBUG: ParameterBinding Information: 0 :         BIND arg [Cannot bind argument to parameter 'Identity' because it is an empty string.] to param [InputObject] SUCCESSFUL
DEBUG: ParameterBinding Information: 0 : MANDATORY PARAMETER CHECK on cmdlet [Out-Default]
DEBUG: ParameterBinding Information: 0 : BIND NAMED cmd line args [Out-LineOutput]
DEBUG: ParameterBinding Information: 0 :     BIND arg [Microsoft.PowerShell.Commands.Internal.Format.ConsoleLineOutput] to parameter [LineOutput]
DEBUG: ParameterBinding Information: 0 :         COERCE arg to [System.Object]
DEBUG: ParameterBinding Information: 0 :             Parameter and arg types the same, no coercion is needed.
DEBUG: ParameterBinding Information: 0 :         BIND arg [Microsoft.PowerShell.Commands.Internal.Format.ConsoleLineOutput] to param [LineOutput] SUCCESSFUL
DEBUG: ParameterBinding Information: 0 : BIND POSITIONAL cmd line args [Out-LineOutput]
DEBUG: ParameterBinding Information: 0 : MANDATORY PARAMETER CHECK on cmdlet [Out-LineOutput]
DEBUG: ParameterBinding Information: 0 : CALLING BeginProcessing
DEBUG: ParameterBinding Information: 0 : BIND PIPELINE object to parameters: [Out-LineOutput]
DEBUG: ParameterBinding Information: 0 :     PIPELINE object TYPE = [System.Management.Automation.ErrorRecord]
DEBUG: ParameterBinding Information: 0 :     RESTORING pipeline parameter's original values
DEBUG: ParameterBinding Information: 0 :     Parameter [InputObject] PIPELINE INPUT ValueFromPipeline NO COERCION
DEBUG: ParameterBinding Information: 0 :     BIND arg [Cannot bind argument to parameter 'Identity' because it is an empty string.] to parameter [InputObject]
DEBUG: ParameterBinding Information: 0 :         BIND arg [Cannot bind argument to parameter 'Identity' because it is an empty string.] to param [InputObject] SUCCESSFUL
DEBUG: ParameterBinding Information: 0 : MANDATORY PARAMETER CHECK on cmdlet [out-lineoutput]
DEBUG: ParameterBinding Information: 0 : BIND NAMED cmd line args [Format-Default]
DEBUG: ParameterBinding Information: 0 : BIND POSITIONAL cmd line args [Format-Default]
DEBUG: ParameterBinding Information: 0 : MANDATORY PARAMETER CHECK on cmdlet [Format-Default]
DEBUG: ParameterBinding Information: 0 : CALLING BeginProcessing
DEBUG: ParameterBinding Information: 0 : BIND PIPELINE object to parameters: [Format-Default]
DEBUG: ParameterBinding Information: 0 :     PIPELINE object TYPE = [System.Management.Automation.ErrorRecord]
DEBUG: ParameterBinding Information: 0 :     RESTORING pipeline parameter's original values
DEBUG: ParameterBinding Information: 0 :     Parameter [InputObject] PIPELINE INPUT ValueFromPipeline NO COERCION
DEBUG: ParameterBinding Information: 0 :     BIND arg [Cannot bind argument to parameter 'Identity' because it is an empty string.] to parameter [InputObject]
DEBUG: ParameterBinding Information: 0 :         BIND arg [Cannot bind argument to parameter 'Identity' because it is an empty string.] to param [InputObject] SUCCESSFUL
DEBUG: ParameterBinding Information: 0 : MANDATORY PARAMETER CHECK on cmdlet [format-default]
DEBUG: ParameterBinding Information: 0 : BIND NAMED cmd line args [Set-StrictMode]
DEBUG: ParameterBinding Information: 0 :     BIND arg [1] to parameter [Version]
DEBUG: ParameterBinding Information: 0 :         Executing DATA GENERATION metadata: [Microsoft.PowerShell.Commands.SetStrictModeCommand+ArgumentToVersionTransformationAt
tribute]
DEBUG: ParameterBinding Information: 0 :             result returned from DATA GENERATION: 1.0
DEBUG: ParameterBinding Information: 0 :         COERCE arg to [System.Version]
DEBUG: ParameterBinding Information: 0 :             Parameter and arg types the same, no coercion is needed.
DEBUG: ParameterBinding Information: 0 :         Executing VALIDATION metadata: [Microsoft.PowerShell.Commands.SetStrictModeCommand+ValidateVersionAttribute]
DEBUG: ParameterBinding Information: 0 :         BIND arg [1.0] to param [Version] SUCCESSFUL
DEBUG: ParameterBinding Information: 0 : BIND POSITIONAL cmd line args [Set-StrictMode]
DEBUG: ParameterBinding Information: 0 : MANDATORY PARAMETER CHECK on cmdlet [Set-StrictMode]
DEBUG: ParameterBinding Information: 0 : CALLING BeginProcessing
DEBUG: ParameterBinding Information: 0 : CALLING EndProcessing
DEBUG: ParameterBinding Information: 0 : BIND NAMED cmd line args [Set-StrictMode]
DEBUG: ParameterBinding Information: 0 :     BIND arg [1] to parameter [Version]
DEBUG: ParameterBinding Information: 0 :         Executing DATA GENERATION metadata: [Microsoft.PowerShell.Commands.SetStrictModeCommand+ArgumentToVersionTransformationAt
tribute]
DEBUG: ParameterBinding Information: 0 :             result returned from DATA GENERATION: 1.0
DEBUG: ParameterBinding Information: 0 :         COERCE arg to [System.Version]
DEBUG: ParameterBinding Information: 0 :             Parameter and arg types the same, no coercion is needed.
DEBUG: ParameterBinding Information: 0 :         Executing VALIDATION metadata: [Microsoft.PowerShell.Commands.SetStrictModeCommand+ValidateVersionAttribute]
DEBUG: ParameterBinding Information: 0 :         BIND arg [1.0] to param [Version] SUCCESSFUL
DEBUG: ParameterBinding Information: 0 : BIND POSITIONAL cmd line args [Set-StrictMode]
DEBUG: ParameterBinding Information: 0 : MANDATORY PARAMETER CHECK on cmdlet [Set-StrictMode]
DEBUG: ParameterBinding Information: 0 : CALLING BeginProcessing
DEBUG: ParameterBinding Information: 0 : CALLING EndProcessing
DEBUG: ParameterBinding Information: 0 : BIND NAMED cmd line args [Set-StrictMode]
DEBUG: ParameterBinding Information: 0 :     BIND arg [1] to parameter [Version]
DEBUG: ParameterBinding Information: 0 :         Executing DATA GENERATION metadata: [Microsoft.PowerShell.Commands.SetStrictModeCommand+ArgumentToVersionTransformationAt
tribute]
DEBUG: ParameterBinding Information: 0 :             result returned from DATA GENERATION: 1.0
DEBUG: ParameterBinding Information: 0 :         COERCE arg to [System.Version]
DEBUG: ParameterBinding Information: 0 :             Parameter and arg types the same, no coercion is needed.
DEBUG: ParameterBinding Information: 0 :         Executing VALIDATION metadata: [Microsoft.PowerShell.Commands.SetStrictModeCommand+ValidateVersionAttribute]
DEBUG: ParameterBinding Information: 0 :         BIND arg [1.0] to param [Version] SUCCESSFUL
DEBUG: ParameterBinding Information: 0 : BIND POSITIONAL cmd line args [Set-StrictMode]
DEBUG: ParameterBinding Information: 0 : MANDATORY PARAMETER CHECK on cmdlet [Set-StrictMode]
DEBUG: ParameterBinding Information: 0 : CALLING BeginProcessing
DEBUG: ParameterBinding Information: 0 : CALLING EndProcessing
DEBUG: ParameterBinding Information: 0 : BIND NAMED cmd line args [Set-StrictMode]
DEBUG: ParameterBinding Information: 0 :     BIND arg [1] to parameter [Version]
DEBUG: ParameterBinding Information: 0 :         Executing DATA GENERATION metadata: [Microsoft.PowerShell.Commands.SetStrictModeCommand+ArgumentToVersionTransformationAt
tribute]
DEBUG: ParameterBinding Information: 0 :             result returned from DATA GENERATION: 1.0
DEBUG: ParameterBinding Information: 0 :         COERCE arg to [System.Version]
DEBUG: ParameterBinding Information: 0 :             Parameter and arg types the same, no coercion is needed.
DEBUG: ParameterBinding Information: 0 :         Executing VALIDATION metadata: [Microsoft.PowerShell.Commands.SetStrictModeCommand+ValidateVersionAttribute]
DEBUG: ParameterBinding Information: 0 :         BIND arg [1.0] to param [Version] SUCCESSFUL
DEBUG: ParameterBinding Information: 0 : BIND POSITIONAL cmd line args [Set-StrictMode]
DEBUG: ParameterBinding Information: 0 : MANDATORY PARAMETER CHECK on cmdlet [Set-StrictMode]
DEBUG: ParameterBinding Information: 0 : CALLING BeginProcessing
DEBUG: ParameterBinding Information: 0 : CALLING EndProcessing
Test-Binding : Cannot bind argument to parameter 'Identity' because it is an empty string.
At line:1 char:76
+ Trace-Command parameterbinding -Expression {Get-ADUser -Identity Test-User | Test- ...
+                                                                            ~~~~~
    + CategoryInfo          : InvalidData: (CN=Walter Kerce...,DC=contoso,DC=com:PSObject) [Test-Binding], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Test-Binding

DEBUG: ParameterBinding Information: 0 : CALLING EndProcessing
DEBUG: ParameterBinding Information: 0 : CALLING EndProcessing

我的目标是理解为什么这种绑定在这种情况下失败。

编辑:

这不是一个副本,因为我没有使用$null返回。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-07 21:07:49

不幸的是,这是AD中的一个已知问题--如果您要求AD生成的对象具有它没有的属性,它将自动生成一个$null值,而不是正确地返回属性不存在,这将允许参数绑定继续并获得正确的值。

您可以看到有关此这里的Microsoft项。

我看到的唯一解决办法是根据AD对象使用的确切属性名称和别名命名函数中的参数。例如,如果我想让Get通过管道连接到参数DNSHostName,我通常必须用ComputerName的别名命名参数。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31278611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档