使用 Invoke-Command 的 Powershell DHCP 范围选项提取失败

Powershell DHCP scope options extraction failure using Invoke-Command

我正在尝试从服务器列表中提取 dhcp 范围选项信息,该列表是通过在 AD 中查询域中授权的 dhcp 服务器而获得的。我正在使用 powershell 的调用命令将 netsh dhcp server \$servername scope $IP show optionvalue 传递给远程服务器。 $IP 变量没有按照命令希望看到的方式传递。它抛出 The command needs a valid Scope IP Address. 错误。

我首先 运行 netsh dhcp server \$servername show scope 获取作用域 ip 地址,然后从该输出中提取作用域 ip,将其存储在 $IP.

我可以在脚本中手动输入 IP,它 returns 范围选项,但传入变量总是 returns 错误。我已经在 powershell 控制台中测试了命令本身,方法是手动输入 IP 和使用 IP 创建变量(作为字符串)并在命令中使用它,效果也很好。当我将 IP 存储在脚本中时,没有我可以分辨的特殊字符或空格。我trim那些出来了。我还尝试使用 [IPAddress] 将字符串转换为 IP 地址,但无济于事。

这是收集作用域信息然后尝试获取作用域选项的代码:

foreach ($n in $name) {
$n
$showScopes = Invoke-command -computername $n -ScriptBlock {netsh dhcp server \$n show scope}
$formatScopeInfo = $showScopes | ? {$_.Trim() -ne "" -and ($_.Contains("Disabled") -or $_.Contains("Active"))}

foreach ($en in $formatScopeInfo) {
    $scopeIps = $en.Split("-")
    $IP = [IPAddress]$scopeIps[0].Trim()
    $IP.IPAddressToString
    Invoke-Command -ComputerName $n -ScriptBlock {netsh dhcp server \$n scope $IP.IPAddressToString show optionvalue}
}

第一个 foreach 起作用并删除不包含范围信息的行。第二个 foreach 部分起作用,它确实去除了 IP。最初我只是将它存储为一个字符串,$IP = $scopeIps[0].Trim() 但那是行不通的。我尝试了很多东西。我尝试将八位字节转换为整数并用“.”连接它们,我尝试将整个命令存储为字符串并将其传递给 Invoke-Command。像这样:

$command = "netsh dhcp server \$n scope $IP show optionvalue"
Invoke-Command -ComputerName $n -ScriptBlock {$command}

最终目标是能够提取任何已配置的范围选项,无论它们是在何处配置的(服务器、保留...等)。我担心我已经到了过度关注我认为的问题所在的地步,以至于我可能在其他地方遗漏了一些简单的 and/or 重要的东西。我的意见是该命令想要查看一个实际的 IP 地址,但我尝试以这种方式传递变量的尝试失败了(当保存为字符串时它在 powershell 控制台中工作)。

坦白说,我还是个新手,我不愿意 post 我的代码。我在这里看到很多人对事物的解决方案非常优雅,相比之下,我的东西看起来非常笨重。我以前从来没有 post 因为大多数时候我可以 find/figure 找出我出错的地方。但我努力学习,这个周末的大部分时间我都在谷歌上搜索,但没有结果。我已经看到了适用于 2012 年之前服务器的脚本,但我真的很喜欢自己编写脚本。我不想找任何人 "do it for me",如果你能给我指点合适的兔子洞的话;我很乐意冒险。对代码本身的任何建议(外观、更好的做某事的方法等)也将受到赞赏。

抱歉冗长。我被卡住了,感谢任何帮助。

在你的调用命令中你没有传递参数,它应该是这样的:

$showScopes = Invoke-command -computername $n -ScriptBlock {
param($n)
netsh dhcp server \$n show scope
} -argumentlist $n 

 Invoke-Command -ComputerName $n -ScriptBlock {
 param($n,$IP)
 netsh dhcp server \$n scope $IP.IPAddressToString show optionvalue
 } -argumentlist $n,$IP