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