質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.12%

Windows7環境におけるNetworkCategoryの取得方法

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,546

Kei-

score 28

現在リンクアップしているインターフェースに適用されている
WindowsFirewallのポリシーを取得したいと考えています。

「ワイヤレス ネットワーク 1」に適用されているポリシーを調べるには
そのインターフェースがリンクアップしているネットワークの場所(ネットワーク カテゴリ)
ドメインかプライベートかパブリックかを知る必要があるのですが
コマンドライン等でこれを取得する方法がわかりません。

現在はvbsにて開発していますが、特にこだわってはいません。


行ったこと:

PowerShell3.0が導入されている環境(Windows8など)においては
Get-NetConnectionProfileにより確認が可能ですが
Windows7 の基本構成ではこのコマンドが使用できません。

Win32_NetworkConguration等その手のものでは
インターフェースに設定されている値を参照できるものの
今現在適用されている状況などについての値は乏しく
プロファイルやネットワークカテゴリを含む値を持った項目がありませんでした。

レジストリのインタフェース設定周り(HKLM\System\Service\TCPIP)と
ネットワークプロファイル(HKLM\Software\WindowsNT\NetworkList)の設定も確認したのですが

それぞれ設定情報自体はあるものの
現在そのインターフェースに対してアクティブになっているネットワークプロファイル
を知ることができず紐づけすることができませんでした。

ncpa.cplで開けばGUI上は、そのインタフェースがどのNerworkCategoryに属するか一目でわかります。
しかしこれをコマンドラインで取得しようとすると方法が浮かびません。

何か良い手法ご存じないでしょうか。
妙案ございましたらご教示頂ければ幸いです。何卒お願い申し上げます。


=== 9/20 1:30 追記 ===
最終的にネットワークアダプタとネットワークカテゴリの紐づけは完全にはできませんでした。
しかし、アダプタのGUIDまでは紐づけができ、IPアドレスの取得は実現できました。
WindowsFirewall周りで使うにはIPアドレスがわかれば十分なので、以下のやり方でいこうと思います。

(PowerShellで書き上げるスキルがなく突如C#になりました)
// 現在有効なリンクアップ対象を取得
NetworkListManager networkListMgr = new NetworkListManager();
IEnumNetworkConnections netWorks = networkListMgr.GetNetworkConnections();

// リンクアップ1接続ごとに回す
foreach (INetworkConnection network in netWorks)
{
    // ① 対象アダプターのGUIDを表示
    Console.WriteLine(network.GetAdapterId());
    // 使用しているネットワークプロファイルを取得
    INetwork Connection = network.GetNetwork();
    // ② 使用しているプロファイル名を表示
    Console.WriteLine(Connection.GetName());
    // ③ 適用されているネットワークカテゴリを表示
    Console.WriteLine(Connection.GetCategory().ToString());
    // アダプターのGUIDを元にレジストリからIPアドレスを取得する
    Microsoft.Win32.RegistryKey regkey =  Microsoft.Win32.Registry.LocalMachine.OpenSubKey(
            @"SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{" + network.GetAdapterId() +"}", false );
    if (regkey != null)
    {
        String IPAddress = (String)regkey.GetValue("IPAddress");
        if (IPAddress == null) IPAddress = (String)regkey.GetValue("DHCPIPAddress");
        // ④ IPアドレスを出力する 
        if (IPAddress != null) Console.WriteLine(IPAddress);
    }
}
25d921e3-f2ef-2ae1-3f9f-1234430ac421
HogeHogeWifi
NLM_NETWORK_CATEGORY_PUBLIC
192.168.1.1
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

以下の方法は使えないでしょうか?
c# - WMI for quering active networks and associate connections - Stack Overflow

試してはいないのですが、
INetworkListManaerはWindows Vista以降のようなので、Windows7でも使えるのでは無いでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/09/20 01:15

    ご回答ありがとうございます。
    おっしゃる通りINetworkListManagerで実現ができそうです。
    リンク先のサンプルは
    spr-2さんに補足頂いたように多少手入れが必要でしたが
    これがまさに求めていたものです。ご教示ありがとうございます。

    キャンセル

0

こんばんは。

vbsでなく、PowerShellになるのですがWindows 7環境で確認をしましたので投稿をさせて頂きます。
方法については、eripongさんから頂いているリンク先の内容と同じです。
# そのままだと うまくいかなかった等があり、少し変えています。

# NLM_ENUM_NETWORK ennumeration
$NLM_NETWORK_CONNECTED = 0x01
$NLM_NETWORK_DISCONNECTED = 0x02
$NLM_NETWORK_ALL = 0x03

# NLM_NETWORK_CATEGORY enumeration
$NLM_NETWORK_CATEGORY_PUBLIC = 0x00
$NLM_NETWORK_CATEGORY_PRIVATE = 0x01
$NLM_NETWORK_CATEGORY_DOMAIN_AUTHENTICATED = 0x02


$networkType = [Type]::GetTypeFromCLSID('DCB00C01-570F-4A9B-8D69-199FDBA5723B')
$networkListMgr = [Activator]::CreateInstance($networkType)

# リンクアップを対象
$networkListMgr.GetNetworks($NLM_NETWORK_CONNECTED) | %{
    $name = $_.GetName()
    $description = $_.GetDescription()

    Write-Output "Name        : $name"
    Write-Output "Description : $description"

    switch ($_.GetCategory())
    {
        $NLM_NETWORK_CATEGORY_PUBLIC { Write-Output "Category    : PUBLIC`n" }
        $NLM_NETWORK_CATEGORY_PRIVATE { Write-Output "Category    : PRIVATE`n" }
        $NLM_NETWORK_CATEGORY_DOMAIN_AUTHENTICATED { Write-Output "Category    : DOMAIN`n" }
        default { Write-Output "" }
    }
}

少し使いにくいかも知れないのは、接続名?(ネットワークと共有センターで表示される名称)で列挙するため、アダプターの名称ではない事です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/09/20 01:25

    サンプルソースとデバッグまでして頂きありがとうございます。
    INetworkクラスでないとNetworkCateory含まれないので修正が必要ということですね。
    たぶん自力では気付けなかったので大変助かりました。

    しかし、おっしゃる通り接続名がわからないため当初の
    どのインターフェースがどのNetworkCategoryかを特定するには至りませんでした。
    最終的にはサンプルソースをベースにNetworkConnectionからINetworkを取得するようにしました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる