程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#利用WMI操作DNS服務器(可遠程操作,需要相應權限)

C#利用WMI操作DNS服務器(可遠程操作,需要相應權限)

編輯:關於C語言
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; 
        } 

    } 
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved