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.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();
}
}
}
MYDNS类:
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;
}
}
}
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;
}
}
}