2013-10-07 40 views
7

如何確定或檢查當前網絡連接(如果有)的連接配置文件?獲取當前網絡連接的屬性

具體而言,我需要確定當前連接是否是專用或公用網絡,並從那裏確定網絡發現是打開還是關閉。

這樣看來,信息是通過Windows.Networking.Connectivity.NetworkInformation.GetConnectionProfiles()NetworkInformation.GetInternetConnectionProfile()功能,一個Windows商店應用一應俱全,但是,這是一個標準的桌面應用程序必須在Win 7和Server 2008,以及運8和Server 2012中運行。

Enumerating the NICs的機器上是沒有問題的,但是這並沒有解決我的問題 - 我需要得到連接,而不是物理設備的屬性。

有沒有一種內置的方式來與.Net框架做到這一點?或者可以用WMI來完成?或者作爲一個粗略的選擇,是否可以通過調用netsh命令來完成(雖然這似乎取決於要運行的dot3svc和/或wlansvc服務)?

+0

這有幫助嗎? http://stackoverflow.com/questions/6578480/unable-to-obtain-profile-of-connected-network-in-vista-7 –

+0

@JunWeiLee謝謝,它不直接幫助。這是一個代碼片斷,用戶可以使用[Managed Wifi API](http://managedwifi.codeplex.com/)來封裝[Native Wifi API](http://msdn.microsoft.com/en-us/library/) 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爲活動的配置文件,然後在服務有文件共享,網絡發現和遠程桌面服務,並且如果啓用了這些服務,就會有一個布爾標誌。下面是示例代碼:(只是警告你,我並沒有在生產中下面的代碼使用我只是探索這個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

相關問題