web-dev-qa-db-ja.com

静的IPを使用してドメイン内のコンピューターを検索する-PowerShell

まず、スクリプトの記述やトラブルシューティングが苦手なので、ここにいます:)

静的IPアドレスを使用しているWindowsドメインネットワーク内のすべてのコンピューターを検索しようとしています。オンラインで簡単な調査を行ったところ、次のことがわかりました この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

何が悪いのですか?または、スクリプトを実行するためにスクリプトから何を追加/削除する必要がありますか?

おかげで、

4
Noor Khaldi

何が悪いのですか?

バックティック `は行継続文字であり、「単項演算子の後に式がない」という最初のエラーは、PowerShellが-Query行を前の行の一部として認識していないように見えます。

おそらく、スクリプトのコピーの前の行の最後にある `が欠落しているか、コピー/貼り付け/フォント/エディターコードの奇妙なコードなどによってアポストロフィに置き換えられている可能性があります。

または、スクリプトを実行するためにスクリプトから何を追加/削除する必要がありますか?

それの大部分を削除してください、それはあなたが望むもののために複雑で醜く冗長です。

なぜWin32_NetworkAdapterConfigurationについてクエリを実行し、それらをintsと呼ぶのですか?これはso誤解を招く表現です。

なぜIPAddressaddr、_ipIPのようになっているのですか?

なぜGatewayAddressgw_addr、次にgw、次にGatewayと呼ぶのですか?

-eq $nullのテストは必要ないようです。空のシーケンスでforeachを使用しようとすると、期待どおりに機能します(スキップしてください)。

正規表現を使用して、IPv6アドレスの代わりにIPv4アドレスを取得する-便利ですが、ひどいです。 IPv6アドレスはそれらを区切るために:を使用し、IPv4アドレスは.を使用するため、IPv4アドレスのみが必要な場合は、アドレスで.を探してください。

住所をコピーして、結果のリストを作成し、リストからすべてを選択するのはなぜですか?

ゲートウェイアドレスについてさえ気にしていますか?

この時点でIPアドレスを処理しているブロック内にいるときに、IPアドレスが空であるかどうかをテストして、この時点でIPアドレスをnullにできないようにしてください。

それが役に立たないのに、なぜ全体が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 } 
                }
        } 
    }
    

私はこれを完全にテストしていませんが、1台のコンピューターに対して機能し、名前と静的IPのみを表示します。

N.B.接続できないコンピューターの名前は表示されませんが、元のコンピューターの名前は表示されません。

7

Webページがコードを分割する方法に注意する必要があります。これは、すべてのコンピューターをテストしたくない場合に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
JDMils