【问题标题】:The input object cannot be bound to any parameters error?输入对象不能绑定任何参数错误?
【发布时间】:2017-10-10 17:53:24
【问题描述】:

我有一个脚本,当我在域控制器上本地运行时,它可以正常工作(在本地使用 Import-Module ActiveDirectory 而不是远程 PSSession)。但是,当我远程运行它时,它会失败并出现以下错误:

输入对象不能绑定到命令的任何参数,因为 该命令不接受管道输入或输入及其属性不接受 匹配任何接受管道输入的参数。 + CategoryInfo : InvalidArgument: (CN=Test User ...,DC=domain,DC=com:PSObject) [Get-ADUser], ParameterBindingException + FullyQualifiedErrorId : InputObjectNotBound,Microsoft.ActiveDirectory.Management.Commands.GetADUser + PSComputerName : van-dc03.vand1.oppy.com

我运行的代码是:

$ADSession = New-PSsession -ComputerName ourdcserver -Credential $(Get-Credential)
Invoke-Command -Command {
    Import-Module ActiveDirectory,AdSync -Cmdlet Get-ADUser, Search-ADAccount
} -Session $ADSession
Import-PSSession -Session $ADSession -AllowClobber -Module ActiveDirectory

Search-ADAccount -UsersOnly -AccountInactive -SearchBase "OU=test,DC=our,DC=domain,DC=com" -Timespan 30.00:00:00 |
    Where-Object { $_.Enabled -eq $true } |
    Get-ADUser -Properties Name, sAMAccountName, WhenCreated, lastLogonTimestamp |
    Select Name, sAMAccountName, WhenCreated,
        @{n="LastLogonTimeStamp";e={[DateTime]::FromFileTime($_.LastLogonTimestamp)}} |
    Sort-Object LastLogonTimeStamp |
    Export-CSV $CurrentWorkfile -NoTypeInformation -Encoding ASCII

我发现了一个类似的线程 on this Technet forums thread 但是我对 PowerShell 不是很熟悉。谁能帮我重写这段代码(或示例)以使管道正常工作?

【问题讨论】:

  • 尝试使用反引号 ` 分隔所有新行条目,然后从下一行开始执行命令。我认为如果您将 Search-ADAccount 查询保留在编辑器中的一行中,它会起作用!
  • 此示例中的换行符很好。不需要反引号。

标签: windows powershell active-directory


【解决方案1】:

您在脚本中使用的implicit remoting 是一件棘手的事情。您从远程会话中使用 ActiveDirectory 模块导入的 cmdlet 感觉好像它们是本地的,但实际上它们不是。它们远程运行,当它们从远程会话发送到本地会话时,它们返回的对象将经历序列化和反序列化的过程。

这意味着您从隐式远程Search-ADAccount 接收的对象与您在本地运行命令时获得的对象略有不同。将本地命令及其隐式远程版本通过管道传输到Get-Member 并比较结果,您会明白我的意思。举个例子,您会发现属性 PSComputer 带有从远程会话返回的任何对象(即使是隐式的)。

您收到的错误是,Get-ADUser 无法处理来自管道的输入对象,因为它无法确定应该绑定到哪个参数。可能的原因是,在会话之间来回发送后,对象无法转换为 Get-ADUser 可以理解的任何内容。

现在您可以做的是避免隐式远程处理。将您的 ActiveDirectory cmdlet 放入脚本块中,并仅返回您需要在本地处理的内容。

$ADSession = New-PSsession -ComputerName ourdcserver -Credential $(Get-Credential)
$scriptBlock = {
    param( $SearchBase )
    Search-ADAccount -UsersOnly -AccountInactive -SearchBase $SearchBase -Timespan 30.00:00:00 |
        Where-Object { $_.Enabled -eq $true } |
        Get-ADUser -Properties Name, sAMAccountName, WhenCreated, lastLogonTimestamp |
        Select Name, sAMAccountName, WhenCreated,
            @{n="LastLogonTimeStamp";e={[DateTime]::FromFileTime($_.LastLogonTimestamp)}} |
        Sort-Object LastLogonTimeStamp
}

Invoke-Command -Session $ADSession -ScriptBlock $scriptBlock -ArgumentList "OU=test,DC=our,DC=domain,DC=com"  |
    Select-Object Name,sAMAccountName,WhenCreated,LastLogonTimeStamp | 
    Export-CSV $CurrentWorkfile -NoTypeInformation -Encoding ASCII

【讨论】:

    猜你喜欢
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    相关资源
    最近更新 更多