首页 > 解决方案 > Powershell - 在 for 循环中使用调用命令

问题描述

当我尝试为 Active-Directory 中的每台计算机运行调用命令时,我将遇到以下错误:“调用命令:一个或多个计算机名称无效。如果您尝试传递 URI,请使用 -ConnectionUri参数,或传递 URI 对象而不是字符串。"

    ```
      $Hosts_Array=Get-ADComputer -Properties CN -Filter * | Sort-Object  | Select-Object CN
          foreach ($i in $Hosts_Array) {
                Invoke-Command -ComputerName $i -ScriptBlock { Get-Service -Name "sysmon64"} 
           }
    ```

我使用 For 循环为从 AD 获取的每台计算机运行命令。

标签: powershellinvoke-command

解决方案


正如所评论的,Select-Object返回objects,在这种情况下,对象只有一个名为“CN”的属性。

实际上,您根本不需要询问 CN,因为Get-ADComputer默认返回这些属性: DistinguishedName, DNSHostName, Enabled, Name, ObjectClass, ObjectGUID, SamAccountName, SID, UserPrincipalName

您可以通过执行以下操作来简化代码:

$Hosts_Array = (Get-ADComputer -Filter *).Name | Sort-Object
foreach ($computer in $Hosts_Array) {
    Invoke-Command -ComputerName $computer -ScriptBlock { Get-Service -Name "sysmon64" } 
}

(Get-ADComputer -Filter *).Name返回仅包含计算机名称的字符串数组,也可以使用Get-ADComputer -Filter * | Select-Object -ExpandProperty Name

PS我已将变量名称更改为使用from $i(通常在编号循环中使用)进行迭代$computer以使其更清晰

AD 中的每个对象都有一个Relative Distinguished Name(RDN)。这是对象在其父 OU/Container 中的名称。对于用户、组、计算机和容器对象,RDN 是cn属性(通用名称)的值。对于 OU 对象,RDN 是ou属性的值。对于域组件对象,它是dc属性。
Name属性返回任何对象的 RDN。


推荐阅读