加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

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

发布时间:2020-12-14 00:21:35 所属栏目:Windows 来源:网络整理
导读:让我先说我在编写脚本或排除故障方面一点也不擅长,因此我在这里:) 我正在尝试找到使用静态IP地址的Windows域网络中的所有计算机,我在网上进行了一项小型研究,发现this PowerShell script如下: param ( [string]$LDAPFilter = '(name=*)',[switch]$Verbose )
让我先说我在编写脚本或排除故障方面一点也不擅长,因此我在这里:)

我正在尝试找到使用静态IP地址的Windows域网络中的所有计算机,我在网上进行了一项小型研究,发现this PowerShell script如下:

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}") 
                    { 
                        $ip = $addr 
                        $gw = $null 
                        foreach ($gw_addr in $int.DefaultIPGateway) 
                        { 
                            if ($gw_addr -match "[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

我试图在我的Active Directory服务器上运行它,问题是,脚本在运行时出错,如下所示:

Missing expression after unary operator '-'.
At C:UsersAdministrator.MyDomainDesktopComputersWithStaticIP.ps1:24 char:8
+       - <<<< Query "select IPAddress,DefaultIPGateway from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE an
d DHCPEnabled=FALSE";
    + CategoryInfo          : ParserError: (-:String) [],ParseException
    + FullyQualifiedErrorId : MissingExpressionAfterOperator

我试图从脚本中删除“ – ”,然后得到此错误:

ForEach-Object : Cannot bind parameter 'Process'. Cannot convert the " " value
of type "System.String" to type "System.Management.Automation.ScriptBlock".
At C:UsersAdministrator.MyDomainDesktopComputersWithStaticIP.ps1:18 char:2
+ % <<<<  `
    + CategoryInfo          : InvalidArgument: (:) [ForEach-Object],Parameter
   BindingException
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerSh
   ell.Commands.ForEachObjectCommand

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

谢谢,

What am I doing wrong?

反引号`是行继续符,你得到的’一元运算符后缺少表达式’的第一个错误似乎是PowerShell没有看到-Query行作为前一行的一部分.

可能你错过了脚本副本中前一行末尾的`,或者通过一些复制/粘贴/字体/编辑器代码修改等问题将其替换为撇号.

or what should I add/remove from the script to make it run?

删除它的大部分,它是令人费解的,丑陋的,多余的,你想要的.

为什么要查询Win32_NetworkAdapterConfiguration事件并将它们称为int?这太误导了.

为什么要使用IPAddress,将其称为addr,然后将其称为ip,然后将其称为IP?

为什么它采用GatewayAddress,称之为gw_addr,然后是gw,然后是Gateway?

对-eq $null的测试似乎是不必要的,如果你尝试在空序列上使用foreach它将按预期工作(跳过它).

使用正则表达式来获取IPv4地址而不是IPv6地址 – 这很有用,但非常有用. IPv6地址使用:分隔它们,IPv4地址使用.,所以如果你只关心IPv4地址,只需要查找.在地址.

为什么要复制地址,建立结果列表,然后选择列表中的所有内容,何时可以在找到地址时打印地址?

你甚至关心网关地址吗?

为什么在此处处理IP地址的块中测试IP地址是否为空,以便此时它不能为空?

为什么整个事情都是使用get-computers%{code} |的链选择结果,什么时候对你没有帮助?

我把它修了一下并重新命名,得到了以下更清晰,更简单的结构:

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

我没有完全测试过,但是它可以在一台计算机上显示名称和静态IP.

注:它不会向您显示任何它无法联系的计算机名称,但是原来的也不会.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读