AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 544116
Accepted
Noor Khaldi
Noor Khaldi
Asked: 2013-10-07 03:13:09 +0800 CST2013-10-07 03:13:09 +0800 CST 2013-10-07 03:13:09 +0800 CST

在域中查找具有静态 IP 的计算机 - PowerShell

  • 772

首先让我说我在编写脚本或对其进行故障排除方面一点也不擅长,因此我在这里:)

我正在尝试查找 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

我试图在我的 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

我追踪了从脚本中删除“-”的方法,然后得到了这个错误:

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

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

谢谢,

windows
  • 2 2 个回答
  • 13092 Views

2 个回答

  • Voted
  1. Best Answer
    TessellatingHeckler
    2013-10-07T09:15:06+08:002013-10-07T09:15:06+08:00

    我究竟做错了什么?

    反引号 ` 是行继续符,您得到“一元运算符后缺少表达式”的第一个错误似乎是 PowerShell 没有将 -Query 行视为前一行的一部分。

    可能您在脚本副本中的上一行末尾缺少 `,或者通过某些复制/粘贴/字体/编辑器代码修改或其他东西的怪癖将其替换为撇号。

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

    删除其中的大部分,对于您想要的东西来说,它是令人费解的、丑陋的和多余的。

    为什么要查询Win32_NetworkAdapterConfiguration事物并调用它们ints?这太误导人了。

    为什么它接受IPAddress,调用它addr,然后调用它ip,然后调用它IP?

    它为什么要接GatewayAddress,叫它gw_addr,然后gw,然后Gateway呢?

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

    使用正则表达式来获取 IPv4 地址而不是 IPv6 地址 - 很有用,但很笨拙。IPv6 地址用于:分隔它们,而 IPv4 地址使用.,因此如果您只关心 IPv4 地址,只需.在地址中查找 a 。

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

    你甚至关心网关地址吗?

    当您处于此时正在处理 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 } 
                  }
          } 
      }
      

    我尚未对此进行完全测试,但它适用于一台计算机,仅显示名称和静态 IP。

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

    • 7
  2. JDMils
    2013-11-21T13:55:27+08:002013-11-21T13:55:27+08:00

    您需要注意网页如何切割您的代码。这是我的修改版本,由 OU 使用,以防您不希望每台计算机都经过测试,并且在运行时有更多信息。

    ############################################################################ 
    ## 
    ##  Script, that returns list of computers with first statically configured 
    ##  IP Address and Default Gateway. 
    ##  Requires Active Directory Module 
    ## 
    ##  Version: 1.0 
    ##  Author: [email protected] 
    ##  Date: 07#23#2012 
    ## 
    ############################################################################ 
    
    # %Debug Arguments%='"Value1" "-Verbose"'
    
    param ( [string]$LDAPFilter = '(name=*)', [switch]$Verbose ) 
    
    import-module ActiveDirectory
    
    # $LDAPFilter = '(name=*)'
    # $Verbose = $True
    
    if ($Verbose.IsPresent) 
        {
        $VerboseModeString = "enabled."
        $VerboseModeVar = $True
        }
    Else
        {
        $VerboseModeString = "not enabled."
        $VerboseModeVar = $False
        }
    
    # $VerboseModeVar = $True
    
    Write-Host "Verbose mode is $VerboseModeString" -ForegroundColor Magenta
    
    
    # LDAP Paths:
    $Singapore_OU =     "OU=Singapore,OU=APAC,OU=TopOU,DC=MyDomain,DC=com"
    $BC_OU =        "OU=BC,OU=Australia,OU=APAC,OU=TopOU,DC=MyDomain,DC=com"
    $MAL_OF_OU =        "OU=KL Office,OU=Malaysia,OU=APAC,OU=TopOU,DC=MyDomain,DC=com"
    $HK_OU =    "OU=HK Warehouse,OU=Hong Kong,OU=APAC,OU=TopOU,DC=MyDomain,DC=com"
    
    Get-ADComputer -SearchBase $HK_OU -LDAPFilter $LDAPFilter | % `
    {  
        $name = $_.DNSHostName; 
    
        if ($VerboseModeVar) 
          { 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 } 
                            } 
                        } 
                    } 
                } 
            }
        else
            {
            if ($Verbose.IsPresent) 
                {
                Write-Host "--> Could not contact the computer $Name" -ForegroundColor Red
                }
            }
    
    } | 
    Select-Object Name, IP, Gateway
    

    我在我的项目中使用它来重建 AD 域控制器,以便找到需要更改 DNS 的静态 IP,并且它可以 100% 工作!

    • 0

相关问题

  • 知道任何适用于 Windows 的快速可编写脚本的 ftp 客户端吗?[关闭]

  • 如果 Windows 服务崩溃,如何自动重新启动它?

  • 无法安排任务(访问被拒绝)

  • 物理机重启时自动重启虚拟机(VMWare)

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve