2009-06-05 5 views
5

मेरे पास निम्न vbscript कोड है जो स्थानीय आईपी पता देता है। यह बहुत अच्छा काम करता है। मैं अपने Winform .net ऐप में एक ही कार्यक्षमता प्रदान करने की कोशिश कर रहा हूं।मैं .NET में स्थानीय आईपी कैसे प्राप्त कर सकता हूं?

मेरे द्वारा किए गए सभी समाधान DNS का उपयोग करने में शामिल हैं। .NET में उपयोग के लिए इस स्क्रिप्ट को "पोर्ट" करने के तरीके पर कोई विचार है?

ऐसा करने का एक अलग तरीका शायद?

धन्यवाद!

Function GetIP() 

Dim ws : Set ws = CreateObject("WScript.Shell") 
    Dim fso : Set fso = CreateObject("Scripting.FileSystemObject") 
    Dim TmpFile : TmpFile = fso.GetSpecialFolder(2) & "/ip.txt" 
    Dim ThisLine, IP 
    If ws.Environment("SYSTEM")("OS") = "" Then 
    ws.run "winipcfg /batch " & TmpFile, 0, True 
    Else 
    ws.run "%comspec% /c ipconfig > " & TmpFile, 0, True 
    End If 
    With fso.GetFile(TmpFile).OpenAsTextStream 
    Do While NOT .AtEndOfStream 
     ThisLine = .ReadLine 
     If InStr(ThisLine, "Address") <> 0 Then IP = Mid(ThisLine, InStr(ThisLine, ":") + 2) 
    Loop 
    .Close 
    End With 

    If IP <> "" Then 
    If Asc(Right(IP, 1)) = 13 Then IP = Left(IP, Len(IP) - 1) 
    End If 
    GetIP = IP 
    fso.GetFile(TmpFile).Delete 
    Set fso = Nothing 
    Set ws = Nothing 
End Function 

उत्तर

9

आप नेटवर्क इंटरफेस से पूछकर ऐसा कर सकते हैं, हालांकि इसमें सभी स्थानीय पते शामिल होंगे, इसलिए आपको एक इंटरफेस (जो संभवतः वहां होगा) अगर आप चाहते हैं तो उसे चुनने के लिए where क्लॉज जोड़ना पड़ सकता है। यह निश्चित रूप से अपनी स्क्रिप्ट का एक सीधा बंदरगाह नहीं है, लेकिन उम्मीद है कि कुछ फायदा नहीं होगा:

var localAddress = 
    (from ni in NetworkInterface.GetAllNetworkInterfaces() 
    where ni.NetworkInterfaceType != NetworkInterfaceType.Loopback 
    let props = ni.GetIPProperties() 
    from ipAddress in props.UnicastAddresses 
    select ipAddress).FirstOrDefault();  

ध्यान दें: आप IPv4 पतों चाहते हैं, तो आप के लिए क्वेरी बदल सकता है:

var localAddress = 
    (from ni in NetworkInterface.GetAllNetworkInterfaces() 
    where ni.NetworkInterfaceType != NetworkInterfaceType.Loopback 
    let props = ni.GetIPProperties() 
    from ipAddress in props.UnicastAddresses 
    where ipAddress.AddressFamily == AddressFamily.InterNetwork // IPv4 
    select ipAddress).FirstOrDefault();  
+0

उपरोक्त टिप्पणी के समान ही समस्या। यह लौट रहा है -> fe80 :: ad11: 2dc5: 58af: a24b% 14 जो मैंने अब खोजा है वह मेरा आईपीवी 6 पता है। –

+0

हम्म। मैं इसे उत्तर के रूप में स्वीकार करने जा रहा हूं क्योंकि यह वास्तव में किसी भी बॉक्स पर उचित आईपीवी 4 पता देता है जिसमें आईपीवी 6 नहीं है; जो मेरे लक्षित दर्शकों में से हर कोई है, इसलिए यह काम करता है। मुझे यह पता लगाने में दिलचस्पी होगी कि एक विशिष्ट प्रविष्टि कैसे चुना जाए ... लेकिन हां! –

+0

हम्म, पताफैमिली को हल नहीं कर सकता .... –

5
using System.Net; 

IPAddress localAddr = Dns.GetHostEntry(Dns.GetHostName().ToString()).AddressList[0]; 

[संपादित करें] hmmmm ... बस महसूस किया आपने उल्लेख किया है कि आप DNS का उपयोग नहीं करना चाहते हैं ... यही वजह है कि है?

[संपादित करें] टिप्पणियों से ऊपर जा रहा है ....

सरल संस्करण है, तो आप केवल स्थानीय, रिक्त स्ट्रिंग के बारे में परवाह GetHostEntry में पास डिफ़ॉल्ट रूप से स्थानीय वापसी केवल

IPAddress localAddr = Dns.GetHostEntry("").AddressList[0]; 
+0

पोस्ट करने के लिए समय लेने के लिए धन्यवाद! DNS के लिए आवश्यक है कि वर्तमान में उनके पास हमारे DNS तक पहुंच हो, सही? जब तक कि कथन असत्य नहीं है, मेरी समस्या यह है कि मेरी ऐप एक कभी-कभी जुड़ी ऐप है जो हमेशा हमारे होम नेटवर्क पर नहीं होगी। वे घर या ग्राहक के घर पर हो सकते हैं। अनुलेख -> मुझे यह दिलचस्प लगता है कि आपके पास उत्तर के लिए 4 अपवॉट्स हैं जो मैंने पोस्ट किए हैं। मेरा मतलब कोई अपराध नहीं है, सिर्फ एक अवलोकन मैंने यहां और अधिक देखा है। फिर से धन्यवाद! –

+0

हम्म, कोई विचार यह क्यों वापस करेगा -> fe80 :: ad11: 2dc5: 58af: a24b% 14 ?? –

+0

@ रीफ्रैक्टेड पलाडिन - यह एक आईपीवी 6 आईपी पता है। –

1

मैं व्यक्तिगत रूप से सिफारिश करेंगे DNS का उपयोग, लेकिन आप पूरी तरह से आप System.Management नाम स्थान

string ipAddress = ""; 
ManagementObjectSearcher query = 
    new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = 'TRUE'"); 
ManagementObjectCollection queryCollection = query.Get(); 
foreach (ManagementObject mo in queryCollection) 
{ 
    string[] addresses = (string[]) mo["IPAddress"]; 
    if (addresses.Length == 1 && addresses[0] != "0.0.0.0") 
    { 
     ipAddress = addresses[0]; 
     break; 
    } 

} 
Console.WriteLine(ipAddress); 

कि सही ढंग से वें मिलना चाहिए के लिए एक कॉल से जानकारी प्राप्त कर सकते करने के लिए नहीं करना चाहते हैं ई आईपी लेकिन कुछ tweaking की आवश्यकता हो सकती है।

+0

लौटाएगा, शायद मैं सिर्फ मोटा हूं लेकिन प्रबंधन ऑब्जेक्टशियर मेरे सिस्टम में मौजूद नहीं प्रतीत होता है। प्रबंधन नामस्थान ??? .net 35 sp1 –

+0

@ रीफ्रैक्टेड पालाडिन: क्या आपने सिस्टम को जोड़ा है। प्रबंधन परियोजना को आपके प्रोजेक्ट के संदर्भ में? – Helen

2

यह ऐसा लगता है कि आपकी स्क्रिप्ट ipconfig को कॉल कर रही है, आउटपुट को फ़ाइल में सहेज रही है, और फिर फ़ाइल को पार्स कर रही है। आपको लगता है कि क्या करना चाहते हैं, तो आप कुछ इस तरह करना होगा:

using System.Threading; 

... 

static void Main(string[] args) 
{ 
    Process p = new Process(); 

    ProcessStartInfo psi = new ProcessStartInfo("ipconfig"); 
    psi.CreateNoWindow = true; 
    psi.RedirectStandardOutput = true; 
    psi.UseShellExecute = false; 

    p.StartInfo = psi; 
    p.Start(); 

    string s = p.StandardOutput.ReadToEnd(); 
    int startPos = s.IndexOf(":", s.IndexOf("IPv4 Address")); 
    string output = s.Substring(startPos + 2, s.IndexOf("\r\n", startPos) - startPos - 2); 
    Console.WriteLine(output); 
    Console.ReadLine(); 
} 

ध्यान दें कि मैं इस विधि का विशेष रूप से शौकीन नहीं हूँ - आप शायद बेहतर इस सूत्र में सूचीबद्ध अन्य समाधान से कुछ के साथ दिखाए जाएँगे - लेकिन यह आपकी मूल लिपि का अधिक प्रत्यक्ष अनुवाद है।

0

आप सभी आईपी पते खोजने के लिए इस माध्यम से स्क्रॉल कर सकते हैं।

String hostName = Dns.GetHostName();      
    IPHostEntry local = Dns.GetHostByName(hostName); 
    foreach (IPAddress ipaddress in local.AddressList) 
    { 
     ipaddress.ToString(); //this gives you the IP address 
     //logic here 
    } 
+0

इन्हें बहिष्कृत कर दिया गया है। – fARcRY