2016-10-27 22 views
6

पर सी # के साथ DNS कैसे बदलें I VB.NET के माध्यम से विंडोज 10 पर DNS को बदलने की कोशिश कर रहा हूं।विंडोज 10

मैं कोड है कि विंडोज 7 पर काम करता है, लेकिन यह विंडोज पर काम नहीं करता है 10

यहाँ विंडोज 7 के लिए अपने कोड है कि DNS बदल जाता है:

ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"); 
ManagementObjectCollection moc = mc.GetInstances(); 
foreach (ManagementObject mo in moc) 
{ 
    if ((bool)mo["IPEnabled"]) 
    { 
     ManagementBaseObject objdns = mo.GetMethodParameters("SetDNSServerSearchOrder"); 
     if (objdns != null) 
     { 
      string[] s = { "192.168.XX.X", "XXX.XX.X.XX" }; 
      objdns["DNSServerSearchOrder"] = s; 
      mo.InvokeMethod("SetDNSServerSearchOrder", objdns, null); 

मेरा प्रश्न है कैसे, क्या मुझे यह विंडोज 10 ओएस पर काम करने के लिए मिलता है?

+0

गैर- Windows 10 संस्करणों पर काम करता है? विंडोज 10 पर आपको क्या त्रुटि मिलती है? – Nate

+1

मुझे विंडोज 10 पर कोई त्रुटि नहीं है, यह सिर्फ DNS को नहीं बदलता है। लेकिन हाँ यह कोड विंडोज 7 के लिए किसी भी मुद्दे के बिना काम करता है। –

+0

हाय क्या आपने इस प्रश्न की जांच करने की कोशिश की? http://stackoverflow.com/questions/209779/how-can-you-change-network-settings-ip-address-dns-wins-host-name-with-code?noredirect=1&lq=1 बस मेरे अपने के लिए –

उत्तर

0

विंडोज 10 के साथ आपको पहले प्रमाणीकरण की आवश्यकता हो सकती है। एक प्रबंधन स्कोप कन्स्ट्रक्टर को एक कनेक्शन ऑप्शन उदाहरण पास करें, जो आपके प्रमाणीकरण और प्रतिरूपण गुणों को परिभाषित करता है।

इस प्रयास करें:

// Method to prepare the WMI query connection options. 
public static ConnectionOptions PrepareOptions () 
{ 
    ConnectionOptions options = new ConnectionOptions (); 
    options . Impersonation = ImpersonationLevel . Impersonate; 
    options . Authentication = AuthenticationLevel . Default; 
    options . EnablePrivileges = true; 
    return options; 
} 

// Method to prepare WMI query management scope. 
public static ManagementScope PrepareScope (string machineName , ConnectionOptions options , string path ) 
{ 
    ManagementScope scope = new ManagementScope (); 
    scope . Path = new ManagementPath (@"\\" + machineName + path); 
    scope . Options = options; 
    scope . Connect (); 
    return scope; 
} 

// Set DNS. 
ConnectionOptions options = PrepareOptions (); 
ManagementScope scope = PrepareScope (Environment . MachineName , options , @"\root\CIMV2"); 
ManagementClass mc = new ManagementClass(scope, "Win32_NetworkAdapterConfiguration"); 
ManagementObjectCollection moc = mc.GetInstances(); 
foreach (ManagementObject mo in moc) 
{ 
    if ((bool)mo["IPEnabled"]) 
    { 
     ManagementBaseObject objdns = mo.GetMethodParameters("SetDNSServerSearchOrder"); 
     if (objdns != null) 
     { 
      string[] s = { "192.168.XX.X", "XXX.XX.X.XX" }; 
      objdns["DNSServerSearchOrder"] = s; 
      mo.InvokeMethod("SetDNSServerSearchOrder", objdns, null); 

इस उत्तर के आधार पर:

WMI not working after upgrading to Windows 10

+0

दुर्भाग्य से अपने कोड त्रुटियां हैं: ManagementClass एम सी = नए ManagementClass के लिए दो तर्क (गुंजाइश, "Wie32 [..]") दोनों अवैध चिह्नित कर रहे हैं। क्या इसे ठीक करने का कोइ उपाय है? – adiuva

0

इस कोड को मैं यह करने के लिए उपयोग है और यह काम करता है:

/// <summary> 
/// Set's the DNS Server of the local machine 
/// </summary> 
/// <param name="NIC">NIC address</param> 
/// <param name="DNS">DNS server address</param> 
/// <remarks>Requires a reference to the System.Management namespace</remarks> 
public void setDNS(string NIC, string DNS) 
{ 
    ManagementClass objMC = new ManagementClass("Win32_NetworkAdapterConfiguration"); 
    ManagementObjectCollection objMOC = objMC.GetInstances(); 

    foreach (ManagementObject objMO in objMOC) 
    { 
     if ((bool)objMO["IPEnabled"]) 
     { 
      // if you are using the System.Net.NetworkInformation.NetworkInterface you'll need to change this line to if (objMO["Caption"].ToString().Contains(NIC)) and pass in the Description property instead of the name 
      if (objMO["Caption"].Equals(NIC)) 
      { 
       try 
       { 
        ManagementBaseObject newDNS = 
         objMO.GetMethodParameters("SetDNSServerSearchOrder"); 
        newDNS["DNSServerSearchOrder"] = DNS.Split(','); 
        ManagementBaseObject setDNS = 
         objMO.InvokeMethod("SetDNSServerSearchOrder", newDNS, null); 
       } 
       catch (Exception) 
       { 
        throw; 
       } 
      } 
     } 
    } 
} 

यह आशा है कि मदद करता है ...

+0

मुझे लगता है कि यह मूल रूप से यहां से आया: http://stackoverflow.com/questions/209779/how-can-you-change-network-settings-ip-address-dns-wins-host-name-with-code –

+0

यही कारण है कि एक ही कोड मैं भी उपयोग कर रहा हूँ, लेकिन यह विंडोज 10 – adiuva

+0

आप केवल बदल रहे हैं के साथ अब और काम नहीं करता है 'अगर (objMO [" कैप्शन "]। बराबर (एनआईसी))'? –

2

सबसे पहले आपको नेटवर्क इंटरफेस प्राप्त करने की आवश्यकता है जिसे आप DNS

पर सेट करना चाहते हैं, मैंने इस कोड का परीक्षण विंडोज 10 के नवीनतम संस्करण पर किया है और यह एक आकर्षण की तरह काम करता है!

यहाँ सक्रिय ईथरनेट या वाईफ़ाई नेटवर्क

public static NetworkInterface GetActiveEthernetOrWifiNetworkInterface() 
{ 
    var Nic = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault(
     a => a.OperationalStatus == OperationalStatus.Up && 
     (a.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 || a.NetworkInterfaceType == NetworkInterfaceType.Ethernet) && 
     a.GetIPProperties().GatewayAddresses.Any(g => g.Address.AddressFamily.ToString() == "InterNetwork")); 

    return Nic; 
} 

SetDNS

public static void SetDNS(string DnsString) 
{ 
    string[] Dns = { DnsString }; 
    var CurrentInterface = GetActiveEthernetOrWifiNetworkInterface(); 
    if (CurrentInterface == null) return; 

    ManagementClass objMC = new ManagementClass("Win32_NetworkAdapterConfiguration"); 
    ManagementObjectCollection objMOC = objMC.GetInstances(); 
    foreach (ManagementObject objMO in objMOC) 
    { 
     if ((bool)objMO["IPEnabled"]) 
     { 
      if (objMO["Caption"].ToString().Contains(CurrentInterface.Description)) 
      { 
       ManagementBaseObject objdns = objMO.GetMethodParameters("SetDNSServerSearchOrder"); 
       if (objdns != null) 
       { 
        objdns["DNSServerSearchOrder"] = Dns; 
        objMO.InvokeMethod("SetDNSServerSearchOrder", objdns, null); 
       } 
      } 
     } 
    } 
} 

UnsetDNS

public static void UnsetDNS() 
{ 
    var CurrentInterface = GetActiveEthernetOrWifiNetworkInterface(); 
     if (CurrentInterface == null) return; 

    ManagementClass objMC = new ManagementClass("Win32_NetworkAdapterConfiguration"); 
    ManagementObjectCollection objMOC = objMC.GetInstances(); 
    foreach (ManagementObject objMO in objMOC) 
    { 
     if ((bool)objMO["IPEnabled"]) 
     { 
      if (objMO["Caption"].ToString().Contains(CurrentInterface.Description)) 
      { 
       ManagementBaseObject objdns = objMO.GetMethodParameters("SetDNSServerSearchOrder"); 
       if (objdns != null) 
       { 
        objdns["DNSServerSearchOrder"] = null; 
        objMO.InvokeMethod("SetDNSServerSearchOrder", objdns, null); 
       } 
      } 
     } 
    } 
} 

लगाने के लिए कोड है प्रयोग

SetDNS("127.0.0.1"); 
+0

मुझे लगता है कि यह कई एनआईसी पर गलती से DNS सेट कर सकता है, पीसी के पास 2 एनआईसी समान वर्णन के साथ होना चाहिए जो मुझे विश्वास है। यह आमतौर पर WMI उपयोग करने के लिए सटीक एनआईसी नाम और फिर वाकई डिवाइस को आप चाहते हैं बनाने के लिए '[" कैप्शन "]। Equals' उपयोग करने के लिए बेहतर है। –

2

मैंने पाया कि निम्न कोड Windows 10 और 8.1 के लिए महान काम कर रहा है (दूसरों का परीक्षण नहीं किया है, लेकिन साथ ही काम करना चाहिए) कई समाधान का मेल:

public static void setDNS(string NIC, string DNS) 
{ 
    ConnectionOptions options = PrepareOptions(); 
    ManagementScope scope = PrepareScope(Environment.MachineName, options, @"\root\CIMV2"); 
    ManagementPath managementPath = new ManagementPath("Win32_NetworkAdapterConfiguration"); 
    ObjectGetOptions objectGetOptions = new ObjectGetOptions(); 
    ManagementClass mc = new ManagementClass(scope, managementPath, objectGetOptions); 
    ManagementObjectCollection moc = mc.GetInstances(); 
    foreach (ManagementObject mo in moc) 
    { 
     if ((bool)mo["IPEnabled"]) 
     { 
      if (mo["Caption"].ToString().Contains(NIC)) 
      { 
       try 
       { 
        ManagementBaseObject newDNS = mo.GetMethodParameters("SetDNSServerSearchOrder"); 
        newDNS["DNSServerSearchOrder"] = DNS.Split(','); 
        ManagementBaseObject setDNS = mo.InvokeMethod("SetDNSServerSearchOrder", newDNS, null); 
       } 
       catch (Exception e) 
       { 
        Console.WriteLine(e.ToString()); 
        Console.ReadKey(); 
        throw; 
       } 
      } 
     } 
    } 
} 

अनुप्रयोग चलाने के लिए की जरूरत है ऊंचा अनुमति के साथ (मेरे मामले में मैं एक ऊपर उठाया प्रक्रिया एक .exe चल रहा शुरू कर):

private void callSwapDNS(string NIC, string DNS) 
{ 
    const int ERROR_CANCELLED = 1223; //The operation was canceled by the user. 
    ProcessStartInfo info = new ProcessStartInfo(@"swap.exe"); 
    string wrapped = string.Format(@"""{0}"" ""{1}""", NIC, DNS); 
    info.Arguments = wrapped; 
    info.UseShellExecute = true; 
    info.Verb = "runas"; 
    info.WindowStyle = ProcessWindowStyle.Hidden; 
    try 
    { 
     Process.Start(info); 
     Thread.Sleep(500); 
    } 
    catch (Win32Exception ex) 
    { 
     if (ex.NativeErrorCode == ERROR_CANCELLED) 
      MessageBox.Show("Why you no select Yes?"); 
     else 
      throw; 
    } 
} 

mo["Caption"].ToString().Contains(NIC) उपयोग करने के लिए काम नहीं करता है Windows 10 WMI क्वेरी के रूप में देता है एनआईसी-नाम [000000]

[000000] इंटेल (आर) 82574L गीगाबिट नेटवर्क कनेक्शन

मेरे Windows 10 मशीन पर के साथ अग्रणी।

निम्नलिखित उत्तर देने के लिए क्रेडिट: [WMI विंडोज 10

WMI not working after upgrading to Windows 10
How can you change Network settings (IP Address, DNS, WINS, Host Name) with code in C#

और इस सवाल का उत्तर देने के लिए उन्नयन के बाद काम नहीं कर रहा।