我的代码抛出此错误:
Invoke-Command:一个或多个计算机名无效。如果您尝试传递URI,请使用-ConnectionUri参数,或传递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}
}
答案 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
那样引用对象的属性。