Invoke-Command出错:'一个或多个计算机名称无效'

时间:2017-05-03 15:16:41

标签: powershell

我的代码抛出此错误:

  

Invoke-Command:一个或多个计算机名无效。如果您尝试传递URI,请使用-Co​​nnectionUri参数,或传递URI对象而不是字符串。

它的每个部分似乎都有效,但我没有得到任何可见的输出。

阵列已填充,已经过测试。如果我删除$comp中的变量Invoke-Command并明确命名机器,则会输出,并且它是正确的。也许这是由于一些客户离线了?

$compArray = @()

$compArray = Get-ADComputer -Filter * -SearchBase "OU=xxx,OU=xxx,OU=xxx,OU=xxx,OU=xxx,DC=xxx,DC=xx,DC=xx" `
    | Select-Object Name |Sort-Object Name

ForEach ($comp in $comparray) {
    Invoke-Command -ComputerName $comp {
        Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*  `
        | Where {($_.InstallSource -like "C:\Users*")} `
            | Select-Object DisplayName, DisplayVersion, InstallSource `
               | Sort-Object InstallSource |Format-Table –AutoSize}
            }

1 个答案:

答案 0 :(得分:3)

目前,您的$compArray包含一个计算机列表,您可以使用Select-Object Name选择其名称属性。这将创建一个如下所示的数组:

Name
----
Computer01
Computer02

然后在foreach循环中,您正在使用$comp

ForEach ($comp in $comparray) {
    Invoke-Command -ComputerName $comp

每个$comp条目实际上是Microsoft.ActiveDirectory.Management.ADComputer对象(这是Get-ADComputer返回的对象),其中包含您选择的Name属性。

Invoke-Command无法将ADComputer对象作为ComputerName的输入,这就是您收到错误的原因。要更正此问题,您需要通过使用属性名称更新此命令来仅引用此对象的Name属性:

Invoke-Command -ComputerName $comp.Name

另一种选择是使用Name扩展Select-Object属性:

Select-Object -ExpandProperty Name

这将获取传入的对象,枚举其值并将每个值作为单个记录输出,在您的代码中更改:

Name
----
Computer01
Computer02

成:

Computer01
Computer02

由于Name属性$comp不再包含计算机名称,因此您无需像$comp.Name那样引用对象的属性。