2013-10-07 6 views
7

Come si determina o si esamina il profilo di connessione della connessione di rete corrente (se presente)?Ottieni le proprietà della connessione di rete corrente

In particolare, devo determinare se la connessione corrente è a una rete privata o pubblica e da lì determinare se l'individuazione della rete è attivata o disattivata.

Sembra che queste informazioni sono facilmente disponibili in un'applicazione Windows Store tramite i Windows.Networking.Connectivity.NetworkInformation.GetConnectionProfiles() o NetworkInformation.GetInternetConnectionProfile() funzioni, ma questo è un applicazione desktop standard che deve essere eseguito su Windows 7 e Server 2008, nonché Win 8 e Server 2012 .

Enumerating the NICs su una macchina non è un problema, ma questo non risolve il mio problema - ho bisogno di ottenere le proprietà della connessione di , non il dispositivo fisico.

Esiste un modo integrato per fare ciò con il framework .Net? In alternativa, può essere fatto con WMI? O come alternativa grezza, può essere fatto invocando il comando netsh (anche se questo sembra dipendere dal fatto che i servizi dot3svc e/o wlansvc siano in esecuzione)?

+0

Questo può aiutare? http://stackoverflow.com/questions/6578480/unable-to-obtain-profile-of-connected-network-in-vista-7 –

+0

@JunWeiLee Grazie, non aiuta direttamente. Questo è uno snippet di codice utilizzato dagli utenti [Managed Wifi API] (http://managedwifi.codeplex.com/) che avvolge la [Native WiFi API] (http://msdn.microsoft.com/en-us/library/ ms705969.aspx). – slugster

risposta

10

È possibile utilizzare Network List Manager API a tal fine, di utilizzarlo da C# import List Manager Type Library (per compilare direttamente questo esempio qui di seguito i tipi di interoperabilità deselezionare Incorpora nelle proprietà di riferimento).

Quindi è necessario enumerare tutte le reti connesse, perché ce ne possono essere più di una, ad esempio in questo momento sono connesso a Internet e VPN. Quindi, per tutte le reti connesse chiama l'API GetCategory(), restituisce NLM_NETWORK_CATEGORY (privato, pubblico o dominio).

Ecco il codice di esempio:

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(); 

Per Network Discovery è necessario utilizzare Firewall API e la biblioteca di riferimento COM NetFwTypeLib e ottenere INetFwProfile per il profilo attivo, poi nei servizi ci sono la condivisione di file, Network Discovery e remoto Servizi desktop e c'è un flag bool se questi sono abilitati. Ecco il codice di esempio: (solo per avvertire che non ho usato il codice qui sotto nella produzione Stavo esplorando questa 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); 

E il metodo che mostra i servizi profilo.

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

Grazie per la risposta, risolve parte del mio problema (non sono sicuro che l'impostazione "Scoperta della rete" sia facilmente ottenibile). – slugster

+0

oh, non l'ho visto, ho giocato un po 'con le API del firewall e c'è un modo per farlo, aggiornerò la mia risposta –

+0

Ottima risposta, era tutto ciò di cui avevo bisogno :) – slugster