2013-10-07 8 views
7

वर्तमान नेटवर्क कनेक्शन (यदि कोई है) के कनेक्शन प्रोफाइल को निर्धारित या जांचते हैं?वर्तमान नेटवर्क कनेक्शन के गुण प्राप्त करें

विशेष रूप से, मुझे यह निर्धारित करने की आवश्यकता है कि वर्तमान कनेक्शन किसी निजी या सार्वजनिक नेटवर्क के लिए है, और वहां से यह निर्धारित करता है कि नेटवर्क खोज चालू या बंद है या नहीं।

यह इस जानकारी की तरह लगता है Windows.Networking.Connectivity.NetworkInformation.GetConnectionProfiles() या NetworkInformation.GetInternetConnectionProfile() काम करता है, के माध्यम से Windows स्टोर ऐप में आसानी से उपलब्ध है, लेकिन यह एक मानक डेस्कटॉप एप्लिकेशन कि 7 विन और सर्वर 2008 के साथ ही जीत 8 और सर्वर 2012 को चलाना चाहिए है ।

Enumerating the NICs एक मशीन पर एक समस्या नहीं है, लेकिन इससे मेरी समस्या का समाधान नहीं करता है - मैं कनेक्शन, नहीं भौतिक युक्ति के गुण प्राप्त करने की जरूरत है।

क्या नेट फ्रेमवर्क के साथ ऐसा करने का एक अंतर्निहित तरीका है? वैकल्पिक रूप से यह डब्लूएमआई के साथ किया जा सकता है? या एक कच्चे विकल्प के रूप में, यह netsh कमांड का आह्वान करके किया जा सकता है (हालांकि यह dot3svc और/या wlansvc सेवाओं पर चलने के लिए प्रतीत होता है)?

+0

क्या यह मदद करता है? http://stackoverflow.com/questions/6578480/unable-to-obtain-profile-of-connected-network-in-vista-7 –

+0

@JunWeiLee धन्यवाद, यह सीधे मदद नहीं करता है। यह एक कोड स्निपेट है जो उपयोगकर्ता [प्रबंधित वाईफ़ाई एपीआई] (http://managedwifi.codeplex.com/) जो [मूल वाईफ़ाई एपीआई] को लपेटता है (http://msdn.microsoft.com/en-us/library/ ms705969.aspx)। – slugster

उत्तर

10

आप उस उद्देश्य के लिए Network List Manager 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(); 

आप तो फ़ायरवॉल एपीआई और संदर्भ COM पुस्तकालय NetFwTypeLib का उपयोग करें और सक्रिय प्रोफ़ाइल के लिए INetFwProfile प्राप्त करने के लिए, है सेवाओं में फ़ाइल साझा, नेटवर्क डिस्कवरी और रिमोट देखते हैं:

यहाँ नमूना कोड है डेस्कटॉप सेवाएं, और यदि यह सक्षम हैं तो एक बूल ध्वज है। (सिर्फ चेतावनी देने के लिए मैं उत्पादन में नीचे दिए गए कोड का उपयोग नहीं किया मैं तो बस इस एपीआई तलाश रहा है)

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

ओह, यह नहीं देखा, मैंने फ़ायरवॉल एपीआई के साथ कुछ हद तक खेला और वहां एक रास्ता है कि मैं अपना जवाब –

+0

महान उत्तर अपडेट करूंगा, यह सब कुछ आवश्यक था :) – slugster

संबंधित मुद्दे