Ошибка PowerShell: неверное имя компьютера в пользовательской функции - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь использовать Read-Host -Prompt, чтобы заполнить несколько имен серверов и учетных записей пользователей, а затем передать их в команду invoke для выполнения задачи, то есть сделать кого-то локальным администратором. Я не могу понять, почему PowerShell выдает мне такую ​​ошибку: «Одно или несколько имен компьютеров недопустимы. Если вы пытаетесь передать URI, используйте параметр -ConnectionUri или передайте объекты URI вместо строк».

Кроме того, я также получаю сообщение об ошибке:

"Add-LocalGroupMember: ссылка на объект не установлена ​​для экземпляра объекта."

Пример кода ниже:

if ($OptPrompt -eq 1) { 

    $prompt1 = Read-Host -Prompt 'Test Accounts'

    $prompt1.Split(",")

    $prompt1_1 = Read-Host -Prompt 'Test Servers'

    $prompt1_1.Split(",")

    Invoke-Command -ComputerName $prompt1_1 -ScriptBlock {Add-LocalGroupMember -Group 'Administrators' -Member $Using:prompt1} 

}

Дополнительная информация:

Серверы подключены

Серверы имеют "-", например, "Server-22-test"

Серверы отвечают на пинг (имя хоста и IP-адрес)

Использование Invoke-Command само по себе, но не внутри функции

Нет брандмауэра или блокировки безопасности учетные записи в вопросе

Спасибо за вашу помощь.

1 Ответ

3 голосов
/ 14 апреля 2020

Похоже, вы ожидаете, что $prompt1 и $prompt1_1 будут содержать имена, разделенные запятыми. Используя Read-Host для заполнения переменных, они будут иметь тип String. Вам нужно будет полагаться на то, что пользователи вводят запятые с вашим кодом вручную. С учетом сказанного, выполнение метода .Split() для объекта String не обновляет объект String. Вы должны либо обновить присвоение переменной, либо передать выходные данные метода в виде выражений в Invoke-Command.

# Method 1: Reassigning Variable Before Invoke-Command
if ($OptPrompt -eq 1) { 
    $prompt1 = Read-Host -Prompt 'Test Accounts'
    $prompt1 = $prompt1.Split(",")
    $prompt1_1 = Read-Host -Prompt 'Test Servers'
    $prompt1_1 = $prompt1_1.Split(",")
    Invoke-Command -ComputerName $prompt1_1 -ScriptBlock {Add-LocalGroupMember -Group 'Administrators' -Member $Using:prompt1} 
}


# Method 2: Passing Expressions into Invoke-Command
if ($OptPrompt -eq 1) { 
    $prompt1 = Read-Host -Prompt 'Test Accounts'
    $prompt1_1 = Read-Host -Prompt 'Test Servers'
    Invoke-Command -ComputerName $prompt1_1.Split(",") -ScriptBlock {Add-LocalGroupMember -Group 'Administrators' -Member ($using:prompt1).Split(",") } 
}

Преимущество использования выражений состоит в том, что ваши исходные переменные остаются неизменными.

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