none
Windows7のみ、グループ ポリシーのスタートアップ スクリプトで、自身のIPアドレスを取得できない

    質問

  • ドメインのログオンスクリプトでPowerShellを実行しています。

    実行側のOS情報やコンピューター名、IPアドレスを取得し、SQLServerへデータを反映させています。

    約150台のPCを対象にテストしておりますが、スクリプトは正常に処理され目的は達しております。

    しかし、OSがWindows7の場合に、IPアドレスが取得できていません。

    #Windows7では取得できない。Win8.1, Win10はOK
    $ipaddr = [Net.Dns]::GetHostAddresses('').IPAddressToString[1]
    
    #OSに関係なくIPアドレスを取得できるが、正しくないIPアドレスを取得するクライアントがある
    $ipaddr = $(ipconfig | where {$_ -match 'IPv4.+\s(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' } | out-null; $Matches[1])

    グループポリシーは正常に反映され、IPアドレス以外の情報は取得できています。

    どのようなことが原因と考えられますでしょうか。


    • 編集済み TwSoft 2017年3月15日 5:23
    2017年3月15日 5:22

回答

  • 参考までに、得られない場合は何が返されるのでしょうか?

    また、[System.Net.Dns]::GetHostAddresses()はメソッド名でも表されているとおり複数形であり、結果は配列として取得されます。配列内のすべての値を確認されていますでしょうか?

    2017年3月15日 6:26
  • 佐祐理さんがご指摘の通り、[Net.Dns]::GetHostAddresses('')は配列を返すため、PowerShell2.0環境のWin7では、配列要素のIPAddressToStringプロパティを参照する必要があります。

    たとえば、

    $ipaddr = ([Net.Dns]::GetHostAddresses('') | ForEach-Object {$_.IPAddressToString})[1]

    とすればOKです。

    なお、Win8(PowerShell3.0以降)の環境では、配列に対し「.」演算子を適用すると、暗黙的にforeachが実行され、配列要素に対してプロパティ/メソッドを呼び出すことができます。今回、Win7でうまくいかず、Win8.1/10では問題なく実行できた理由です。

    (余談ですが、[1]と決め打ちしてしまうと、NICが複数あったり、仮想ネットワークなどがあった場合に、想定と異なるIPアドレスを取得してしまう可能性があるので、適宜フィルタをかけることをお勧めします。とはいえちょっと面倒ですが…)

    2017年3月15日 11:11
    モデレータ

すべての返信

  • 参考までに、得られない場合は何が返されるのでしょうか?

    また、[System.Net.Dns]::GetHostAddresses()はメソッド名でも表されているとおり複数形であり、結果は配列として取得されます。配列内のすべての値を確認されていますでしょうか?

    2017年3月15日 6:26
  • GetHostAddresses() の戻り値については、該当PC(Windows7)が側にないためすぐには確認することができません。

    確認できるタイミングあれば、戻り値を確認してみます。

    $ipaddr = (Test-Connection -ComputerName (hostname) -Count 1).IPV4Address.IPAddressToString

    現在は

    上記に書き換え、ログインスクリプトの結果待ちとしております。

    2017年3月15日 6:35
  • 佐祐理さんがご指摘の通り、[Net.Dns]::GetHostAddresses('')は配列を返すため、PowerShell2.0環境のWin7では、配列要素のIPAddressToStringプロパティを参照する必要があります。

    たとえば、

    $ipaddr = ([Net.Dns]::GetHostAddresses('') | ForEach-Object {$_.IPAddressToString})[1]

    とすればOKです。

    なお、Win8(PowerShell3.0以降)の環境では、配列に対し「.」演算子を適用すると、暗黙的にforeachが実行され、配列要素に対してプロパティ/メソッドを呼び出すことができます。今回、Win7でうまくいかず、Win8.1/10では問題なく実行できた理由です。

    (余談ですが、[1]と決め打ちしてしまうと、NICが複数あったり、仮想ネットワークなどがあった場合に、想定と異なるIPアドレスを取得してしまう可能性があるので、適宜フィルタをかけることをお勧めします。とはいえちょっと面倒ですが…)

    2017年3月15日 11:11
    モデレータ