您的位置:首页 > 编程语言 > C#

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

2008-06-15 22:04 441 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: