Manage DNS server by C# code

后端 未结 3 1687
无人及你
无人及你 2020-12-09 17:41

I need some sample code to create/delete zone and A record in microsoft DNS server by C#

相关标签:
3条回答
  • 2020-12-09 18:11

    Microsoft exposes it as a POX service, so you could just push XML over the wire to it, using the System.Net stuff & your user credentials.

    http://technet.microsoft.com/en-us/library/dd278634.aspx

    0 讨论(0)
  • 2020-12-09 18:12

    I agreed with Taylor but in my case i have got 2 different error with above code 1- Generic Error 2- Not Found error

    Below code has solved this problems

    private ManagementPath UpdateARecord(string strDNSZone, string strHostName, string strIPAddress)
            {
                ManagementScope mgmtScope = new ManagementScope(@"\\.\Root\MicrosoftDNS");
                ManagementClass mgmtClass = null;
                ManagementBaseObject mgmtParams = null;
                ManagementObjectSearcher mgmtSearch = null;
                ManagementObjectCollection mgmtDNSRecords = null;
                string strQuery;
    
                strQuery = string.Format("SELECT * FROM MicrosoftDNS_AType WHERE OwnerName = '{0}.{1}'", strHostName, strDNSZone);
    
                mgmtScope.Connect();
    
                mgmtSearch = new ManagementObjectSearcher(mgmtScope, new ObjectQuery(strQuery));
    
                mgmtDNSRecords = mgmtSearch.Get();
    
                //// Multiple A records with the same record name, but different IPv4 addresses, skip.
                //if (mgmtDNSRecords.Count > 1)
                //{
                //    // Take appropriate action here.
                //}
                //// Existing A record found, update record.
                //else
                if (mgmtDNSRecords.Count == 1)
                {
                    ManagementObject mo = new ManagementObject();
                    foreach (ManagementObject mgmtDNSRecord in mgmtDNSRecords)
                    {
                        if (mgmtDNSRecord["RecordData"].ToString() != strIPAddress)
                        {
                            mgmtParams = mgmtDNSRecord.GetMethodParameters("Modify");
                            mgmtParams["IPAddress"] = strIPAddress;
    
                            mgmtDNSRecord.InvokeMethod("Modify", mgmtParams, null);
                        }
                        mo = mgmtDNSRecord;
                        break;
                    }
    
                    return new ManagementPath(mo["RR"].ToString());
                }
                // A record does not exist, create new record.
                else
                {
                    mgmtClass = new ManagementClass(mgmtScope, new ManagementPath("MicrosoftDNS_AType"), null);
    
                    mgmtParams = mgmtClass.GetMethodParameters("CreateInstanceFromPropertyData");
                    mgmtParams["DnsServerName"] = Environment.MachineName;
                    mgmtParams["ContainerName"] = strDNSZone;
                    mgmtParams["OwnerName"] = strDNSZone;// string.Format("{0}.{1}", strHostName.ToLower(), strDNSZone);
    
                    mgmtParams["IPAddress"] = strIPAddress;
    
                    var outParams = mgmtClass.InvokeMethod("CreateInstanceFromPropertyData", mgmtParams, null);
    
                    if ((outParams.Properties["RR"] != null))
                    {
                        return new ManagementPath(outParams["RR"].ToString());
                    }
                }
    
                return null;
            }
    
    0 讨论(0)
  • 2020-12-09 18:18

    You have to use WMI to invoke the DNSProvider.

    This to add a record:

     public void AddARecord(string hostName, string zone, string iPAddress, string dnsServerName)
     {
          ManagementScope scope = 
             new ManagementScope(@"\\" + dnsServerName + "\\root\\MicrosoftDNS");
    
          scope.Connect();
    
          ManagementClass cmiClass =
             new ManagementClass(scope, 
                                 new ManagementPath("MicrosoftDNS_AType"),
                                 null);
    
         ManagementBaseObject inParams = 
             cmiClass.GetMethodParameters("CreateInstanceFromPropertyData");
    
         inParams["DnsServerName"] = this.ServerName;
         inParams["ContainerName"] = zone;
         inParams["OwnerName"] = hostName + "." + zone;
         inParams["IPAddress"] = iPAddress;
    
         cmiClass.InvokeMethod("CreateInstanceFromPropertyData", inParams, null);
    }
    

    You can reference the WMI reference and extend this as you need using the methods and classes http://msdn.microsoft.com/en-us/library/ms682123(v=vs.85).aspx

    0 讨论(0)
提交回复
热议问题