我试图从服务器列表中提取dhcp范围选项信息,该列表是通过查询域中授权的dhcp服务器的AD获得的。我使用powershell的invoke-command将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输入到脚本中并返回范围选项,但传入变量始终会返回错误。我已经在powershell控制台中测试了命令本身,既可以通过手动输入IP,也可以使用IP(作为字符串)创建变量并在命令中使用它,这也可以。我可以告诉没有特殊字符,或者在脚本中存储IP时会出现空格。我把它们修剪掉了。我也尝试使用[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}
最终目标是能够提取任何已配置的范围选项,无论它们在何处配置(服务器,预留等)。我担心我已经到了那个地方,我非常专注于我认为的问题,我可能会在其他地方遗漏一些简单和/或至关重要的东西。我的意见是该命令想要查看实际的IP地址,但我尝试以这种方式传递变量失败(当它保存为字符串时,它在powershell控制台中工作)。
公平披露,我仍然是一个新手,我不愿意发布我的代码。我在这里看到了很多关于事物的非常优雅的解决方案,相比之下,我的东西看起来非常笨重。我以前从未发过帖子,因为大多数时候我都能找到/弄清楚我哪里出错了。但是我努力学习,并且我花了很多时间在这个周末谷歌搜索没有结果。我看过那个适用于2012年前服务器的脚本,但我真的很喜欢自己编写。如果你能把我指向适当的兔子洞,我不希望有任何人为我做这件事。我很高兴冒险尝试。关于代码本身的任何建议(外观,更好的做事方式......等)也是值得赞赏的。
道歉的冗长。我感到困惑并感激任何帮助。
答案 0 :(得分:0)
在你的invoke-command中你没有传递参数,它应该是这样的:
$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