2013-10-07 8 views
7

現在のネットワーク接続の接続プロファイル(存在する場合)をどのように決定または調べますか?現在のネットワーク接続のプロパティを取得します。

具体的には、現在の接続がプライベートネットワークかパブリックネットワークかを判断し、そこからネットワーク探索がオンまたはオフになっているかどうかを判断する必要があります。それは、この情報のように思える

Windows.Networking.Connectivity.NetworkInformation.GetConnectionProfiles()またはNetworkInformation.GetInternetConnectionProfile()機能、を介したWindowsストアアプリで容易に利用可能であるが、これは勝つ7とServer 2008のだけでなく、勝利8およびServer 2012の上で実行する必要があり、標準的なデスクトップアプリケーションです。マシン上

Enumerating the NICsは問題ではありませんが、これは私の問題を解決していない - 私は接続、ない物理デバイスのプロパティを取得する必要があります。

.Netフレームワークでこれを行うための組み込み方法はありますか?また、WMIで行うこともできますか?または、代替手段として、コマンドを呼び出すことでこれを行うことができます(これは実行するサービスがdot3svcおよび/またはwlansvc)。

+0

これはまったく役に立ちますか? http://stackoverflow.com/questions/6578480/unable-to-obtain-profile-of-connected-network-in-vista-7 –

+0

@JunWeiLeeありがとう、それは直接助けません。これは、[ネイティブWifi API](http://msdn.microsoft.com/en-us/library/)をラップする[Managed Wifi API](http://managedwifi.codeplex.com/)を使用するコードスニペットです。 ms705969.aspx)。 – slugster

答えて

10

この目的のために、Network List Manager APIを使用して、C#インポートネットワークリストマネージャタイプライブラリから使用することができます(この例を直接コンパイルして参照プロパティに埋め込みます)。

次に、複数のネットワークが存在する可能性があるため、接続されているすべてのネットワークを列挙する必要があります。たとえば、現在インターネットとVPNに接続しています。接続されたすべてのネットワークでGetCategory() APIを呼び出すと、NLM_NETWORK_CATEGORY(プライベート、パブリックまたはドメイン)が返されます。

var manager = new NetworkListManagerClass(); 
    var connectedNetworks = manager.GetNetworks(NLM_ENUM_NETWORK.NLM_ENUM_NETWORK_CONNECTED).Cast<INetwork>(); 
    foreach (var network in connectedNetworks) 
    { 
    Console.Write(network.GetName() + " "); 
    var cat = network.GetCategory(); 
    if (cat == NLM_NETWORK_CATEGORY.NLM_NETWORK_CATEGORY_PRIVATE) 
     Console.WriteLine("[PRIVATE]"); 
    else if (cat == NLM_NETWORK_CATEGORY.NLM_NETWORK_CATEGORY_PUBLIC) 
     Console.WriteLine("[PUBLIC]"); 
    else if (cat == NLM_NETWORK_CATEGORY.NLM_NETWORK_CATEGORY_DOMAIN_AUTHENTICATED) 
     Console.WriteLine("[DOMAIN]"); 
    }  
    Console.ReadKey(); 

ネットワーク探索のためにあなたがして、ファイアウォールAPIリファレンスCOMライブラリNetFwTypeLibを使用して、アクティブなプロファイルのINetFwProfileを取得する必要がサービスにおけるファイル共有、ネットワーク探索とリモートがあります。ここでは

は、サンプルコードですデスクトップサービスであり、これらが有効の場合はboolフラグがあります。 (ちょうどあなたを警告するために、私はちょうどこのAPIを模索した生産のコードの下に使用していませんでした)

Type objectType = Type.GetTypeFromCLSID(new Guid("{304CE942-6E39-40D8-943A-B913C40C9CD4}")); 
    var man = Activator.CreateInstance(objectType) as INetFwMgr; 
    /// get current profile 
    INetFwProfile prof = man.LocalPolicy.CurrentProfile; 
    Console.WriteLine("Current profile "); 
    ShowProfileServices(prof); 

とプロファイルサービスを示し方法:ここではサンプルコードです。

private static void ShowProfileServices(INetFwProfile prof) 
{ 
    var services = prof.Services.Cast<INetFwService>(); 
    var sharing = services.FirstOrDefault(sc => sc.Name == "File and Printer Sharing"); 
    if (sharing != null) 
    Console.WriteLine(sharing.Name + " Enabled : " + sharing.Enabled.ToString()); 
    else 
    Console.WriteLine("No sharing service !"); 

    var discovery = services.FirstOrDefault(sc => sc.Name == "Network Discovery"); 

    if (discovery != null) 
    Console.WriteLine(discovery.Name + " Enabled : " + discovery.Enabled.ToString()); 
    else 
    Console.WriteLine("No network discovery service !"); 

    var remoteDesktop = services.FirstOrDefault(sc => sc.Name == "Remote Desktop"); 
    if (remoteDesktop != null) 
    Console.WriteLine(remoteDesktop.Name + " Enabled : " + remoteDesktop.Enabled.ToString()); 
    else 
    Console.WriteLine("No remote desktop service !"); 
} 
+0

答えをいただきありがとうございます。私の問題の一部が解決されています(「ネットワークディスカバリ」の設定が容易に得られるかどうかはわかりません)。 – slugster

+0

ああ、これを見ていない、私はファイアウォールのAPIと幾分遊んだ道の谷がある、私は私の答えを更新します –

+0

偉大な答え、それは私が必要なすべてでした:) – slugster

関連する問題