C#利用WMI操作DNS服务器(可远程操作,需要相应权限)

    using System; 

using System.Collections.Generic; 

using System.Text; 

using System.Data; 

namespace Yaosansi 

{ 

    class Test 

    { 

        static void Main() 

        { 

            MyDnsTEST(); 

        } 

    /// <summary> 

    /// MyDnsTEST功能测试 

  /// C#利用WMI操作DNS服务器(可远程操作,需要相应权限) 

    /// Author:yaosansi  

    /// Create Date:2005-09-07 

    /// Modify Date:2006-10-25 

    /// Site:http://www.yaosansi.com/ 

    /// E-mail:yaosansi at 126 dot com 

    /// http://www.yaosansi.com/blog/article.asp?id=935 

    /// http://yaosansi.cnblogs.com/archive/2006/11/04/DNSServiceInCsharpWithWMI.html 

    /// 注意:此版本为WINDOWS2003 DNS服务器专用.不适合其它版本操作系统. 

    /// </summary> 

        static void MyDnsTEST() 

        { 

            Yaosansi.Net.MYDNS dns = new Yaosansi.Net.MYDNS(); 

            //=========================================== 

            //不对以下三个属性赋值默认DNS服务器为本机. 

            dns.ServerName = "202.96.64.68"; 

            dns.userName = "Administrator"; 

            dns.passWord = "123456789"; 

            //=========================================== 

            //dns.CreateZone("yaosansi.com"); 

            //dns.DelZone("yaosansi.com"); 

            //dns.CreateAType("yaosansi.com", "www", "2.2.2.2", "3600"); 

            //dns.ModifyAType("yaosansi.com","www","127.21.0.1","800"); 

            //dns.DelAType("yaosansi.com", "mail"); 

            //dns.CreateMXType("mail", "yaosansi.com", "5.5.5.5", "20", "3600"); 

            //dns.ModifyMXType("mail", "yaosansi.com", "36000", "218.1.1.1", "26"); 

            //dns.DelMXType("mail", "yaosansi.com"); 

            //dns.CreateCNAMEType("mpq2", "yaosansi.com", "www.yaosansi.com", "3900"); 

            //dns.ModifyCNAMEType("mpq2", "abc.com", "30520", "www.yaosansi.com."); 

            //dns.DelCNAMEType("mpq", "yaosansi.com"); 

            //DataTable table = dns.ListExistsMXType("yaosansi.com"); 

            DataTable table = dns.ListExistsAType("yaosansi.com"); 

            //DataTable table = dns.ListExistsCNAMEType("yaosansi.com"); 

            Yaosansi.Data.DataHelp.PrintTable(table); 

            if (!string.IsNullOrEmpty(dns.ErrMessage)) 

            { 

                Console.WriteLine("--------------------------------------------------"); 

                Console.WriteLine("返回信息:" + dns.ErrMessage); 

                Console.WriteLine("--------------------------------------------------"); 

            } 

            Console.WriteLine(""); 

            Console.WriteLine("===End==="); 

            Console.ReadLine(); 

        } 

    } 

} 





using System; 

using System.Management; 

using System.Data; 

namespace Yaosansi.Net 

{ 

    /// <summary> 

    /// C#利用WMI操作DNS服务器(可远程操作,需要相应权限) 

    /// Author:yaosansi  

    /// Create Date:2005-09-07 

    /// Modify Date:2006-10-25 

    /// Site:http://www.yaosansi.com/ 

    /// E-mail:yaosansi at 126 dot com 

    /// http://www.yaosansi.com/blog/article.asp?id=935 

    /// http://yaosansi.cnblogs.com/archive/2006/11/04/DNSServiceInCsharpWithWMI.html 

    /// 注意:此版本为WINDOWS2003 DNS服务器专用.不适合其它版本操作系统. 

    /// </summary> 

    public class MYDNS 

    { 

        //要连接的DNS服务器 

        private string sServerPath; 

        //用户名 

        private string username = null; 

        //密码 

        private string password = null; 

        //服务器名称或IP地址 

        private string DNSName = null; 

        //表示管理操作的范围.这里是用来执行DNS的命名空间 

        private ManagementScope DNS; 

        //用于返回检索的ManagementObject集合 

        private System.Management.ManagementObjectCollection Q; 

        // 

        private ManagementClass DnsClass; 

        // 

        private ManagementBaseObject MI; 

        /// <summary> 

        /// 返回的操作信息. 

        /// </summary> 

        private string errMessage=null; 

        /// <summary> 

        /// 获取错误信息. 

        /// </summary> 

        public string ErrMessage 

        { 

            get 

            { 

                return errMessage; 

            } 

        } 

        /// <summary> 

        /// 设置DNS服务器名称或IP地址 

        /// </summary> 

        public string ServerName 

        { 

            set 

            { 

                this.sServerPath = string.Format(@"//{0}/root/MicrosoftDNS", value); 

                this.DNSName = value; 

            } 

        } 

        /// <summary> 

        /// 设置连接服务器的用户名(指定服务器IP,用户和密码后将自动连接远程服务器,本机不需要指定) 

        /// </summary> 

        public string userName 

        { 

            set 

            { 

                this.username = value; 

            } 

        } 

        /// <summary> 

        /// 设置连接服务器的密码(指定服务器IP,用户和密码后将自动连接远程服务器,本机不需要指定) 

        /// </summary> 

        public string passWord 

        { 

            set 

            { 

                this.password = value; 

            } 

        } 

        /// <summary> 

        /// 构造函数 

        /// </summary> 

        public MYDNS() 

        { 

            sServerPath = @"//localhost/root/MicrosoftDNS"; 

            DNSName = "localhost"; 

        } 



        /// <summary> 

        /// 建立对象.连接 

        /// </summary> 

        /// <param name="DnsType">DNS类型 MicrosoftDNS_Zone等</param> 

        private void Create(string DnsType) 

        { 

            if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password)) 

            { 

                System.Management.ConnectionOptions Conn = new ConnectionOptions(); 

                Conn.Username = username; //用户名 

                Conn.Password = password; //口令 

                DNS = new ManagementScope(sServerPath,Conn); 

            } 

            else 

            { 

                DNS = new ManagementScope(sServerPath); 

            } 

            if (!DNS.IsConnected) 

            { 

                DNS.Connect(); 

            } 

            ManagementPath Path = new ManagementPath(DnsType); 

            this.DnsClass = new ManagementClass(DNS, Path, null); 

        } 

        /// <summary> 

        /// 查询DNS并建立对象 

        /// </summary> 

        /// <param name="query">WQL查询语句</param> 

        ///  <param name="DnsType">DNS类型 MicrosoftDNS_Zone等</param> 

        /// <returns></returns> 

        public ManagementObjectCollection QueryDNS(string query, string DnsType) 

        { 

            this.Create(DnsType); 

            System.Management.ManagementObjectSearcher QS = new ManagementObjectSearcher(DNS, new ObjectQuery(query)); 

            QS.Scope = DNS; 

            return QS.Get(); 

        } 

        /// <summary> 

        /// 仅查询DNS 

        /// </summary> 

        /// <param name="query">WQL查询语句</param> 

        /// <returns></returns> 

        public ManagementObjectCollection QueryDNS(string query) 

        { 

            if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password)) 

            { 

                System.Management.ConnectionOptions Conn = new ConnectionOptions(); 

                Conn.Username = username; //用户名 

                Conn.Password = password; //口令 

                DNS = new ManagementScope(sServerPath, Conn); 

            } 

            else 

            { 

                DNS = new ManagementScope(sServerPath); 

            } 

            if (!DNS.IsConnected) 

            { 

                DNS.Connect(); 

            } 

            System.Management.ManagementObjectSearcher QS = new ManagementObjectSearcher(DNS, new ObjectQuery(query)); 

            QS.Scope = DNS; 

            return QS.Get(); 

        } 



        /// <summary> 

        /// 判断区域是否存在 

        /// </summary> 

        /// <param name="domain">区域名称</param> 

        /// <returns></returns> 

        public bool IsExistsZone(string domain) 

        { 

            try 

            { 

                Q = QueryDNS("Select * From MicrosoftDNS_ZONE where ContainerName='" + domain + "'"); 

                foreach (ManagementObject oManObject in Q) 

                { 

                    //Console.WriteLine(oManObject["ContainerName"].ToString()); 

                    return true; 

                } 

                return false; 

            } 

            catch (Exception e) 

            { 

                errMessage = e.Message; 

                Console.WriteLine(e.ToString()); 

                return false; 

            } 

        } 





        /// <summary> 

        /// 创建一个新的区域,仅区域名称 

        /// </summary> 

        /// <param name="domain">区域的名称</param> 

        public bool CreateZone(string domain) 

        { 

            try 

            { 

                this.Create("MicrosoftDNS_Zone"); 

                //如果区域已经存在 

                if (IsExistsZone(domain)) 

                { 

                    errMessage = "域:"+domain+"已经存在."; 

                    return false; 

                } 

                //建立新的区域 

                this.MI = DnsClass.GetMethodParameters("CreateZone"); 

                this.MI["ZoneName"] = domain; 

                this.MI["ZoneType"] = 0; 

                ManagementBaseObject OutParams = this.DnsClass.InvokeMethod("CreateZone", MI, null); 

                errMessage = "域:"+domain+"创建成功."; 

                return true; 

            } 

            catch (Exception e) 

            { 

                errMessage = e.Message; 

                Console.WriteLine(e.ToString()); 

                return false; 

            } 

        } 



        /// <summary> 

        /// 创建一个区域,包括其它参数 

        /// </summary> 

        /// <param name="domain">要创建的区域名称</param> 

        /// <param name="ZoneType">Type of zone. Valid values are the following:0 Primary zone. 1 Secondary zone.  2 Stub zone. 3 Zone forwarder. </param> 

        /// <param name="DataFileName">[in, optional] Name of the data file associated with the zone</param> 

        /// <param name="IpAddr">[in, optional] IP address of the mater DNS Server for the zone. </param> 

        /// <param name="AdminEmailName">[in, optional] Email address of the administrator responsible for the zone</param> 

        /// <returns></returns> 

        public bool CreateZone(string domain, uint ZoneType, string DataFileName, string[] IpAddr, string AdminEmailName) 

        { 

            try 

            { 

                this.Create("MicrosoftDNS_Zone"); 

                //如果区域已经存在 

                if (IsExistsZone(domain)) 

                { 

                    errMessage = "域:" + domain + "已经存在."; 

                    return false; 

                } 

                //建立新的区域 

                MI = DnsClass.GetMethodParameters("CreateZone"); 

                MI["ZoneName"] = domain; 

                MI["ZoneType"] = ZoneType; 

                MI["DataFileName"] = DataFileName; 

                MI["IpAddr"] = IpAddr; 

                MI["AdminEmailName"] = AdminEmailName; 

                ManagementBaseObject OutParams = this.DnsClass.InvokeMethod("CreateZone", MI, null); 

                errMessage = "域:" + domain + "创建成功."; 

                return true; 

            } 

            catch (Exception e) 

            { 

                errMessage = e.Message; 

                Console.WriteLine(e.ToString()); 

                return false; 

            } 

        } 



        /// <summary> 

        /// 修改区域 

        /// </summary> 

        /// <param name="domain">要修改的区域名称</param> 

        /// <param name="ZoneType">Type of zone. Valid values are the following:0 Primary zone. 1 Secondary zone.  2 Stub zone. 3 Zone forwarder. </param> 

        /// <param name="DataFileName">[in, optional] Name of the data file associated with the zone</param> 

        /// <param name="IpAddr">[in, optional] IP address of the mater DNS Server for the zone. </param> 

        /// <param name="AdminEmailName">[in, optional] Email address of the administrator responsible for the zone</param> 

        /// <returns></returns> 

        public bool ChangeZoneType(string domain, uint ZoneType, string DataFileName, string[] IpAddr, string AdminEmailName) 

        { 

            try 

            { 

                Q = QueryDNS("Select * From MicrosoftDNS_ZONE where ContainerName='" + domain + "'", "MicrosoftDNS_Zone"); 

                foreach (ManagementObject oManObject in Q) 

                { 

                    MI = oManObject.GetMethodParameters("ChangeZoneType"); 

                    MI["ZoneType"] = ZoneType; 

                    MI["DataFileName"] = DataFileName; 

                    MI["IpAddr"] = IpAddr; 

                    MI["AdminEmailName"] = AdminEmailName; 

                    oManObject.InvokeMethod("ChangeZoneType", MI, null); 

                    errMessage = "域:" + domain + "修改成功."; 

                    return true; 

                } 

                errMessage = "未找到域:"+domain; 

                return false; 

            } 

            catch (Exception e) 

            { 

                errMessage = e.Message; 

                Console.WriteLine(e.ToString()); 

                return false; 

            } 

        } 

        /// <summary> 

        /// 删除区域 

        /// </summary> 

        /// <param name="domain">要册除的区域的名称</param> 

        /// <returns></returns> 

        public bool DelZone(string domain) 

        { 

            try 

            { 

                Q = QueryDNS("Select * From MicrosoftDNS_ZONE where ContainerName='" + domain + "'", "MicrosoftDNS_Zone"); 

                foreach (ManagementObject oManObject in Q) 

                { 

                    oManObject.Delete(); 

                    errMessage = "域:" + domain + "删除成功."; 

                    return true; 

                } 

                errMessage = "未找到域:" + domain; 

                return false; 

            } 

            catch (Exception e) 

            { 

                errMessage = e.Message; 

                Console.WriteLine(e.ToString()); 

                return false; 

            } 

        } 

        /// <summary> 

        /// 判断在某MicrosoftDNS_AType是否在指定的域中存在 

        /// </summary> 

        /// <param name="domain"></param> 

        /// <param name="OwnerName"></param> 

        /// <returns></returns> 

        public bool IsExistsAType(string domain, string OwnerName) 

        { 

            try 

            { 

                Q = QueryDNS("Select * From MicrosoftDNS_AType where OwnerName='" + OwnerName + "' and ContainerName='" + domain + "'"); 

                foreach (ManagementObject oManObject in Q) 

                { 

                    //Console.WriteLine(oManObject["OwnerName"].ToString()); 

                    return true; 

                } 

                return false; 

            } 

            catch (Exception e) 

            { 

                errMessage = e.Message; 

                Console.WriteLine(e.ToString()); 

                return false; 

            } 

        } 



        /// <summary> 

        /// 创建MicrosoftDNS_AType  

        /// </summary> 

        /// <param name="ContainerName">Name of the Container for the Zone, Cache, or RootHints instance which contains this RR</param> 

        /// <param name="HostName">主机名 [如果为空或NULL,主机名将与域名保持一致.]</param> 

        /// <param name="TTL">Time, in seconds, that the RR can be cached by a DNS resolver</param> 

        /// <param name="IPAddress">String representing the IPv4 address of the host</param> 

        /// <returns></returns> 

        public bool CreateAType(string ContainerName, string HostName, string IPAddress,string TTL) 

        { 

            try 

            { 

                string OwnerName = null; 

                if (string.IsNullOrEmpty(HostName)) 

                { 

                    OwnerName = ContainerName; 

                } 

                else 

                { 

                    OwnerName = HostName + "." + ContainerName; 

                } 

                this.Create("MicrosoftDNS_AType"); 

                //如果区域不存在 

                if (!IsExistsZone(ContainerName)) 

                { 

                    Console.WriteLine("区域:{0}不存在,创建失败", ContainerName); 

                    errMessage = string.Format("区域:{0}不存在,创建失败", ContainerName); 

                    return false; 

                } 

                if (IsExistsAType(ContainerName, OwnerName)) 

                { 

                    Console.WriteLine("{0}中已存在{1},创建失败", ContainerName, OwnerName); 

                    errMessage = string.Format("{0}中已存在{1},创建失败", ContainerName, OwnerName); 

                    return false; 

                } 

                MI = DnsClass.GetMethodParameters("CreateInstanceFromPropertyData"); 

                MI["DnsServerName"] = "localhost"; 

                MI["ContainerName"] = ContainerName; 

                MI["OwnerName"] = OwnerName; 

                MI["IPAddress"] = IPAddress; 

                if (string.IsNullOrEmpty(TTL)) 

                { 

                    TTL = "3600"; 

                } 

                MI["TTL"] =TTL; 

                DnsClass.InvokeMethod("CreateInstanceFromPropertyData", MI, null); 

                errMessage = "A记录:" + OwnerName + "创建成功."; 

                return true; 

            } 

            catch (Exception e) 

            { 

                errMessage = e.Message; 

                Console.WriteLine(e.ToString()); 

                return false; 

            } 

        } 



        /// <summary> 

        /// 创建MicrosoftDNS_AType  

        /// </summary> 

        /// <param name="DnsServerName">FQDN or IP address of the DNS Server that contains this RR</param> 

        /// <param name="ContainerName">Name of the Container for the Zone, Cache, or RootHints instance which contains this RR</param> 

        /// <param name="HostName">主机名 [如果为空或NULL,主机名将与域名保持一致.]</param> 

        /// <param name="RecordClass">Class of the RR. Default value is 1. The following values are valid.1 IN (Internet) 2 CS (CSNET)  3 CH (CHAOS) 4 HS (Hesiod) </param> 

        /// <param name="TTL">Time, in seconds, that the RR can be cached by a DNS resolver</param> 

        /// <param name="IPAddress">String representing the IPv4 address of the host</param> 

        /// <returns></returns> 

        public bool CreateAType(string DnsServerName, string ContainerName, string HostName, uint RecordClass, uint TTL, string IPAddress) 

        { 

            try 

            { 

                string OwnerName = null; 

                if (string.IsNullOrEmpty(HostName)) 

                { 

                    OwnerName = ContainerName; 

                } 

                else 

                { 

                    OwnerName = HostName + "." + ContainerName; 

                } 

                this.Create("MicrosoftDNS_AType"); 

                //如果区域不存在 

                if (!IsExistsZone(ContainerName)) 

                { 

                    Console.WriteLine("区域:{0}不存在,创建失败", ContainerName); 

                    errMessage = string.Format("区域:{0}不存在,创建失败", ContainerName); 

                    return false; 

                } 

                if (IsExistsAType(ContainerName, OwnerName)) 

                { 

                    Console.WriteLine("{0}中已存在{1},创建失败", ContainerName, OwnerName); 

                    errMessage=string.Format("{0}中已存在{1},创建失败", ContainerName, OwnerName); 

                    return false; 

                } 

                MI = DnsClass.GetMethodParameters("CreateInstanceFromPropertyData"); 

                MI["DnsServerName"] = DnsServerName; 

                MI["ContainerName"] = ContainerName; 

                MI["OwnerName"] = OwnerName; 

                MI["RecordClass"] = RecordClass; 

                MI["TTL"] = TTL; 

                MI["IPAddress"] = IPAddress; 

                DnsClass.InvokeMethod("CreateInstanceFromPropertyData", MI, null); 

                errMessage = "A记录:" + OwnerName + "创建成功."; 

                return true; 

            } 

            catch (Exception e) 

            { 

                errMessage = e.Message; 

                Console.WriteLine(e.ToString()); 

                return false; 

            } 

        } 



        /// <summary> 

        /// 修改MicrosoftDNS_AType  

        /// </summary> 

        /// <param name="ContainerName">Name of the Container for the Zone, Cache, or RootHints instance which contains this RR</param> 

        /// <param name="HostName">主机名 [如果为空或NULL,主机名将与域名保持一致.]</param> 

        /// <param name="TTL">Time, in seconds, that the RR can be cached by a DNS resolver</param> 

        /// <param name="IPAddress"></param> 

        /// <returns></returns> 

        public bool ModifyAType(string ContainerName, string HostName, string IPAddress,string TTL) 

        { 

            try 

            { 

                string OwnerName = null; 

                if (string.IsNullOrEmpty(HostName)) 

                { 

                    OwnerName = ContainerName; 

                } 

                else 

                { 

                    OwnerName = HostName + "." + ContainerName; 

                } 

                //如果区域不存在 

                if (!IsExistsZone(ContainerName)) 

                { 

                    Console.WriteLine("区域:{0}不存在,修改失败", ContainerName); 

                    errMessage = string.Format("区域:{0}不存在,修改失败", ContainerName); 

                    return false; 

                } 

                if (!IsExistsAType(ContainerName, OwnerName)) 

                { 

                    Console.WriteLine("{0}中不存在{1},修改失败", ContainerName, OwnerName); 

                    errMessage = string.Format("{0}中不存在{1},修改失败", ContainerName, OwnerName); 

                    return false; 

                } 



                Q = QueryDNS("Select * From MicrosoftDNS_AType where ContainerName='" + ContainerName + "' and OwnerName='" + OwnerName + "'", "MicrosoftDNS_AType"); 

                foreach (ManagementObject oManObject in Q) 

                { 

                    //foreach (PropertyData p in oManObject.Properties) 

                    //{ 

                    //    try 

                    //    { Console.WriteLine(p.Name+"="+oManObject[p.Name]); } 

                    //    catch 

                    //    { } 

                    //} 

                    if (oManObject["IPAddress"].ToString() == IPAddress) 

                    { 

                        errMessage = "A记录:" + OwnerName + "修改失败,必须修改IP地址."; 

                        return false; 

                    } 

                    MI = oManObject.GetMethodParameters("Modify"); 

                    MI["IPAddress"] = IPAddress; 

                    MI["TTL"] = TTL; 

                    oManObject.InvokeMethod("Modify", MI, null); 

                    errMessage = "A记录:" + OwnerName + "修改成功."; 

                    return true; 

                } 

                errMessage = string.Format("{0}中不存在{1},修改失败", ContainerName, OwnerName); 

                return false; 

            } 

            catch (Exception e) 

            { 

                errMessage = e.Message; 

                Console.WriteLine(e.ToString()); 

                return false; 

            } 

        } 





        /// <summary> 

        /// 删除MicrosoftDNS_AType 

        /// </summary> 

        /// <param name="ContainerName">Name of the Container for the Zone, Cache, or RootHints instance which contains this RR</param> 

        /// <param name="HostName">主机名 [如果为空或NULL,主机名将与域名保持一致.]</param> 

        /// <returns></returns> 

        public bool DelAType(string ContainerName, string HostName) 

        { 

            try 

            { 

                string OwnerName = null; 

                if (string.IsNullOrEmpty(HostName)) 

                { 

                    OwnerName = ContainerName; 

                } 

                else 

                { 

                    OwnerName = HostName + "." + ContainerName; 

                } 

                //如果区域不存在 

                if (!IsExistsZone(ContainerName)) 

                { 

                    Console.WriteLine("区域:{0}不存在,删除失败", ContainerName); 

                    errMessage = string.Format("区域:{0}不存在,删除失败", ContainerName); 

                    return false; 

                } 

                if (!IsExistsAType(ContainerName, OwnerName)) 

                { 

                    Console.WriteLine("{0}中不存在{1},删除失败", ContainerName, OwnerName); 

                    errMessage = string.Format("{0}中不存在{1},删除失败", ContainerName, OwnerName); 

                    return false; 

                } 

                Q = QueryDNS("Select * From MicrosoftDNS_AType where ContainerName='" + ContainerName + "' and OwnerName='" + OwnerName + "'", "MicrosoftDNS_AType"); 

                foreach (ManagementObject oManObject in Q) 

                { 

                    oManObject.Delete(); 

                    errMessage = "A记录:" + OwnerName + "删除成功."; 

                    return true; 

                } 

                errMessage = string.Format("{0}中不存在{1},删除失败", ContainerName, OwnerName); 

                return false; 

            } 

            catch (Exception e) 

            { 

                errMessage = e.Message; 

                Console.WriteLine(e.ToString()); 

                return false; 

            } 

        } 



        /// <summary> 

        /// 列出某域名下的所有A记录. 

        /// </summary> 

        /// <param name="ContainerName">Name of the Container for the Zone, Cache, or RootHints instance which contains this RR</param> 

        /// <returns></returns> 

        public DataTable ListExistsAType(string ContainerName) 

        { 

            Yaosansi.IO.Log log = new Yaosansi.IO.Log(); 

            log.WirteLogTime(); 

            log.WirteLog(ContainerName); 

            DataTable table = new DataTable("MicrosoftDNS_AType" + ContainerName); 

            table.Columns.Add("主机名 (A)"); 

            table.Columns.Add("IP 地址"); 

            table.Columns.Add("TTL"); 

            try 

            { 

                Q = QueryDNS("Select * From MicrosoftDNS_AType where ContainerName='" + ContainerName + "'"); 

                foreach (ManagementObject oManObject in Q) 

                { 

                    try 

                    { 

                        DataRow row = table.NewRow(); 

                        row["主机名 (A)"] = oManObject["OwnerName"]; 

                        row["IP 地址"] = oManObject["IPAddress"]; 

                        row["TTL"] = oManObject["TTL"]; 

                        table.Rows.Add(row); 

                    } 

                    catch (Exception e) { log.WirteLog(e.ToString()); } 

                } 

            } 

            catch (Exception e) 

            { 

                errMessage = e.Message; 

                Console.WriteLine(e.ToString()); 

                log.WirteLog(e.ToString()); 

            } 

            Yaosansi.Data.DataHelp.PrintTableLog(table); 

            return table; 

        } 



        /// <summary> 

        /// 列出某域名下的所有MX记录. 

        /// </summary> 

        /// <param name="ContainerName">Name of the Container for the Zone, Cache, or RootHints instance which contains this RR</param> 

        /// <returns></returns> 

        public DataTable ListExistsMXType(string ContainerName) 

        { 

            DataTable table = new DataTable("MicrosoftDNS_MXType" + ContainerName); 

            table.Columns.Add("邮件交换记录 (MX)"); 

            table.Columns.Add("目标主机"); 

            table.Columns.Add("优先级"); 

            table.Columns.Add("TTL"); 

            try 

            { 

                Q = QueryDNS("Select * From MicrosoftDNS_MXType where ContainerName='" + ContainerName + "'"); 

                foreach (ManagementObject oManObject in Q) 

                { 

                    try 

                    { 

                        DataRow row = table.NewRow(); 

                        row["目标主机"] = oManObject["MailExchange"]; 

                        row["邮件交换记录 (MX)"] = oManObject["OwnerName"]; 

                        row["优先级"] = oManObject["Preference"]; 

                        row["TTL"] = oManObject["TTL"]; 

                        table.Rows.Add(row); 

                    } 

                    catch { } 

                } 

            } 

            catch (Exception e) 

            { 

                errMessage = e.Message; 

                Console.WriteLine(e.ToString()); 

            } 

            return table; 

        } 



        /// <summary> 

        /// 列出某域名下的所有别名. 

        /// </summary> 

        /// <param name="ContainerName">Name of the Container for the Zone, Cache, or RootHints instance which contains this RR</param> 

        /// <returns></returns> 

        public DataTable ListExistsCNAMEType(string ContainerName) 

        { 

            DataTable table = new DataTable("MicrosoftDNS_CNAMEType" + ContainerName); 

            table.Columns.Add("别名 (CNAME)"); 

            table.Columns.Add("别名主机"); 

            table.Columns.Add("TTL"); 

            try 

            { 

                Q = QueryDNS("Select * From MicrosoftDNS_CNAMEType where ContainerName='" + ContainerName + "'"); 

                foreach (ManagementObject oManObject in Q) 

                { 

                    try 

                    { 

                        DataRow row = table.NewRow(); 

                        row["别名 (CNAME)"] = oManObject["OwnerName"]; 

                        row["别名主机"] = oManObject["PrimaryName"]; 

                        row["TTL"] = oManObject["TTL"]; 

                        table.Rows.Add(row); 

                    } 

                    catch { } 

                } 

            } 

            catch (Exception e) 

            { 

                errMessage = e.Message; 

                Console.WriteLine(e.ToString()); 

            } 

            return table; 

        } 



        /// <summary> 

        /// 判断在某MicrosoftDNS_MXType是否在指定的域中存在 

        /// </summary> 

        /// <param name="ContainerName">主域名 主域 Name of the Container for the Zone, Cache, or RootHints instance that contains this RR.</param> 

        /// <param name="OwnerName">Owner name for the RR. </param> 

        /// <returns></returns> 

        public bool IsExistsMXType(string ContainerName, string OwnerName) 

        {            

            try 

            { 

                Q = QueryDNS("Select * From MicrosoftDNS_MXType Where ContainerName='" + ContainerName + "' and OwnerName='" + OwnerName + "'"); 

                foreach (ManagementObject oManObject in Q) 

                { 

                  //  Console.WriteLine(oManObject["MailExchange"].ToString()); 

                    return true; 

                } 

                return false; 

            } 

            catch (Exception e) 

            { 

                errMessage = e.Message; 

                Console.WriteLine(e.ToString()); 

                return false; 

            } 

        } 

        /// <summary> 

        /// 创建MicrosoftDNS_MXType记录(邮件交换记录) 

        /// </summary> 

        /// <param name="HostName">主机名 [如果为空或NULL,主机名将与域名保持一致.]</param> 

        /// <param name="ContainerName">主域 Name of the Container for the Zone, Cache, or RootHints instance that contains this RR.</param> 

        /// <param name="MailExchange">目标主机 FQDN specifying a host willing to act as a mail exchange for the owner name</param> 

        /// <param name="Preference">优先级 Preference given to this RR among others at the same owner. Lower values are preferred</param> 

        /// <param name="TTL">Time, in seconds, that the RR can be cached by a DNS resolver</param> 

        /// <returns></returns> 

        public bool CreateMXType(string HostName, string ContainerName,string MailExchange, string Preference, string TTL) 

        { 

            try 

            { 

                string OwnerName = null; 

                if (string.IsNullOrEmpty(HostName)) 

                { 

                    OwnerName = ContainerName; 

                } 

                else 

                { 

                    OwnerName = HostName + "." + ContainerName; 

                } 

                this.Create("MicrosoftDNS_MXType"); 

                //如果区域不存在 

                if (!IsExistsZone(ContainerName)) 

                { 

                    Console.WriteLine("区域:{0}不存在,创建失败", ContainerName); 

                    errMessage = string.Format("区域:{0}不存在,创建失败", ContainerName); 

                    return false; 

                } 

                if (IsExistsMXType(ContainerName,OwnerName)) 

                { 

                    Console.WriteLine("{0}中已存在{1},创建失败", ContainerName,OwnerName ); 

                    errMessage = string.Format("{0}中已存在{1},创建失败", ContainerName, OwnerName); 

                    return false; 

                } 

                MI = DnsClass.GetMethodParameters("CreateInstanceFromPropertyData"); 

                MI["DnsServerName"] = "localhost"; 

                MI["ContainerName"] = ContainerName; 

                // MI["RecordClass"] = 1;  //Default value is 1.  //1 IN (Internet)  //2 CS (CSNET)   //3 CH (CHAOS)   //4 HS (Hesiod)  

                MI["MailExchange"] = MailExchange; 

                MI["OwnerName"] = OwnerName; 

                MI["Preference"] = Preference; 

                if (string.IsNullOrEmpty(TTL)) 

                { 

                    TTL = "3600"; 

                } 

                MI["TTL"] = TTL; 

                DnsClass.InvokeMethod("CreateInstanceFromPropertyData", MI, null); 

                errMessage = "MX记录:" + OwnerName + "创建成功."; 

                return true; 

            } 

            catch (Exception e) 

            { 

                errMessage = e.Message; 

                Console.WriteLine(e.ToString()); 

                return false; 

            } 

        } 

        /// <summary> 

        /// 修改MicrosoftDNS_MXType记录(修改邮件交换记录) 

        /// </summary> 

        /// <param name="HostName">主机名 [如果为空或NULL,主机名将与域名保持一致.]</param> 

        /// <param name="ContainerName">主域名 主域 Name of the Container for the Zone, Cache, or RootHints instance that contains this RR.</param> 

        /// <param name="TTL">[in, optional] Time, in seconds, that the RR can be cached by a DNS resolver. </param> 

        /// <param name="MailExchange">[in, optional] FQDN specifying a host willing to act as a mail exchange for the owner name. </param> 

        /// <param name="Preference">邮件优先级 [in, optional] Preference given to this RR among others at the same owner. Lower values are preferred. </param> 

        /// <returns></returns> 

        public bool ModifyMXType(string HostName, string ContainerName, string TTL, string MailExchange,string Preference) 

        { 

            try 

            { 

                string OwnerName = null; 

                if (string.IsNullOrEmpty(HostName)) 

                { 

                    OwnerName = ContainerName; 

                } 

                else 

                { 

                    OwnerName = HostName + "." + ContainerName; 

                } 

                this.Create("MicrosoftDNS_MXType"); 

                //如果区域不存在 

                if (!IsExistsZone(ContainerName)) 

                { 

                    Console.WriteLine("区域:{0}不存在,修改失败", ContainerName); 

                    errMessage = string.Format("区域:{0}不存在,修改失败", ContainerName); 

                    return false; 

                } 

                if (!IsExistsMXType(ContainerName, OwnerName)) 

                { 

                    Console.WriteLine("{0}中不存在{1},修改失败", ContainerName, OwnerName); 

                    errMessage = string.Format("{0}中不存在{1},修改失败", ContainerName, OwnerName); 

                    return false; 

                } 

                Q = QueryDNS("Select * From MicrosoftDNS_MXType Where ContainerName='" + ContainerName + "' and OwnerName='" + OwnerName + "'");  

                foreach (ManagementObject oManObject in Q) 

                { 

                    MI = oManObject.GetMethodParameters("Modify"); 

                    if (string.IsNullOrEmpty(TTL)) 

                    { 

                        TTL = "3600"; 

                    } 

                    if (ClearEndDot(oManObject["MailExchange"].ToString()) == ClearEndDot(MailExchange) && oManObject["Preference"].ToString() == Preference) 

                    { 

                        errMessage = "MX记录:" + OwnerName + "修改失败,必须修改目标主机或邮件优先级."; 

                        return false; 

                    } 

                    MI["TTL"] = TTL; 

                    MI["MailExchange"] = MailExchange; 

                    MI["Preference"] = Preference; 

                    oManObject.InvokeMethod("Modify", MI, null); 

                    errMessage = "MX记录:" + OwnerName + "修改成功."; 

                    return true; 

                } 

                return false; 

            } 

            catch (Exception e) 

            { 

                errMessage = e.Message; 

                Console.WriteLine(e.ToString()); 

                return false; 

            } 

        } 



        /// <summary> 

        /// 删除MicrosoftDNS_MXType 

        /// </summary> 

        /// <param name="HostName">主机名 [如果为空或NULL,主机名将与域名保持一致.]</param> 

        /// <param name="ContainerName">主域名 主域 Name of the Container for the Zone, Cache, or RootHints instance that contains this RR.</param> 

        /// <returns></returns> 

        public bool DelMXType(string HostName, string ContainerName) 

        { 

            try 

            {  

                string OwnerName = null; 

                if (string.IsNullOrEmpty(HostName)) 

                { 

                    OwnerName = ContainerName; 

                } 

                else 

                { 

                    OwnerName = HostName + "." + ContainerName; 

                } 

                this.Create("MicrosoftDNS_MXType"); 

                //如果区域不存在 

                if (!IsExistsZone(ContainerName)) 

                { 

                    Console.WriteLine("区域:{0}不存在,删除失败", ContainerName); 

                    errMessage = string.Format("区域:{0}不存在,删除失败", ContainerName); 

                    return false; 

                } 

                if (!IsExistsMXType(ContainerName, OwnerName)) 

                { 

                    Console.WriteLine("{0}中不存在{1},删除失败", ContainerName, OwnerName); 

                    errMessage = string.Format("{0}中不存在{1},删除失败", ContainerName, OwnerName); 

                    return false; 

                } 

                Q = QueryDNS("Select * From MicrosoftDNS_MXType Where ContainerName='" + ContainerName + "' and OwnerName='" + OwnerName + "'"); 

                foreach (ManagementObject oManObject in Q) 

                { 

                    oManObject.Delete(); 

                    errMessage = "MX记录:" + OwnerName + "删除成功."; 

                    return true; 

                } 

                return false; 

            } 

            catch (Exception e) 

            { 

                errMessage = e.Message; 

                Console.WriteLine(e.ToString()); 

                return false; 

            } 

        } 



        /// <summary> 

        /// 判断在某MicrosoftDNS_CNAMEType是否在指定的域中存在 

        /// </summary> 

        /// <param name="ContainerName">主域名 主域 Name of the Container for the Zone, Cache, or RootHints instance that contains this RR.</param> 

        /// <param name="OwnerName">Owner name for the RR. </param> 

        /// <returns></returns> 

        public bool IsExistsCNAMEType(string ContainerName, string OwnerName) 

        { 

            try 

            { 

                Q = QueryDNS("Select * From MicrosoftDNS_CNAMEType Where ContainerName='" + ContainerName + "' and OwnerName='" + OwnerName + "'"); 

                foreach (ManagementObject oManObject in Q) 

                { 

                    //  Console.WriteLine(oManObject["MailExchange"].ToString()); 

                    return true; 

                } 

                return false; 

            } 

            catch (Exception e) 

            { 

                errMessage = e.Message; 

                Console.WriteLine(e.ToString()); 

                return false; 

            } 

        } 

        /// <summary> 

        /// 创建MicrosoftDNS_CNAMEType记录(别名) 

        /// </summary> 

        /// <param name="HostName">主机名 [如果为空或NULL,主机名将与域名保持一致.]</param> 

        /// <param name="ContainerName">主域 Name of the Container for the Zone, Cache, or RootHints instance that contains this RR.</param> 

        /// <param name="PrimaryName">in] Primary name of the CNAME RR</param> 

        /// <param name="TTL">Time, in seconds, that the RR can be cached by a DNS resolver</param> 

        /// <returns></returns> 

        public bool CreateCNAMEType(string HostName, string ContainerName, string PrimaryName,  string TTL) 

        { 

            try 

            { 

                string OwnerName = null; 

                if (string.IsNullOrEmpty(HostName)) 

                { 

                    OwnerName = ContainerName; 

                } 

                else 

                { 

                    OwnerName = HostName + "." + ContainerName; 

                } 

                this.Create("MicrosoftDNS_CNAMEType"); 

                //如果区域不存在 

                if (!IsExistsZone(ContainerName)) 

                { 

                    Console.WriteLine("区域:{0}不存在,创建失败", ContainerName); 

                    errMessage = string.Format("区域:{0}不存在,创建失败", ContainerName); 

                    return false; 

                } 

                if (IsExistsCNAMEType(ContainerName, OwnerName)) 

                { 

                    Console.WriteLine("{0}中已存在{1},创建失败", ContainerName, OwnerName); 

                    errMessage = string.Format("{0}中已存在{1},创建失败", ContainerName, OwnerName); 

                    return false; 

                } 

                MI = DnsClass.GetMethodParameters("CreateInstanceFromPropertyData"); 

                MI["DnsServerName"] = "localhost"; 

                MI["ContainerName"] = ContainerName; 

                // MI["RecordClass"] = 1;  //Default value is 1.  //1 IN (Internet)  //2 CS (CSNET)   //3 CH (CHAOS)   //4 HS (Hesiod)  

                MI["PrimaryName"] = PrimaryName; 

                MI["OwnerName"] = OwnerName; 

                if (string.IsNullOrEmpty(TTL)) 

                { 

                    TTL = "3600"; 

                } 

                MI["TTL"] = TTL; 

                DnsClass.InvokeMethod("CreateInstanceFromPropertyData", MI, null); 

                errMessage = "CNAME:" + OwnerName + "创建成功."; 

                return true; 

            } 

            catch (Exception e) 

            { 

                errMessage = e.Message; 

                Console.WriteLine(e.ToString()); 

                return false; 

            } 

        } 

        /// <summary> 

        /// 修改MicrosoftDNS_CNAMEType记录(别名) 

        /// </summary> 

        /// <param name="HostName">主机名 [如果为空或NULL,主机名将与域名保持一致.]</param> 

        /// <param name="ContainerName">主域名 主域 Name of the Container for the Zone, Cache, or RootHints instance that contains this RR.</param> 

        /// <param name="TTL">[in, optional] Time, in seconds, that the RR can be cached by a DNS resolver. </param> 

        /// <param name="PrimaryName">in] Primary name of the CNAME RR</param> 

        /// <returns></returns> 

        public bool ModifyCNAMEType(string HostName, string ContainerName, string TTL, string PrimaryName) 

        { 

            try 

            { 

                string OwnerName = null; 

                if (string.IsNullOrEmpty(HostName)) 

                { 

                    OwnerName = ContainerName; 

                } 

                else 

                { 

                    OwnerName = HostName + "." + ContainerName; 

                } 

                this.Create("MicrosoftDNS_CNAMEType"); 

                //如果区域不存在 

                if (!IsExistsZone(ContainerName)) 

                { 

                    Console.WriteLine("区域:{0}不存在,修改失败", ContainerName); 

                    errMessage = string.Format("区域:{0}不存在,修改失败", ContainerName); 

                    return false; 

                } 

                if (!IsExistsCNAMEType(ContainerName, OwnerName)) 

                { 

                    Console.WriteLine("{0}中不存在{1},修改失败", ContainerName, OwnerName); 

                    errMessage = string.Format("{0}中不存在{1},修改失败", ContainerName, OwnerName); 

                    return false; 

                } 

                Q = QueryDNS("Select * From MicrosoftDNS_CNAMEType Where ContainerName='" + ContainerName + "' and OwnerName='" + OwnerName + "'"); 

                foreach (ManagementObject oManObject in Q) 

                { 

                    if (ClearEndDot(oManObject["PrimaryName"].ToString()) == ClearEndDot(PrimaryName)) 

                    { 

                        errMessage = "CName记录:" + OwnerName + "修改失败,必须修改别名主机."; 

                        return false; 

                    } 



                    MI = oManObject.GetMethodParameters("Modify"); 

                    if (string.IsNullOrEmpty(TTL)) 

                    { 

                        TTL = "3600"; 

                    } 

                    MI["TTL"] = TTL; 

                    MI["PrimaryName"] = PrimaryName; 

                    oManObject.InvokeMethod("Modify", MI, null); 

                    errMessage = "CNAME:" + OwnerName + "修改成功."; 

                    return true; 

                } 

                return false; 

            } 

            catch (Exception e) 

            { 

                errMessage = e.Message; 

                Console.WriteLine(e.ToString()); 

                return false; 

            } 

        } 



        /// <summary> 

        /// 删除MicrosoftDNS_CNAMEType 

        /// </summary> 

        /// <param name="HostName">主机名 [如果为空或NULL,主机名将与域名保持一致.]</param> 

        /// <param name="ContainerName">主域名 主域 Name of the Container for the Zone, Cache, or RootHints instance that contains this RR.</param> 

        /// <returns></returns> 

        public bool DelCNAMEType(string HostName, string ContainerName) 

        { 

            try 

            { 

                string OwnerName = null; 

                if (string.IsNullOrEmpty(HostName)) 

                { 

                    OwnerName = ContainerName; 

                } 

                else 

                { 

                    OwnerName = HostName + "." + ContainerName; 

                } 

                this.Create("MicrosoftDNS_CNAMEType"); 

                //如果区域不存在 

                if (!IsExistsZone(ContainerName)) 

                { 

                    Console.WriteLine("区域:{0}不存在,删除失败", ContainerName); 

                    errMessage = string.Format("区域:{0}不存在,删除失败", ContainerName); 

                    return false; 

                } 

                if (!IsExistsCNAMEType(ContainerName, OwnerName)) 

                { 

                    Console.WriteLine("{0}中不存在{1},删除失败", ContainerName, OwnerName); 

                    errMessage = string.Format("{0}中不存在{1},删除失败", ContainerName, OwnerName); 

                    return false; 

                } 

                Q = QueryDNS("Select * From MicrosoftDNS_CNAMEType Where ContainerName='" + ContainerName + "' and OwnerName='" + OwnerName + "'"); 

                foreach (ManagementObject oManObject in Q) 

                { 

                    oManObject.Delete(); 

                    errMessage = "CNAME:" + OwnerName + "删除成功."; 

                    return true; 

                } 

                return false; 

            } 

            catch (Exception e) 

            { 

                errMessage = e.Message; 

                Console.WriteLine(e.ToString()); 

                return false; 

            } 

        } 



        /// <summary> 

        /// 去除以.结尾的字符串的. 

        /// </summary> 

        /// <param name="str"></param> 

        /// <returns></returns> 

        private string ClearEndDot(string str) 

        { 

            string returnStr = str; 

            if (!string.IsNullOrEmpty(str)) 

            { 

                int l = str.LastIndexOf("."); 

                if (l != -1 && l == str.Length - 1) 

                { 

                    returnStr = str.Substring(0, str.Length - 1); 

                } 

            } 

            return returnStr; 

        } 

    } 

} 

本文来自: 脚本之家(www.jb51.net) 详细出处参考:http://www.jb51.net/article/8045.htm
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值