我正在尝试使用Read-Host -Prompt填写多个服务器名称和用户帐户名称,然后将它们传递到invoke-command中以完成任务-使某人成为本地管理员。我无法弄清楚为什么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”
服务器正在响应ping(主机名和IP地址)
单独使用Invoke-Command,但不在函数内使用
没有防火墙或安全措施阻止有问题的帐户
谢谢您的帮助。
似乎您期望$prompt1
和$prompt1_1
包含逗号分隔的名称。通过使用Read-Host
填充变量,它们将成为String
类型。您将需要依靠用户来用代码手动输入逗号分隔符。话虽如此,对String对象执行.Split()
方法不会更新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(",") }
}
使用表达式的优点是您的原始变量保持不变。