Используя Invoke-Command, но получите ошибку «Одно или несколько имен компьютеров недопустимы» - PullRequest
0 голосов
/ 06 ноября 2018

Invoke-Command: недопустимы одно или несколько имен компьютеров

Я получаю сообщение об ошибке при выполнении этой команды:

Invoke-Command -ComputerName $Targets -ScriptBlock $ScriptBlock

$Targets - это массив, который заполняется этой командой:

Get-ADComputer -Filter "Name -like '$Filter'" -SearchBase $OU |
    Select-Object -ExpandProperty Name |
    Sort-Object

Имена компьютеров обычно содержат -, но я проверил компьютеры без каких-либо специальных символов и получил тот же результат.

Вот мой метод:

function Get-FilteredADComputers
{
     [CmdletBinding()]
     [OutputType([System.String[]])]
   param
       (
    [Parameter(Position = 0, Mandatory)]
    [ValidateSet('Site 1', 'Site 2', 'Site 3')]
    [String]
    $Site,

    [Parameter(Position = 1, Mandatory)]
    [ValidateSet('Client', 'Server')]
    [String]
    $ComputerType,
    [Parameter(Position = 2, Mandatory)]
    [String]
    $Filter
    )

$siteSecondLevel
switch($Site){
    "site 1"{$siteSecondLevel = "LVL 1"}
    "site 2"{$siteSecondLevel = "LVL 2"}
    "site 3"{$siteSecondLevel = "LVL 3"}
}
$OU = "OU=$ComputerType,OU=Devices,OU=$siteSecondLevel,OU=$Site,OU=MyOU,DC=mydomain,DC=com"
Get-ADComputer -Filter {Name -like $Filter} -SearchBase $OU | Select-Object -ExpandProperty Name | Sort-Object
}

Как я могу объявить свой список в тестовой среде:

 $temp = Get-FilteredADComputers -Site Site1 -ComputerType Client -Filter 
"myfilter"
$target = @()

foreach($t in $temp){
    if($t -ne $null -or $t -ne ""){
       $target += $t
       }
}

Я также получаю тот же результат, просто объявив мой массив как $Targets = Get-FilteredADComputers

Ответы [ 3 ]

0 голосов
/ 06 ноября 2018

$ Targets - это список, верно? Если нет, то сделайте это: $Targets2 = @($Targets) Это сделает его списком, и, возможно, вам удастся использовать это решение.

Это должно работать, однако я бы сказал, что вместо этого следует использовать Foreach.

foreach ($Target in $Targets)
{
    Invoke-Command -ComputerName $Target -ScriptBlock $ScriptBlock
}

Большую часть времени я делаю это, так как легче устранить неполадки и найти причину ошибки.

0 голосов
/ 07 ноября 2018

Попробуйте:

$temp = Get-FilteredADComputers
$targets = @() 

foreach($t in $temp)
{
    if($t -ne $null -and $temp -ne "")
    {
        $targets += $t
    }
}

В одном из ваших комментариев вы сказали, что делаете следующее:

$temp = Get-FilteredADComputers -Site $site -ComputerType $computerType -Filter $filter 
if($temp -ne $null -or $temp -ne ""){ $targets += $temp }

Но с проверкой $temp -ne $null вы просто проверяете, что она не равна нулю, как только есть одна запись в $temp (даже если она только на 2-й позиции), она больше не равна нулю ..

0 голосов
/ 06 ноября 2018

Первый шаг - посмотреть, что в $ target. Я подозреваю, что у вас может быть пустая строка в конце или другая странность, которую Invoke-Command отклоняет как имя компьютера

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...