Noo*_*ldi 4 windows powershell active-directory domain static-ip
首先让我说我根本不擅长编写脚本或对它们进行故障排除,因此我在这里:)
我试图在 Windows 域网络中找到所有使用静态 IP 地址的计算机,我在网上做了一个小研究,发现了这个 PowerShell 脚本,如下所示:
param (
[string]$LDAPFilter = '(name=*)',
[switch]$Verbose
)
Get-ADComputer -LDAPFilter $LDAPFilter |
% `
{
$name = $_.DNSHostName;
if ($Verbose.IsPresent)
{ Write-Host -ForegroundColor Yellow "Connecting to $name..." }
$ints = Get-WmiObject -ErrorAction SilentlyContinue -ComputerName $name `
-Query "select IPAddress, DefaultIPGateway from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE and DHCPEnabled=FALSE";
if ($ints -ne $null)
{
foreach ($int in $ints)
{
foreach ($addr in $int.IPAddress)
{
$ip = $null
if ($addr -match "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}")
{
$ip = $addr
$gw = $null
foreach ($gw_addr in $int.DefaultIPGateway)
{
if ($gw_addr -match "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}")
{
$gw = $gw_addr
break
}
}
if ($ip -ne $null)
{
$info = New-Object PSObject -Property `
@{
Name = $name
IP = $ip
Gateway = $gw
}
$info
if ($Verbose.IsPresent)
{ Write-Host -ForegroundColor Yellow $info }
}
}
}
}
}
} |
Select-Object Name, IP, Gateway
Run Code Online (Sandbox Code Playgroud)
我试图在我的 Active Directory 服务器上运行它,问题是,脚本在运行时出错,如下所示:
Missing expression after unary operator '-'.
At C:\Users\Administrator.MyDomain\Desktop\ComputersWithStaticIP.ps1:24 char:8
+ - <<<< Query "select IPAddress, DefaultIPGateway from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE an
d DHCPEnabled=FALSE";
+ CategoryInfo : ParserError: (-:String) [], ParseException
+ FullyQualifiedErrorId : MissingExpressionAfterOperator
Run Code Online (Sandbox Code Playgroud)
我追踪了从脚本中删除“-”的方法,然后得到了这个错误:
ForEach-Object : Cannot bind parameter 'Process'. Cannot convert the " " value
of type "System.String" to type "System.Management.Automation.ScriptBlock".
At C:\Users\Administrator.MyDomain\Desktop\ComputersWithStaticIP.ps1:18 char:2
+ % <<<< `
+ CategoryInfo : InvalidArgument: (:) [ForEach-Object], Parameter
BindingException
+ FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerSh
ell.Commands.ForEachObjectCommand
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?或者我应该从脚本中添加/删除什么以使其运行?
谢谢,
我究竟做错了什么?
反引号 ` 是行继续符,您得到的第一个错误“一元运算符后缺少表达式”似乎是 PowerShell 没有将 -Query 行视为上一行的一部分。
可能您在脚本副本中缺少上一行末尾的 `,或者通过复制/粘贴/字体/编辑器代码修改等一些怪癖将其替换为撇号。
或者我应该从脚本中添加/删除什么以使其运行?
删除大部分内容,对于您想要的内容来说,它是令人费解的、丑陋的和多余的。
为什么要查询Win32_NetworkAdapterConfiguration事物并调用它们ints?这太误导了。
为什么它需要IPAddress,调用它addr,然后调用它ip,然后调用它IP?
为什么它需要GatewayAddress,调用它gw_addr,然后gw,然后Gateway?
测试-eq $null似乎没有必要,如果您尝试foreach在空序列上使用它,它将按预期工作(跳过它)。
使用正则表达式来获取 IPv4 地址而不是 IPv6 地址 - 很有用,但很笨拙。IPv6 地址用于:分隔它们,而 IPv4 地址使用.,因此如果您只关心 IPv4 地址,只需.在地址中查找。
为什么要复制地址,建立一个结果列表,然后从列表中选择所有内容,当您找到地址时就可以打印地址?
你甚至关心网关地址吗?
为什么在此时正在处理 IP 地址的块中测试 IP 地址是否为空,因此此时它不能为空?
为什么整个链条都在使用get-computers % { code } | select results,而这对您没有帮助?
我稍微修剪了一下并重命名了一些东西,并得到了以下更清晰、更简单的结构:
.显示计算机名称和此 IPv4 地址。
param (
[string]$LDAPFilter = '(name=*)'
)
$wmiQuery = "select IPAddress, DefaultIPGateway from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE and DHCPEnabled=FALSE"
$computers = (Get-ADComputer -LDAPFilter $LDAPFilter)
foreach ($computer in $computers) {
$networkAdapters = (Get-WmiObject -ErrorAction SilentlyContinue -ComputerName $computer.DNSHostName -Query $wmiQuery)
foreach ($networkAdapter in $networkAdapters) {
foreach ($ip in $networkAdapter.IPAddress)
{
if ($ip -match "\.")
{
Write-Host $($computer.DNSHostName), $ip }
}
}
}
Run Code Online (Sandbox Code Playgroud)我还没有完全测试过这个,但它可以在一台计算机上运行,只显示名称和静态 IP。
注意,它不会向您显示它无法联系的任何计算机名称,但原始计算机也不会。
| 归档时间: |
|
| 查看次数: |
11993 次 |
| 最近记录: |