2013-10-07 5 views
7

Как определить или проверить профиль подключения текущего сетевого соединения (если есть)?Получить свойства текущего сетевого подключения

В частности, мне нужно определить, подключено ли текущее соединение к частной или общедоступной сети, и оттуда определить, включено или выключено обнаружение сети.

Похоже, эта информация легко доступна в приложении Windows Store через Windows.Networking.Connectivity.NetworkInformation.GetConnectionProfiles() или NetworkInformation.GetInternetConnectionProfile() функций, но это стандартное настольное приложение, который должен работать на Win 7 и Server 2008, а также Win 8 и Server 2012 .

Enumerating the NICs на машине это не проблема, но это не решает мою проблему - мне нужно, чтобы получить свойства связи, а не физического устройства.

Есть ли встроенный способ сделать это с .Net framework? Или это можно сделать с 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# import Network List Manager Library (для непосредственного компиляции этого примера ниже снимите флажок «Вставить типы взаимодействия в ссылочные свойства»).

Затем вы должны перечислить все подключенные сети, потому что их может быть несколько, например, прямо сейчас я подключен к Интернету и VPN. Затем для всех подключенных сетей вызовите API GetCategory(), он возвращает 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 для активного профиля, то в услугах есть общий доступ к файлам, Network Discovery и удаленный Службы рабочего стола, и есть флаг 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

Смежные вопросы