使用静态 IP 查找域中的计算机 - PowerShell

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)

我究竟做错了什么?或者我应该从脚本中添加/删除什么以使其运行?

谢谢,

Tes*_*ler 7

我究竟做错了什么?

反引号 ` 是行继续符,您得到的第一个错误“一元运算符后缺少表达式”似乎是 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,而这对您没有帮助?

我稍微修剪了一下并重命名了一些东西,并得到了以下更清晰、更简单的结构:

  1. 设置。
  2. 拿到电脑
  3. 对于每台计算机,获取具有静态地址的网络接口。
  4. 对于每个接口,获取 IP 地址。
  5. 对于每个 IP 地址,通过查找来识别 IPv4 地址 .
  6. 显示计算机名称和此 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。

注意,它不会向您显示它无法联系的任何计算机名称,但原始计算机也不会。